cgen: assoc
							parent
							
								
									3dc3b11435
								
							
						
					
					
						commit
						28309da1f1
					
				|  | @ -591,6 +591,7 @@ pub: | ||||||
| 
 | 
 | ||||||
| pub struct Assoc { | pub struct Assoc { | ||||||
| pub: | pub: | ||||||
|  | 	typ      table.Type | ||||||
| 	var_name string | 	var_name string | ||||||
| 	fields   []string | 	fields   []string | ||||||
| 	exprs    []Expr | 	exprs    []Expr | ||||||
|  |  | ||||||
|  | @ -1349,7 +1349,29 @@ fn (g mut Gen) const_decl(node ast.ConstDecl) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // { user | name: 'new name' }
 | // { user | name: 'new name' }
 | ||||||
| fn (g mut Gen) assoc(node ast.Assoc) {} | fn (g mut Gen) assoc(node ast.Assoc) { | ||||||
|  | 	if node.typ == 0 { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	g.writeln('// assoc') | ||||||
|  | 	styp := g.typ(node.typ) | ||||||
|  | 	g.writeln('($styp){') | ||||||
|  | 	for i, field in node.fields { | ||||||
|  | 		g.write('\t.$field = ') | ||||||
|  | 		g.expr(node.exprs[i]) | ||||||
|  | 		g.writeln(', ') | ||||||
|  | 	} | ||||||
|  | 	// Copy the rest of the fields.
 | ||||||
|  | 	sym := g.table.get_type_symbol(node.typ) | ||||||
|  | 	info := sym.info as table.Struct | ||||||
|  | 	for field in info.fields { | ||||||
|  | 		g.writeln('\t.$field.name = ${node.var_name}.$field.name,') | ||||||
|  | 	} | ||||||
|  | 	g.write('}') | ||||||
|  | 	if g.is_amp { | ||||||
|  | 		g.write(', sizeof($styp))') | ||||||
|  | 	} | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| fn (g mut Gen) call_args(args []ast.CallArg) { | fn (g mut Gen) call_args(args []ast.CallArg) { | ||||||
| 	for i, arg in args { | 	for i, arg in args { | ||||||
|  |  | ||||||
|  | @ -790,6 +790,10 @@ pub fn (p mut Parser) expr(precedence int) ast.Expr { | ||||||
| 			} | 			} | ||||||
| 			else { | 			else { | ||||||
| 				name := p.check_name() | 				name := p.check_name() | ||||||
|  | 				var := p.scope.find_var(name) or { | ||||||
|  | 					p.error('unknown variable `$name`') | ||||||
|  | 					return node | ||||||
|  | 				} | ||||||
| 				mut fields := []string | 				mut fields := []string | ||||||
| 				mut vals := []ast.Expr | 				mut vals := []ast.Expr | ||||||
| 				p.check(.pipe) | 				p.check(.pipe) | ||||||
|  | @ -810,6 +814,7 @@ pub fn (p mut Parser) expr(precedence int) ast.Expr { | ||||||
| 					fields: fields | 					fields: fields | ||||||
| 					exprs: vals | 					exprs: vals | ||||||
| 					pos: p.tok.position() | 					pos: p.tok.position() | ||||||
|  | 					typ: var.typ | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			p.check(.rcbr) | 			p.check(.rcbr) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue