all: support `volatile field Type` in struct declarations
							parent
							
								
									1a54817c81
								
							
						
					
					
						commit
						a27833ed0d
					
				| 
						 | 
				
			
			@ -267,6 +267,7 @@ pub:
 | 
			
		|||
	default_val      string
 | 
			
		||||
	is_mut           bool
 | 
			
		||||
	is_global        bool
 | 
			
		||||
	is_volatile      bool
 | 
			
		||||
pub mut:
 | 
			
		||||
	default_expr     Expr
 | 
			
		||||
	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)..]
 | 
			
		||||
		// Handle comments before the field
 | 
			
		||||
		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
 | 
			
		||||
		before_len := f.line_len
 | 
			
		||||
		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)
 | 
			
		||||
						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 {
 | 
			
		||||
					g.type_definitions.writeln('\tEMPTY_STRUCT_DECLARATION;')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,2 +1,4 @@
 | 
			
		|||
volatile int *zzz = HEAP(int, (123));
 | 
			
		||||
volatile int* pzzz = &(*(zzz));
 | 
			
		||||
volatile int a_volatile_field;
 | 
			
		||||
int a_non_volatile_field;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,2 +1,6 @@
 | 
			
		|||
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 pzzz := &zzz
 | 
			
		||||
println(zzz)
 | 
			
		||||
println(&int(voidptr(pzzz)))
 | 
			
		||||
println(Abc{})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -170,6 +170,11 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
 | 
			
		|||
				}
 | 
			
		||||
			}
 | 
			
		||||
			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())
 | 
			
		||||
				|| 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)
 | 
			
		||||
| 
						 | 
				
			
			@ -255,6 +260,7 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
 | 
			
		|||
					is_pub: is_embed || is_field_pub
 | 
			
		||||
					is_mut: is_embed || is_field_mut
 | 
			
		||||
					is_global: is_field_global
 | 
			
		||||
					is_volatile: is_field_volatile
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			// 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_mut: is_embed || is_field_mut
 | 
			
		||||
				is_global: is_field_global
 | 
			
		||||
				is_volatile: is_field_volatile
 | 
			
		||||
			}
 | 
			
		||||
			p.attrs = []
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue