all: support `volatile field Type` in struct declarations
parent
1a54817c81
commit
a27833ed0d
|
@ -267,6 +267,7 @@ pub:
|
||||||
default_val string
|
default_val string
|
||||||
is_mut bool
|
is_mut bool
|
||||||
is_global bool
|
is_global bool
|
||||||
|
is_volatile bool
|
||||||
pub mut:
|
pub mut:
|
||||||
default_expr Expr
|
default_expr Expr
|
||||||
default_expr_typ Type
|
default_expr_typ Type
|
||||||
|
|
|
@ -108,7 +108,8 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
||||||
after_type_comments := field.comments[(before_comments.len + between_comments.len)..]
|
after_type_comments := field.comments[(before_comments.len + between_comments.len)..]
|
||||||
// Handle comments before the field
|
// Handle comments before the field
|
||||||
f.comments_before_field(before_comments)
|
f.comments_before_field(before_comments)
|
||||||
f.write('\t$field.name ')
|
volatile_prefix := if field.is_volatile { 'volatile ' } else { '' }
|
||||||
|
f.write('\t$volatile_prefix$field.name ')
|
||||||
// Handle comments between field name and type
|
// Handle comments between field name and type
|
||||||
before_len := f.line_len
|
before_len := f.line_len
|
||||||
f.comments(between_comments, iembed: true, has_nl: false)
|
f.comments(between_comments, iembed: true, has_nl: false)
|
||||||
|
|
|
@ -6343,7 +6343,8 @@ fn (mut g Gen) write_types(types []ast.TypeSymbol) {
|
||||||
}
|
}
|
||||||
type_name := g.typ(field.typ)
|
type_name := g.typ(field.typ)
|
||||||
field_name := c_name(field.name)
|
field_name := c_name(field.name)
|
||||||
g.type_definitions.writeln('\t$type_name $field_name;')
|
volatile_prefix := if field.is_volatile { 'volatile ' } else { '' }
|
||||||
|
g.type_definitions.writeln('\t$volatile_prefix$type_name $field_name;')
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
g.type_definitions.writeln('\tEMPTY_STRUCT_DECLARATION;')
|
g.type_definitions.writeln('\tEMPTY_STRUCT_DECLARATION;')
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
volatile int *zzz = HEAP(int, (123));
|
volatile int *zzz = HEAP(int, (123));
|
||||||
volatile int* pzzz = &(*(zzz));
|
volatile int* pzzz = &(*(zzz));
|
||||||
|
volatile int a_volatile_field;
|
||||||
|
int a_non_volatile_field;
|
||||||
|
|
|
@ -1,2 +1,6 @@
|
||||||
123
|
123
|
||||||
&123
|
&123
|
||||||
|
Abc{
|
||||||
|
a_volatile_field: 0
|
||||||
|
a_non_volatile_field: 0
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
|
struct Abc {
|
||||||
|
volatile a_volatile_field int
|
||||||
|
a_non_volatile_field int
|
||||||
|
}
|
||||||
|
|
||||||
mut volatile zzz := 123
|
mut volatile zzz := 123
|
||||||
mut volatile pzzz := &zzz
|
mut volatile pzzz := &zzz
|
||||||
println(zzz)
|
println(zzz)
|
||||||
println(&int(voidptr(pzzz)))
|
println(&int(voidptr(pzzz)))
|
||||||
|
println(Abc{})
|
||||||
|
|
|
@ -170,6 +170,11 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
field_start_pos := p.tok.position()
|
field_start_pos := p.tok.position()
|
||||||
|
mut is_field_volatile := false
|
||||||
|
if p.tok.kind == .key_volatile {
|
||||||
|
p.next()
|
||||||
|
is_field_volatile = true
|
||||||
|
}
|
||||||
is_embed := ((p.tok.lit.len > 1 && p.tok.lit[0].is_capital())
|
is_embed := ((p.tok.lit.len > 1 && p.tok.lit[0].is_capital())
|
||||||
|| p.peek_tok.kind == .dot) && language == .v && p.peek_tok.kind != .key_fn
|
|| p.peek_tok.kind == .dot) && language == .v && p.peek_tok.kind != .key_fn
|
||||||
is_on_top := ast_fields.len == 0 && !(is_field_mut || is_field_global)
|
is_on_top := ast_fields.len == 0 && !(is_field_mut || is_field_global)
|
||||||
|
@ -255,6 +260,7 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
|
||||||
is_pub: is_embed || is_field_pub
|
is_pub: is_embed || is_field_pub
|
||||||
is_mut: is_embed || is_field_mut
|
is_mut: is_embed || is_field_mut
|
||||||
is_global: is_field_global
|
is_global: is_field_global
|
||||||
|
is_volatile: is_field_volatile
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// save embeds as table fields too, it will be used in generation phase
|
// save embeds as table fields too, it will be used in generation phase
|
||||||
|
@ -270,6 +276,7 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
|
||||||
is_pub: is_embed || is_field_pub
|
is_pub: is_embed || is_field_pub
|
||||||
is_mut: is_embed || is_field_mut
|
is_mut: is_embed || is_field_mut
|
||||||
is_global: is_field_global
|
is_global: is_field_global
|
||||||
|
is_volatile: is_field_volatile
|
||||||
}
|
}
|
||||||
p.attrs = []
|
p.attrs = []
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue