1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

vfmt: handle comments in enum Abc{} and after match branches

This commit is contained in:
Delyan Angelov 2020-07-02 16:44:03 +03:00
parent 6ec86fa344
commit 132170f54c
5 changed files with 33 additions and 4 deletions

View File

@ -462,6 +462,7 @@ pub:
pos token.Position
comment Comment // comment above `xxx {`
is_else bool
post_comments []Comment
}
/*
@ -586,6 +587,7 @@ pub struct EnumField {
pub:
name string
pos token.Position
comments []Comment
expr Expr
has_expr bool
}
@ -595,6 +597,7 @@ pub:
name string
is_pub bool
is_flag bool // true when the enum has [flag] tag
comments []Comment // enum Abc { /* comments */ ... }
fields []EnumField
pos token.Position
}

View File

@ -315,12 +315,14 @@ pub fn (mut f Fmt) stmt(node ast.Stmt) {
}
name := it.name.after('.')
f.writeln('enum $name {')
f.comments(it.comments)
for field in it.fields {
f.write('\t$field.name')
if field.has_expr {
f.write(' = ')
f.expr(field.expr)
}
f.comments(it.comments)
f.writeln('')
}
f.writeln('}\n')
@ -1098,6 +1100,15 @@ pub fn (mut f Fmt) comment(node ast.Comment) {
f.writeln('*/')
}
pub fn (mut f Fmt) comments(some_comments []ast.Comment) {
for c in some_comments {
if !f.out.last_n(1)[0].is_space() {
f.write('\t')
}
f.comment(c)
}
}
pub fn (mut f Fmt) fn_decl(node ast.FnDecl) {
// println('$it.name find_comment($it.pos.line_nr)')
// f.find_comment(it.pos.line_nr)
@ -1317,6 +1328,7 @@ pub fn (mut f Fmt) match_expr(it ast.MatchExpr) {
f.writeln('}')
}
}
f.comments(branch.post_comments)
}
f.indent--
f.write('}')

View File

@ -180,6 +180,7 @@ fn (mut p Parser) match_expr() ast.MatchExpr {
p.inside_match_body = true
stmts := p.parse_block()
p.inside_match_body = false
post_comments := p.eat_comments()
pos := token.Position{
line_nr: branch_first_pos.line_nr
pos: branch_first_pos.pos
@ -191,6 +192,7 @@ fn (mut p Parser) match_expr() ast.MatchExpr {
pos: pos
comment: comment
is_else: is_else
post_comments: post_comments
}
p.close_scope()
if p.tok.kind == .rcbr {

View File

@ -474,6 +474,17 @@ pub fn (mut p Parser) comment() ast.Comment {
}
}
pub fn (mut p Parser) eat_comments() []ast.Comment {
mut comments := []ast.Comment{}
for {
if p.tok.kind != .comment {
break
}
comments << p.check_comment()
}
return comments
}
pub fn (mut p Parser) stmt(is_top_level bool) ast.Stmt {
p.is_stmt_ident = p.tok.kind == .name
match p.tok.kind {
@ -1441,6 +1452,7 @@ fn (mut p Parser) enum_decl() ast.EnumDecl {
enum_name := p.check_name()
name := p.prepend_mod(enum_name)
p.check(.lcbr)
enum_decl_comments := p.eat_comments()
mut vals := []string{}
// mut default_exprs := []ast.Expr{}
mut fields := []ast.EnumField{}
@ -1461,6 +1473,7 @@ fn (mut p Parser) enum_decl() ast.EnumDecl {
pos: pos
expr: expr
has_expr: has_expr
comments: p.eat_comments()
}
}
p.top_level_statement_end()
@ -1495,6 +1508,7 @@ $pubfn (mut e $enum_name) toggle(flag $enum_name) { unsafe{ *e = int(*e) ^ (
is_flag: is_flag
fields: fields
pos: start_pos.extend(end_pos)
comments: enum_decl_comments
}
}

View File

@ -13,6 +13,7 @@ pub fn (mut p Parser) expr(precedence int) ast.Expr {
mut node := ast.Expr{}
is_stmt_ident := p.is_stmt_ident
p.is_stmt_ident = false
p.eat_comments()
// Prefix
match p.tok.kind {
.key_mut, .key_static {
@ -108,7 +109,7 @@ pub fn (mut p Parser) expr(precedence int) ast.Expr {
} else {
sizeof_type := p.parse_type()
node = ast.SizeOf{
is_type: true
is_type: true
typ: sizeof_type
type_name: p.table.get_type_symbol(sizeof_type).name
pos: pos
@ -165,9 +166,6 @@ pub fn (mut p Parser) expr(precedence int) ast.Expr {
return node
}
else {
if p.tok.kind == .comment {
println(p.tok.lit)
}
p.error('expr(): bad token `$p.tok.kind.str()`')
}
}