From 19a43db2de3feff566c9a5f4812cbc3145f93544 Mon Sep 17 00:00:00 2001 From: zakuro Date: Sat, 4 Sep 2021 17:02:04 +0900 Subject: [PATCH] fmt: fix removal of comment before embed in struct (#11384) --- vlib/v/fmt/struct.v | 9 +++++++-- vlib/v/fmt/tests/struct_embed_keep.vv | 2 ++ vlib/v/parser/struct.v | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/vlib/v/fmt/struct.v b/vlib/v/fmt/struct.v index 69c2c01d4f..5efdfbd9e8 100644 --- a/vlib/v/fmt/struct.v +++ b/vlib/v/fmt/struct.v @@ -57,11 +57,16 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) { for embed in node.embeds { f.mark_types_import_as_used(embed.typ) styp := f.table.type_to_str_using_aliases(embed.typ, f.mod2alias) - if embed.comments.len == 0 { + + pre_comments := embed.comments.filter(it.pos.pos < embed.pos.pos) + comments := embed.comments[pre_comments.len..] + + f.comments_before_field(pre_comments) + if comments.len == 0 { f.writeln('\t$styp') } else { f.write('\t$styp') - f.comments(embed.comments, level: .indent) + f.comments(comments, level: .indent) } } mut field_align_i := 0 diff --git a/vlib/v/fmt/tests/struct_embed_keep.vv b/vlib/v/fmt/tests/struct_embed_keep.vv index 9213bf7ed7..a5968ecac2 100644 --- a/vlib/v/fmt/tests/struct_embed_keep.vv +++ b/vlib/v/fmt/tests/struct_embed_keep.vv @@ -5,7 +5,9 @@ struct Foo { struct Test {} struct Bar { + // comment before Fooo Foo // comment for Foo + // comment before Test Test // comment for Test // another comment for Test y int diff --git a/vlib/v/parser/struct.v b/vlib/v/parser/struct.v index 7cd4e606e6..d792c3886c 100644 --- a/vlib/v/parser/struct.v +++ b/vlib/v/parser/struct.v @@ -181,7 +181,7 @@ fn (mut p Parser) struct_decl() ast.StructDecl { // struct embedding type_pos = p.tok.position() typ = p.parse_type() - ecomments := p.eat_comments() + comments << p.eat_comments() type_pos = type_pos.extend(p.prev_tok.position()) if !is_on_top { p.error_with_pos('struct embedding must be declared at the beginning of the struct body', @@ -203,7 +203,7 @@ fn (mut p Parser) struct_decl() ast.StructDecl { embeds << ast.Embed{ typ: typ pos: type_pos - comments: ecomments + comments: comments } } else { // struct field