From 8b7f9089f610110a6c373d903974be3cb3650fe1 Mon Sep 17 00:00:00 2001 From: Turiiya <34311583+ttytm@users.noreply.github.com> Date: Tue, 19 Mar 2024 20:40:13 +0100 Subject: [PATCH] parser, fmt: fix parsing of interface with comment above `mut:` keyword (#21062) --- vlib/v/fmt/fmt.v | 22 +++++++++++++------ .../interface_decl_with_comment_expected.vv | 2 ++ .../interface_decl_with_comment_input.vv | 2 ++ vlib/v/parser/struct.v | 2 +- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/vlib/v/fmt/fmt.v b/vlib/v/fmt/fmt.v index b06af4d46..94f050042 100644 --- a/vlib/v/fmt/fmt.v +++ b/vlib/v/fmt/fmt.v @@ -1426,11 +1426,17 @@ pub fn (mut f Fmt) calculate_alignment(fields []ast.StructField, mut field_align pub fn (mut f Fmt) interface_field(field ast.StructField, field_align AlignInfo) { ft := f.no_cur_mod(f.table.type_to_str_using_aliases(field.typ, f.mod2alias)) - before_comments := field.comments.filter(it.pos.pos < field.pos.pos) - end_comments := field.comments.filter(it.pos.pos > field.pos.pos) + mut pre_cmts, mut end_cmts, mut next_line_cmts := []ast.Comment{}, []ast.Comment{}, []ast.Comment{} + for cmt in field.comments { + match true { + cmt.pos.pos < field.pos.pos { pre_cmts << cmt } + cmt.pos.line_nr > field.pos.last_line { next_line_cmts << cmt } + else { end_cmts << cmt } + } + } before_len := f.line_len - if before_comments.len > 0 { - f.comments(before_comments, level: .indent) + if pre_cmts.len > 0 { + f.comments(pre_cmts, level: .indent) } comments_len := f.line_len - before_len @@ -1449,12 +1455,14 @@ pub fn (mut f Fmt) interface_field(field ast.StructField, field_align AlignInfo) f.write(strings.repeat(` `, field_align.max_len - field.name.len - comments_len)) f.write(ft) } - - if end_comments.len > 0 { - f.comments(end_comments, level: .indent) + if end_cmts.len > 0 { + f.comments(end_cmts, level: .indent) } else { f.writeln('') } + if next_line_cmts.len > 0 { + f.comments(next_line_cmts, level: .indent) + } f.mark_types_import_as_used(field.typ) } diff --git a/vlib/v/fmt/tests/interface_decl_with_comment_expected.vv b/vlib/v/fmt/tests/interface_decl_with_comment_expected.vv index 0d0717a14..dba595802 100644 --- a/vlib/v/fmt/tests/interface_decl_with_comment_expected.vv +++ b/vlib/v/fmt/tests/interface_decl_with_comment_expected.vv @@ -1,4 +1,6 @@ interface Abc { // interface Abc a int + // comment +mut: get_info() string } diff --git a/vlib/v/fmt/tests/interface_decl_with_comment_input.vv b/vlib/v/fmt/tests/interface_decl_with_comment_input.vv index 5d2e58be2..c0317eb51 100644 --- a/vlib/v/fmt/tests/interface_decl_with_comment_input.vv +++ b/vlib/v/fmt/tests/interface_decl_with_comment_input.vv @@ -1,5 +1,7 @@ interface Abc // interface Abc { a int +// comment +mut: get_info() string } diff --git a/vlib/v/parser/struct.v b/vlib/v/parser/struct.v index 9a6ccf9da..26d7e3935 100644 --- a/vlib/v/parser/struct.v +++ b/vlib/v/parser/struct.v @@ -707,7 +707,7 @@ fn (mut p Parser) interface_decl() ast.InterfaceDecl { mut type_pos := p.tok.pos() field_typ := p.parse_type() type_pos = type_pos.extend(p.prev_tok.pos()) - comments << p.eat_comments(same_line: true) + comments << p.eat_comments() fields << ast.StructField{ name: field_name pos: field_pos -- 2.39.5