cgen: fix struct init with embed field update (#13444)
							parent
							
								
									7178367de0
								
							
						
					
					
						commit
						ae0e90f5d8
					
				|  | @ -409,6 +409,7 @@ pub mut: | ||||||
| 	update_expr          Expr | 	update_expr          Expr | ||||||
| 	update_expr_type     Type | 	update_expr_type     Type | ||||||
| 	update_expr_comments []Comment | 	update_expr_comments []Comment | ||||||
|  | 	is_update_embed      bool | ||||||
| 	has_update_expr      bool | 	has_update_expr      bool | ||||||
| 	fields               []StructInitField | 	fields               []StructInitField | ||||||
| 	embeds               []StructInitEmbed | 	embeds               []StructInitEmbed | ||||||
|  |  | ||||||
|  | @ -5456,6 +5456,7 @@ fn (mut g Gen) struct_init(node ast.StructInit) { | ||||||
| 					default_init := ast.StructInit{ | 					default_init := ast.StructInit{ | ||||||
| 						...node | 						...node | ||||||
| 						typ: embed | 						typ: embed | ||||||
|  | 						is_update_embed: true | ||||||
| 						fields: init_fields_to_embed | 						fields: init_fields_to_embed | ||||||
| 					} | 					} | ||||||
| 					inside_cast_in_heap := g.inside_cast_in_heap | 					inside_cast_in_heap := g.inside_cast_in_heap | ||||||
|  | @ -5557,6 +5558,16 @@ fn (mut g Gen) struct_init(node ast.StructInit) { | ||||||
| 				} else { | 				} else { | ||||||
| 					g.write('.') | 					g.write('.') | ||||||
| 				} | 				} | ||||||
|  | 				if node.is_update_embed { | ||||||
|  | 					embed_sym := g.table.sym(node.typ) | ||||||
|  | 					embed_name := embed_sym.embed_name() | ||||||
|  | 					g.write(embed_name) | ||||||
|  | 					if node.typ.is_ptr() { | ||||||
|  | 						g.write('->') | ||||||
|  | 					} else { | ||||||
|  | 						g.write('.') | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
| 				g.write(field.name) | 				g.write(field.name) | ||||||
| 			} else { | 			} else { | ||||||
| 				if !g.zero_struct_field(field) { | 				if !g.zero_struct_field(field) { | ||||||
|  |  | ||||||
|  | @ -0,0 +1,32 @@ | ||||||
|  | struct Button { | ||||||
|  | 	width  int | ||||||
|  | 	height int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | enum Color { | ||||||
|  | 	red | ||||||
|  | 	blue | ||||||
|  | 	yellow | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct ColoredButton { | ||||||
|  | 	Button | ||||||
|  | 	color Color | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn change_color(cb ColoredButton, color Color) ColoredButton { | ||||||
|  | 	return ColoredButton{ | ||||||
|  | 		...cb | ||||||
|  | 		color: color | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn test_struct_update_with_embed_field() { | ||||||
|  | 	red_button := ColoredButton{Button{100, 100}, .red} | ||||||
|  | 	blue_button := change_color(red_button, .blue) | ||||||
|  | 
 | ||||||
|  | 	println(red_button) | ||||||
|  | 	println(blue_button) | ||||||
|  | 
 | ||||||
|  | 	assert blue_button == ColoredButton{Button{100, 100}, .blue} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue