parser/fmt: fix comments in structs/consts
parent
000eaca6be
commit
4e447db883
|
@ -122,7 +122,7 @@ pub struct StructField {
|
|||
pub:
|
||||
name string
|
||||
pos token.Position
|
||||
comment Comment
|
||||
comments []Comment
|
||||
default_expr Expr
|
||||
has_default_expr bool
|
||||
attrs []string
|
||||
|
@ -141,13 +141,13 @@ pub mut:
|
|||
|
||||
pub struct ConstField {
|
||||
pub:
|
||||
name string
|
||||
expr Expr
|
||||
is_pub bool
|
||||
pos token.Position
|
||||
name string
|
||||
expr Expr
|
||||
is_pub bool
|
||||
pos token.Position
|
||||
pub mut:
|
||||
typ table.Type
|
||||
comment Comment
|
||||
typ table.Type
|
||||
comments []Comment
|
||||
}
|
||||
|
||||
pub struct ConstDecl {
|
||||
|
@ -160,16 +160,17 @@ pub mut:
|
|||
|
||||
pub struct StructDecl {
|
||||
pub:
|
||||
pos token.Position
|
||||
name string
|
||||
fields []StructField
|
||||
is_pub bool
|
||||
mut_pos int // mut:
|
||||
pub_pos int // pub:
|
||||
pub_mut_pos int // pub mut:
|
||||
language table.Language
|
||||
is_union bool
|
||||
attrs []string
|
||||
pos token.Position
|
||||
name string
|
||||
fields []StructField
|
||||
is_pub bool
|
||||
mut_pos int // mut:
|
||||
pub_pos int // pub:
|
||||
pub_mut_pos int // pub mut:
|
||||
language table.Language
|
||||
is_union bool
|
||||
attrs []string
|
||||
end_comments []Comment
|
||||
}
|
||||
|
||||
pub struct InterfaceDecl {
|
||||
|
|
|
@ -498,8 +498,16 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
|||
f.writeln('$name {')
|
||||
mut max := 0
|
||||
for field in node.fields {
|
||||
if field.name.len > max {
|
||||
max = field.name.len
|
||||
end_pos := field.pos.pos + field.pos.len
|
||||
mut comments_len := 0 // Length of comments between field name and type
|
||||
for comment in field.comments {
|
||||
if comment.pos.pos >= end_pos { break }
|
||||
if comment.pos.pos > field.pos.pos {
|
||||
comments_len += '/* ${comment.text} */ '.len
|
||||
}
|
||||
}
|
||||
if comments_len + field.name.len > max {
|
||||
max = comments_len + field.name.len
|
||||
}
|
||||
}
|
||||
for i, field in node.fields {
|
||||
|
@ -510,13 +518,41 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
|||
} else if i == node.pub_mut_pos {
|
||||
f.writeln('pub mut:')
|
||||
}
|
||||
if field.comment.text != '' && field.comment.pos.line_nr < field.pos.line_nr {
|
||||
// Comment on the previous line
|
||||
f.write('\t')
|
||||
f.comment(field.comment)
|
||||
end_pos := field.pos.pos + field.pos.len
|
||||
comments := field.comments
|
||||
if comments.len == 0 {
|
||||
f.write('\t$field.name ')
|
||||
f.write(strings.repeat(` `, max - field.name.len))
|
||||
f.write(f.type_to_str(field.typ))
|
||||
if field.attrs.len > 0 {
|
||||
f.write(' [' + field.attrs.join(';') + ']')
|
||||
}
|
||||
if field.has_default_expr {
|
||||
f.write(' = ')
|
||||
f.struct_field_expr(field.default_expr)
|
||||
}
|
||||
f.write('\n')
|
||||
continue
|
||||
}
|
||||
// Handle comments before field
|
||||
mut j := 0
|
||||
for j < comments.len && comments[j].pos.pos < field.pos.pos {
|
||||
f.indent++
|
||||
f.empty_line = true
|
||||
f.comment(comments[j])
|
||||
f.indent--
|
||||
j++
|
||||
}
|
||||
f.write('\t$field.name ')
|
||||
f.write(strings.repeat(` `, max - field.name.len))
|
||||
// Handle comments between field name and type
|
||||
mut comments_len := 0
|
||||
for j < comments.len && comments[j].pos.pos < end_pos {
|
||||
comment := '/* ${comments[j].text} */ ' // TODO: handle in a function
|
||||
comments_len += comment.len
|
||||
f.write(comment)
|
||||
j++
|
||||
}
|
||||
f.write(strings.repeat(` `, max - field.name.len - comments_len))
|
||||
f.write(f.type_to_str(field.typ))
|
||||
if field.attrs.len > 0 {
|
||||
f.write(' [' + field.attrs.join(';') + ']')
|
||||
|
@ -525,17 +561,19 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
|||
f.write(' = ')
|
||||
f.struct_field_expr(field.default_expr)
|
||||
}
|
||||
// f.write('// $field.pos.line_nr')
|
||||
if field.comment.text != '' && field.comment.pos.line_nr == field.pos.line_nr {
|
||||
// Same line comment
|
||||
f.write(' ')
|
||||
f.comment(field.comment)
|
||||
} else {
|
||||
// if field.comment.text != '' {
|
||||
// f.write (' // com linenr=$field.comment.pos.line_nr')
|
||||
// }
|
||||
f.writeln('')
|
||||
// Handle comments after field type (same line)
|
||||
for j < comments.len && field.pos.line_nr == comments[j].pos.line_nr{
|
||||
f.write(' // ${comments[j].text}') // TODO: handle in a function
|
||||
j++
|
||||
}
|
||||
f.write('\n')
|
||||
}
|
||||
// Handle comments after last field
|
||||
for comment in node.end_comments {
|
||||
f.indent++
|
||||
f.empty_line = true
|
||||
f.comment(comment)
|
||||
f.indent--
|
||||
}
|
||||
f.writeln('}\n')
|
||||
}
|
||||
|
@ -1359,9 +1397,11 @@ pub fn (mut f Fmt) const_decl(it ast.ConstDecl) {
|
|||
}
|
||||
f.indent++
|
||||
for field in it.fields {
|
||||
if field.comment.text != '' {
|
||||
f.comment(field.comment)
|
||||
// f.writeln('// ' + field.comment.text)
|
||||
comments := field.comments
|
||||
mut j := 0
|
||||
for j < comments.len && comments[j].pos.pos < field.pos.pos {
|
||||
f.comment(comments[j])
|
||||
j++
|
||||
}
|
||||
name := field.name.after('.')
|
||||
f.write('$name ')
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
const (
|
||||
// pi
|
||||
// pi
|
||||
pi = 3.14
|
||||
// phi
|
||||
// phi
|
||||
// phi
|
||||
phi = 1.618
|
||||
// Euler's constant
|
||||
eulers = 2.7182
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
const (
|
||||
// pi
|
||||
// pi
|
||||
pi=3.14
|
||||
// phi
|
||||
// phi
|
||||
// phi
|
||||
phi=1.618
|
||||
//Euler's constant
|
||||
eulers=2.7182
|
||||
|
|
|
@ -22,3 +22,22 @@ fn new_user() User {
|
|||
age: 19
|
||||
}
|
||||
}
|
||||
|
||||
struct SomeStruct {
|
||||
mut:
|
||||
// 1
|
||||
// 2
|
||||
// 3
|
||||
somefield /* 4 */ /* 5 */ int // 6 // 7 // 8
|
||||
/*
|
||||
9
|
||||
10
|
||||
*/
|
||||
somefield2 /* 11 */ int // 12
|
||||
pub:
|
||||
somefield3 int
|
||||
/*
|
||||
13
|
||||
14
|
||||
*/
|
||||
}
|
||||
|
|
|
@ -24,3 +24,21 @@ User
|
|||
age: 19
|
||||
}
|
||||
}
|
||||
|
||||
struct SomeStruct {
|
||||
// 1
|
||||
mut:
|
||||
// 2
|
||||
// 3
|
||||
somefield /*4*/ /*5*/ int /*6*/ /*7*/ /*8*/ /*
|
||||
9
|
||||
10
|
||||
*/
|
||||
somefield2 /*11*/ int // 12
|
||||
pub:
|
||||
somefield3 int
|
||||
/*
|
||||
13
|
||||
14
|
||||
*/
|
||||
}
|
||||
|
|
|
@ -471,6 +471,7 @@ pub fn (mut p Parser) comment() ast.Comment {
|
|||
p.next()
|
||||
// p.next_with_comment()
|
||||
return ast.Comment{
|
||||
is_multi: text.contains('\n')
|
||||
text: text
|
||||
pos: pos
|
||||
}
|
||||
|
@ -1328,9 +1329,10 @@ fn (mut p Parser) const_decl() ast.ConstDecl {
|
|||
p.next() // (
|
||||
mut fields := []ast.ConstField{}
|
||||
for p.tok.kind != .rpar {
|
||||
mut comment := ast.Comment{}
|
||||
if p.tok.kind == .comment {
|
||||
comment = p.comment()
|
||||
mut comments := []ast.Comment{}
|
||||
for p.tok.kind == .comment {
|
||||
comments << p.comment()
|
||||
if p.tok.kind == .rpar {break}
|
||||
}
|
||||
pos := p.tok.position()
|
||||
name := p.check_name()
|
||||
|
@ -1347,7 +1349,7 @@ fn (mut p Parser) const_decl() ast.ConstDecl {
|
|||
name: full_name
|
||||
expr: expr
|
||||
pos: pos
|
||||
comment: comment
|
||||
comments: comments
|
||||
}
|
||||
fields << field
|
||||
p.global_scope.register(field.name, field)
|
||||
|
|
|
@ -55,12 +55,18 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
|
|||
mut is_field_mut := false
|
||||
mut is_field_pub := false
|
||||
mut is_field_global := false
|
||||
mut end_comments := []ast.Comment{}
|
||||
if !no_body {
|
||||
p.check(.lcbr)
|
||||
for p.tok.kind != .rcbr {
|
||||
mut comment := ast.Comment{}
|
||||
if p.tok.kind == .comment {
|
||||
comment = p.comment()
|
||||
mut comments := []ast.Comment{}
|
||||
for p.tok.kind == .comment {
|
||||
comments << p.comment()
|
||||
if p.tok.kind == .rcbr {break}
|
||||
}
|
||||
if p.tok.kind == .rcbr {
|
||||
end_comments = comments
|
||||
break
|
||||
}
|
||||
if p.tok.kind == .key_pub {
|
||||
p.next()
|
||||
|
@ -104,17 +110,43 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
|
|||
is_field_mut = true
|
||||
is_field_global = true
|
||||
}
|
||||
for p.tok.kind == .comment {
|
||||
comments << p.comment()
|
||||
if p.tok.kind == .rcbr {break}
|
||||
}
|
||||
field_start_pos := p.tok.position()
|
||||
field_name := p.check_name()
|
||||
// p.warn('field $field_name')
|
||||
|
||||
for p.tok.kind == .comment {
|
||||
comments << p.comment()
|
||||
if p.tok.kind == .rcbr {break}
|
||||
}
|
||||
|
||||
// println(p.tok.position())
|
||||
typ := p.parse_type()
|
||||
field_pos := field_start_pos.extend(p.tok.position())
|
||||
// field_pos := field_start_pos.extend(p.tok.position())
|
||||
field_pos := token.Position{
|
||||
line_nr: field_start_pos.line_nr
|
||||
pos: field_start_pos.pos
|
||||
len: p.tok.position().pos - field_start_pos.pos
|
||||
}
|
||||
/*
|
||||
if name == '_net_module_s' {
|
||||
s := p.table.get_type_symbol(typ)
|
||||
println('XXXX' + s.str())
|
||||
}
|
||||
*/
|
||||
// Comments after type (same line)
|
||||
line_pos := field_pos.line_nr
|
||||
for p.tok.kind == .comment && line_pos + 1 == p.tok.line_nr{
|
||||
if p.tok.lit.contains('\n') {
|
||||
break
|
||||
}
|
||||
comments << p.comment()
|
||||
if p.tok.kind == .rcbr {break}
|
||||
}
|
||||
|
||||
mut attrs := []string{}
|
||||
if p.tok.kind == .lsbr {
|
||||
parsed_attrs := p.attributes(false)
|
||||
|
@ -137,15 +169,12 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
|
|||
}
|
||||
has_default_expr = true
|
||||
}
|
||||
if p.tok.kind == .comment {
|
||||
comment = p.comment()
|
||||
}
|
||||
// TODO merge table and ast Fields?
|
||||
ast_fields << ast.StructField{
|
||||
name: field_name
|
||||
pos: field_pos
|
||||
typ: typ
|
||||
comment: comment
|
||||
comments: comments
|
||||
default_expr: default_expr
|
||||
has_default_expr: has_default_expr
|
||||
attrs: attrs
|
||||
|
@ -209,6 +238,7 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
|
|||
language: language
|
||||
is_union: is_union
|
||||
attrs: p.attrs
|
||||
end_comments: end_comments
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue