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