cgen: fix struct init with embed field update (#13444)
							parent
							
								
									7178367de0
								
							
						
					
					
						commit
						ae0e90f5d8
					
				|  | @ -409,6 +409,7 @@ pub mut: | |||
| 	update_expr          Expr | ||||
| 	update_expr_type     Type | ||||
| 	update_expr_comments []Comment | ||||
| 	is_update_embed      bool | ||||
| 	has_update_expr      bool | ||||
| 	fields               []StructInitField | ||||
| 	embeds               []StructInitEmbed | ||||
|  |  | |||
|  | @ -5456,6 +5456,7 @@ fn (mut g Gen) struct_init(node ast.StructInit) { | |||
| 					default_init := ast.StructInit{ | ||||
| 						...node | ||||
| 						typ: embed | ||||
| 						is_update_embed: true | ||||
| 						fields: init_fields_to_embed | ||||
| 					} | ||||
| 					inside_cast_in_heap := g.inside_cast_in_heap | ||||
|  | @ -5557,6 +5558,16 @@ fn (mut g Gen) struct_init(node ast.StructInit) { | |||
| 				} else { | ||||
| 					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) | ||||
| 			} else { | ||||
| 				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