diff --git a/core/odin/printer/printer.odin b/core/odin/printer/printer.odin index d783bfb48..691369421 100644 --- a/core/odin/printer/printer.odin +++ b/core/odin/printer/printer.odin @@ -26,14 +26,19 @@ Printer :: struct { config: Config, depth: int, //the identation depth comments: [dynamic]^ast.Comment_Group, + latest_comment_index: int, allocator: mem.Allocator, file: ^ast.File, source_position: tokenizer.Pos, + last_source_position: tokenizer.Pos, lines: map [int]^Line, skip_semicolon: bool, current_line: ^Line, current_line_index: int, + last_line_index: int, last_token: ^Format_Token, + merge_next_token: bool, + debug: bool, } Config :: struct { @@ -86,13 +91,16 @@ make_printer :: proc(config: Config, allocator := context.allocator) -> Printer return { config = config, allocator = allocator, + debug = false, }; } print :: proc(p: ^Printer, file: ^ast.File) -> string { + p.comments = file.comments; + for decl in file.decls { - visit_stmt(p, decl); + visit_decl(p, cast(^ast.Decl)decl); } fix_lines(p); @@ -102,7 +110,7 @@ print :: proc(p: ^Printer, file: ^ast.File) -> string { last_line := 0; for key, value in p.lines { - diff_line := min(key - last_line, p.config.newline_limit); + diff_line := key - last_line; for i := 0; i < diff_line; i += 1 { strings.write_byte(&builder, '\n'); @@ -112,6 +120,10 @@ print :: proc(p: ^Printer, file: ^ast.File) -> string { strings.write_byte(&builder, ' '); } + if p.debug { + strings.write_string(&builder, fmt.tprintf("line %v: ", key)); + } + for format_token in value.format_tokens { for i := 0; i < format_token.spaces_before; i += 1 { diff --git a/core/odin/printer/visit.odin b/core/odin/printer/visit.odin index 12f7da301..dcacef825 100644 --- a/core/odin/printer/visit.odin +++ b/core/odin/printer/visit.odin @@ -8,21 +8,104 @@ import "core:fmt" import "core:unicode/utf8" import "core:mem" - + @(private) -append_format_token :: proc(p: ^Printer, unwrapped_line: ^Line, format_token: Format_Token) -> ^Format_Token { +comment_before_position :: proc(p: ^Printer, pos: tokenizer.Pos) -> bool { + + if len(p.comments) <= p.latest_comment_index { + return false; + } + + comment := p.comments[p.latest_comment_index]; + + return comment.pos.offset < pos.offset; +} + +@(private) +next_comment_group :: proc(p: ^Printer) { + p.latest_comment_index += 1; +} + +@(private) +write_comment :: proc(p: ^Printer, comment: tokenizer.Token) { + + if len(comment.text) == 0 { + return; + } + + if comment.text[0] == '/' && comment.text[1] == '/' { + format_token := Format_Token { + spaces_before = 1, + kind = .Comment, + text = comment.text, + }; + + if len(p.current_line.format_tokens) == 0 { + format_token.spaces_before = 0; + } + + append(&p.current_line.format_tokens, format_token); + p.last_token = &p.current_line.format_tokens[len(p.current_line.format_tokens)-1]; + } +} + +@(private) +write_comments :: proc(p: ^Printer, pos: tokenizer.Pos, format_token: Format_Token) { + + prev_comment: ^tokenizer.Token; + + for comment_before_position(p, pos) { + + comment_group := p.comments[p.latest_comment_index]; + lines := comment_group.pos.line - p.last_source_position.line; + + set_line(p, p.last_line_index + min(p.config.newline_limit, lines)); + + for comment, i in comment_group.list { + + if prev_comment != nil && p.last_source_position.line != comment.pos.line { + newline_position(p, comment.pos.line - prev_comment.pos.line); + } + + write_comment(p, comment); + + prev_comment = &comment_group.list[i]; + } + + next_comment_group(p); + } + + if prev_comment != nil { + newline_position(p, min(p.config.newline_limit, p.source_position.line - prev_comment.pos.line)); + } +} + +@(private) +append_format_token :: proc(p: ^Printer, format_token: Format_Token) -> ^Format_Token { format_token := format_token; - if p.last_token != nil && (p.last_token.kind == .Ellipsis || p.last_token.kind == .Range_Half || + if p.last_token != nil && (p.last_token.kind == .Ellipsis || p.last_token.kind == .Range_Half || p.last_token.kind == .Open_Paren || p.last_token.kind == .Period || - p.last_token.kind == .Open_Brace) { + p.last_token.kind == .Open_Brace || p.last_token.kind == .Open_Bracket) { format_token.spaces_before = 0; + } else if p.merge_next_token { + format_token.spaces_before = 0; + p.merge_next_token = false; } + write_comments(p, p.source_position, format_token); + + unwrapped_line := p.current_line; + unwrapped_line.used = true; + unwrapped_line.depth = p.depth; + if len(unwrapped_line.format_tokens) == 0 && format_token.spaces_before == 1 { format_token.spaces_before = 0; } + + p.last_source_position = p.source_position; + p.last_line_index = p.current_line_index; append(&unwrapped_line.format_tokens, format_token); return &unwrapped_line.format_tokens[len(unwrapped_line.format_tokens)-1]; @@ -31,10 +114,6 @@ append_format_token :: proc(p: ^Printer, unwrapped_line: ^Line, format_token: Fo @(private) push_generic_token :: proc(p: ^Printer, kind: tokenizer.Token_Kind, spaces_before: int, value := "") { - unwrapped_line := p.current_line; - unwrapped_line.used = true; - unwrapped_line.depth = p.depth; - format_token := Format_Token { spaces_before = spaces_before, kind = kind, @@ -45,38 +124,31 @@ push_generic_token :: proc(p: ^Printer, kind: tokenizer.Token_Kind, spaces_befor format_token.text = value; } - p.last_token = append_format_token(p, unwrapped_line, format_token); + p.last_token = append_format_token(p, format_token); } @(private) push_string_token :: proc(p: ^Printer, text: string, spaces_before: int) { - unwrapped_line := p.current_line; - unwrapped_line.used = true; - unwrapped_line.depth = p.depth; - + format_token := Format_Token { spaces_before = spaces_before, kind = .String, text = text, }; - p.last_token = append_format_token(p, unwrapped_line, format_token); + p.last_token = append_format_token(p, format_token); } @(private) push_ident_token :: proc(p: ^Printer, text: string, spaces_before: int) { - unwrapped_line := p.current_line; - unwrapped_line.used = true; - unwrapped_line.depth = p.depth; - format_token := Format_Token { spaces_before = spaces_before, kind = .Ident, text = text, }; - p.last_token = append_format_token(p, unwrapped_line, format_token); + p.last_token = append_format_token(p, format_token); } @(private) @@ -112,12 +184,13 @@ set_line :: proc(p: ^Printer, line: int) -> ^Line { } p.current_line = unwrapped_line; + p.current_line_index = line; return unwrapped_line; } @(private) -newline_source_position :: proc(p: ^Printer, count: int) { +newline_position :: proc(p: ^Printer, count: int) { p.current_line_index += count; set_line(p, p.current_line_index); } @@ -132,6 +205,10 @@ unindent :: proc(p: ^Printer) { p.depth -= 1; } +merge_next_token :: proc(p: ^Printer) { + p.merge_next_token = true; +} + @(private) visit_decl :: proc(p: ^Printer, decl: ^ast.Decl, called_in_stmt := false) { @@ -231,7 +308,7 @@ visit_decl :: proc(p: ^Printer, decl: ^ast.Decl, called_in_stmt := false) { } else if v.is_mutable && v.type == nil && len(v.values) != 0 { push_generic_token(p, .Eq, 0); } else if !v.is_mutable && v.type != nil { - push_generic_token(p, .Semicolon, 0); + push_generic_token(p, .Colon, 0); } visit_exprs(p, v.values, true); @@ -240,7 +317,7 @@ visit_decl :: proc(p: ^Printer, decl: ^ast.Decl, called_in_stmt := false) { for value in v.values { switch a in value.derived { - case Proc_Lit,Union_Type,Enum_Type,Struct_Type: + case Proc_Lit, Union_Type, Enum_Type, Struct_Type: add_semicolon = false || called_in_stmt; } } @@ -268,17 +345,32 @@ visit_exprs :: proc(p: ^Printer, list: []^ast.Expr, add_comma := false, trailing visit_expr(p, expr); - if i != len(list) - 1 && add_comma { + if (i != len(list) - 1 || trailing) && add_comma { push_generic_token(p, .Comma, 0); - } else if trailing && add_comma { - //print(p, strings.trim_space(sep)); - } + } } } @(private) visit_attributes :: proc(p: ^Printer, attributes: [dynamic]^ast.Attribute) { + if len(attributes) == 0 { + return; + } + + for attribute, i in attributes { + + push_generic_token(p, .At, 0); + push_generic_token(p, .Open_Paren, 0); + + visit_exprs(p, attribute.elems, true); + + push_generic_token(p, .Close_Paren, 0); + + if len(attributes) - 1 != i { + newline_position(p, 1); + } + } } @(private) @@ -390,7 +482,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener visit_stmt(p, v.body, .If_Stmt, true); } else { if uses_do { - newline_source_position(p, 1); + newline_position(p, 1); } visit_stmt(p, v.body, .If_Stmt); @@ -399,7 +491,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener if v.else_stmt != nil { if p.config.brace_style == .Allman || p.config.brace_style == .Stroustrup { - newline_source_position(p, 1); + newline_position(p, 1); } push_generic_token(p, .Else, 1); @@ -498,14 +590,10 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener if v.label != nil { visit_expr(p, v.label); - push_generic_token(p, .Colon, 1); + push_generic_token(p, .Colon, 0); } - push_generic_token(p, .For, 0); - - //if v.init != nil || v.cond != nil || v.post != nil { - // print(p, space); - //} + push_generic_token(p, .For, 1); if v.init != nil { p.skip_semicolon = true; @@ -522,7 +610,6 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener if v.post != nil { push_generic_token(p, .Semicolon, 0); - //print(p, space); visit_stmt(p, v.post); } else if v.post == nil && v.cond != nil && v.init != nil { push_generic_token(p, .Semicolon, 0); @@ -540,7 +627,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener push_ident_token(p, "#unroll", 0); - push_generic_token(p, .For, 0); + push_generic_token(p, .For, 1); visit_expr(p, v.val0); if v.val1 != nil { @@ -561,7 +648,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener push_generic_token(p, .Colon, 1); } - push_generic_token(p, .For, 0); + push_generic_token(p, .For, 1); if len(v.vals) >= 1 { visit_expr(p, v.vals[0]); @@ -580,7 +667,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener case Return_Stmt: move_line(p, v.pos); - push_generic_token(p, .Return, 0); + push_generic_token(p, .Return, 1); if v.results != nil { visit_exprs(p, v.results, true); @@ -600,7 +687,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener } case When_Stmt: move_line(p, v.pos); - push_generic_token(p, .When, 0); + push_generic_token(p, .When, 1); visit_expr(p, v.cond); visit_stmt(p, v.body); @@ -608,10 +695,10 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener if v.else_stmt != nil { if p.config.brace_style == .Allman { - newline_source_position(p, 1); + newline_position(p, 1); } - push_generic_token(p, .Else, 0); + push_generic_token(p, .Else, 1); set_source_position(p, v.else_stmt.pos); @@ -734,7 +821,7 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr) { push_generic_token(p, .Close_Bracket, 0); visit_expr(p, v.elem); case Bit_Set_Type: - push_generic_token(p, .Bit_Set, 0); + push_generic_token(p, .Bit_Set, 1); push_generic_token(p, .Open_Bracket, 0); visit_expr(p, v.elem); @@ -750,7 +837,7 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr) { if v.poly_params != nil { push_generic_token(p, .Open_Paren, 0); - visit_field_list(p, v.poly_params, ", "); + visit_field_list(p, v.poly_params, true, true); push_generic_token(p, .Close_Paren, 0); } @@ -760,18 +847,17 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr) { if v.variants != nil && (len(v.variants) == 0 || v.pos.line == v.end.line) { push_generic_token(p, .Open_Brace, 1); - set_source_position(p, v.variants[len(v.variants) - 1].pos); visit_exprs(p, v.variants, true); push_generic_token(p, .Close_Brace, 0); } else { visit_begin_brace(p, v.pos, .Generic); - newline_source_position(p, 1); - set_source_position(p, v.variants[len(v.variants) - 1].pos); + newline_position(p, 1); + set_source_position(p, v.variants[0].pos); visit_exprs(p, v.variants, true, true); visit_end_brace(p, v.end); } case Enum_Type: - push_generic_token(p, .Enum, 0); + push_generic_token(p, .Enum, 1); if v.base_type != nil { visit_expr(p, v.base_type); @@ -779,21 +865,19 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr) { if v.fields != nil && (len(v.fields) == 0 || v.pos.line == v.end.line) { push_generic_token(p, .Open_Brace, 1); - set_source_position(p, v.fields[len(v.fields) - 1].pos); visit_exprs(p, v.fields, true); push_generic_token(p, .Close_Brace, 0); } else { visit_begin_brace(p, v.pos, .Generic); - newline_source_position(p, 1); - set_source_position(p, v.fields[len(v.fields) - 1].pos); - //visit_enum_fields(p, v.fields, ","); - visit_exprs(p, v.fields, true); + newline_position(p, 1); + set_source_position(p, v.fields[0].pos); + visit_exprs(p, v.fields, true, true); visit_end_brace(p, v.end); } set_source_position(p, v.end); case Struct_Type: - push_generic_token(p, .Struct, 0); + push_generic_token(p, .Struct, 1); if v.is_packed { push_ident_token(p, "#packed", 1); @@ -810,21 +894,20 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr) { if v.poly_params != nil { push_generic_token(p, .Open_Paren, 0); - visit_field_list(p, v.poly_params, ", "); + visit_field_list(p, v.poly_params, true, true); push_generic_token(p, .Close_Paren, 0); } if v.fields != nil && (len(v.fields.list) == 0 || v.pos.line == v.end.line) { push_generic_token(p, .Open_Brace, 1); set_source_position(p, v.fields.pos); - visit_field_list(p, v.fields, ", "); + visit_field_list(p, v.fields, true); push_generic_token(p, .Close_Brace, 0); } else { visit_begin_brace(p, v.pos, .Generic); - newline_source_position(p, 1); + newline_position(p, 1); set_source_position(p, v.fields.pos); - visit_field_list(p, v.fields, ", "); - //visit_struct_field_list(p, v.fields, ","); + visit_field_list(p, v.fields, true, true); visit_end_brace(p, v.end); } @@ -880,7 +963,7 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr) { push_generic_token(p, .Close_Paren, 0); case Index_Expr: visit_expr(p, v.expr); - push_generic_token(p, .Open_Bracket, 1); + push_generic_token(p, .Open_Bracket, 0); visit_expr(p, v.index); push_generic_token(p, .Close_Bracket, 0); case Proc_Group: @@ -889,8 +972,8 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr) { if len(v.args) != 0 && v.pos.line != v.args[len(v.args) - 1].pos.line { visit_begin_brace(p, v.pos, .Generic); - newline_source_position(p, 1); - set_source_position(p, v.args[len(v.args) - 1].pos); + newline_position(p, 1); + set_source_position(p, v.args[0].pos); visit_exprs(p, v.args, true, true); visit_end_brace(p, v.end); } else { @@ -907,8 +990,8 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr) { if len(v.elems) != 0 && v.pos.line != v.elems[len(v.elems) - 1].pos.line { visit_begin_brace(p, v.pos, .Comp_Lit); - newline_source_position(p, 1); - set_source_position(p, v.elems[len(v.elems) - 1].pos); + newline_position(p, 1); + set_source_position(p, v.elems[0].pos); visit_exprs(p, v.elems, true, true); visit_end_brace(p, v.end); } else { @@ -919,6 +1002,7 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr) { case Unary_Expr: push_generic_token(p, v.op.kind, 0); + merge_next_token(p); visit_expr(p, v.expr); case Field_Value: visit_expr(p, v.field); @@ -939,6 +1023,7 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr) { case Pointer_Type: push_generic_token(p, .Pointer, 0); + merge_next_token(p); visit_expr(p, v.elem); case Implicit: push_generic_token(p, v.tok.kind, 0); @@ -958,7 +1043,7 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr) { push_generic_token(p, .Close_Bracket, 0); visit_expr(p, v.elem); case Map_Type: - push_generic_token(p, .Map, 0); + push_generic_token(p, .Map, 1); push_generic_token(p, .Open_Bracket, 0); visit_expr(p, v.key); push_generic_token(p, .Close_Bracket, 0); @@ -980,7 +1065,7 @@ visit_begin_brace :: proc(p: ^Printer, begin: tokenizer.Pos, type: Block_Type) { newline_braced &= p.config.brace_style != ._1TBS; if newline_braced { - newline_source_position(p, 1); + newline_position(p, 1); push_generic_token(p, .Open_Brace, 0); indent(p); } else { @@ -991,7 +1076,7 @@ visit_begin_brace :: proc(p: ^Printer, begin: tokenizer.Pos, type: Block_Type) { visit_end_brace :: proc(p: ^Printer, end: tokenizer.Pos) { set_source_position(p, end); - newline_source_position(p, 1); + newline_position(p, 1); unindent(p); push_generic_token(p, .Close_Brace, 0); } @@ -1000,14 +1085,14 @@ visit_block_stmts :: proc(p: ^Printer, stmts: []^ast.Stmt, newline_each := false for stmt, i in stmts { if newline_each { - newline_source_position(p, 1); + newline_position(p, 1); } visit_stmt(p, stmt, .Generic, false, true); } } -visit_field_list :: proc(p: ^Printer, list: ^ast.Field_List, sep := "") { +visit_field_list :: proc(p: ^Printer, list: ^ast.Field_List, add_comma := false, trailing := false) { if list.list == nil { return; @@ -1039,8 +1124,8 @@ visit_field_list :: proc(p: ^Printer, list: ^ast.Field_List, sep := "") { push_generic_token(p, field.tag.kind, 1); } - if i != len(list.list) - 1 { - //print(p, sep); + if (i != len(list.list) - 1 || trailing) && add_comma { + push_generic_token(p, .Comma, 0); } } } @@ -1049,20 +1134,22 @@ visit_proc_type :: proc(p: ^Printer, proc_type: ast.Proc_Type) { push_generic_token(p, .Proc, 1); - if proc_type.calling_convention != .Odin { - //print(p, space); - } + explicit_calling := false; switch proc_type.calling_convention { case .Odin: case .Contextless: - push_string_token(p, "\"contextless\"", 0); + push_string_token(p, "\"contextless\"", 1); + explicit_calling = true; case .C_Decl: - push_string_token(p, "\"c\"", 0); + push_string_token(p, "\"c\"", 1); + explicit_calling = true; case .Std_Call: - push_string_token(p, "\"std\"", 0); + push_string_token(p, "\"std\"", 1); + explicit_calling = true; case .Fast_Call: - push_string_token(p, "\"fast\"", 0); + push_string_token(p, "\"fast\"", 1); + explicit_calling = true; case .None: //nothing i guess case .Invalid: @@ -1070,15 +1157,19 @@ visit_proc_type :: proc(p: ^Printer, proc_type: ast.Proc_Type) { case .Foreign_Block_Default: } - push_generic_token(p, .Open_Paren, 0); + if explicit_calling { + push_generic_token(p, .Open_Paren, 1); + } else { + push_generic_token(p, .Open_Paren, 0); + } - //visit_signature_list(p, proc_type.params, ", ", false); + visit_signature_list(p, proc_type.params, false); push_generic_token(p, .Close_Paren, 0); - /* if proc_type.results != nil { - print(p, space, "->", space); + push_generic_token(p, .Sub, 1); + push_generic_token(p, .Gt, 0); use_parens := false; use_named := false; @@ -1097,14 +1188,14 @@ visit_proc_type :: proc(p: ^Printer, proc_type: ast.Proc_Type) { } if use_parens { - print(p, lparen); - print_signature_list(p, proc_type.results, ", "); - print(p, rparen); + push_generic_token(p, .Open_Paren, 1); + visit_signature_list(p, proc_type.results); + push_generic_token(p, .Close_Paren, 0); } else { - print_signature_list(p, proc_type.results, ", "); + visit_signature_list(p, proc_type.results); } } - */ + } visit_binary_expr :: proc(p: ^Printer, binary: ast.Binary_Expr) { @@ -1173,126 +1264,8 @@ visit_call_exprs :: proc(p: ^Printer, list: []^ast.Expr, ellipsis := false) { } } -/* -print_enum_fields :: proc(p: ^Printer, list: []^ast.Expr, sep := " ") { - - //print enum fields is like visit_exprs, but it can contain fields that can be aligned. - - if len(list) == 0 { - return; - } - - if list[0].pos.line == list[len(list) - 1].pos.line { - //if everything is on one line, then it can be treated the same way as visit_exprs - visit_exprs(p, list, sep); - return; - } - - largest := 0; - last_field_value := 0; - - //first find all the field values and find the largest name - for expr, i in list { - - if field_value, ok := expr.derived.(ast.Field_Value); ok { - - if ident, ok := field_value.field.derived.(ast.Ident); ok { - largest = max(largest, strings.rune_count(ident.name)); - } - } - } - - for expr, i in list { - - move_line_limit(p, expr.pos, 1); - - if field_value, ok := expr.derived.(ast.Field_Value); ok && p.config.align_assignments { - - if ident, ok := field_value.field.derived.(ast.Ident); ok { - visit_expr(p, field_value.field); - print_space_padding(p, largest - strings.rune_count(ident.name) + 1); - print(p, "=", space); - visit_expr(p, field_value.value); - } else { - visit_expr(p, expr); - } - } else { - visit_expr(p, expr); - } - - if i != len(list) - 1 { - print(p, sep); - } else { - print(p, strings.trim_space(sep)); - } - } -} - - - - - - - -print_struct_field_list :: proc(p: ^Printer, list: ^ast.Field_List, sep := "") { - - if list.list == nil { - return; - } - - largest := 0; - using_size := len("using "); - - //NOTE(Daniel): Is there any other variables than using in structs? - - for field, i in list.list { - if .Using in field.flags { - largest = max(largest, get_length_of_names(field.names) + using_size); - } else { - largest = max(largest, get_length_of_names(field.names)); - } - } - - for field, i in list.list { - - move_line_limit(p, field.pos, 1); - - if .Using in field.flags { - print(p, "using", space); - } - - visit_exprs(p, field.names, ", "); - - if len(field.names) != 0 { - print(p, ": "); - } - - if field.type == nil { - panic("struct field has to have types"); - } - - if .Using in field.flags { - print_space_padding(p, largest - get_length_of_names(field.names) - using_size); - } else { - print_space_padding(p, largest - get_length_of_names(field.names)); - } - - visit_expr(p, field.type); - - if field.tag.text != "" { - print(p, space, field.tag); - } - - if i != len(list.list) - 1 { - print(p, sep); - } else { - print(p, strings.trim_space(sep)); - } - } -} - -print_signature_list :: proc(p: ^Printer, list: ^ast.Field_List, sep := "", remove_blank := true) { +visit_signature_list :: proc(p: ^Printer, list: ^ast.Field_List, remove_blank := true) { if list.list == nil { return; @@ -1303,7 +1276,7 @@ print_signature_list :: proc(p: ^Printer, list: ^ast.Field_List, sep := "", remo move_line_limit(p, field.pos, 1); if .Using in field.flags { - print(p, "using", space); + push_generic_token(p, .Using, 0); } named := false; @@ -1321,34 +1294,33 @@ print_signature_list :: proc(p: ^Printer, list: ^ast.Field_List, sep := "", remo } if named { - visit_exprs(p, field.names, ", "); + visit_exprs(p, field.names, true); if len(field.names) != 0 && field.type != nil { - print(p, ": "); - } else { - print(p, space); - } + push_generic_token(p, .Colon, 0); + } } if field.type != nil && field.default_value != nil { visit_expr(p, field.type); - print(p, space, "=", space); + push_generic_token(p, .Eq, 0); visit_expr(p, field.default_value); } else if field.type != nil { visit_expr(p, field.type); } else { - print(p, ":= "); + push_generic_token(p, .Colon, 1); + push_generic_token(p, .Eq, 0); visit_expr(p, field.default_value); } if i != len(list.list) - 1 { - print(p, sep); + push_generic_token(p, .Comma, 0); } } } - +/* print_attributes :: proc(p: ^Printer, attributes: [dynamic]^ast.Attribute) { if len(attributes) == 0 { @@ -1367,28 +1339,7 @@ print_attributes :: proc(p: ^Printer, attributes: [dynamic]^ast.Attribute) { } } -print_file :: proc(p: ^Printer, file: ^ast.File) { - p.comments = file.comments; - p.file = file; - - move_line(p, file.pkg_token.pos); - - print(p, file.pkg_token, space, file.pkg_name); - - for decl, i in file.decls { - - if value_decl, ok := decl.derived.(ast.Value_Decl); ok { - set_value_decl_alignment_padding(p, value_decl, file.decls[i + 1:]); - } - - print_decl(p, cast(^ast.Decl)decl); - } - - //todo(probably check if there already is a newline, but there really shouldn't be) - print(p, newline); //finish document with newline - write_whitespaces(p, p.current_whitespace); -} */