checker: add comptime_selector() (#14286)
							parent
							
								
									6cf707261d
								
							
						
					
					
						commit
						ca2ab70c8b
					
				| 
						 | 
				
			
			@ -2663,28 +2663,7 @@ pub fn (mut c Checker) expr(node_ ast.Expr) ast.Type {
 | 
			
		|||
			return c.comptime_call(mut node)
 | 
			
		||||
		}
 | 
			
		||||
		ast.ComptimeSelector {
 | 
			
		||||
			node.left_type = c.expr(node.left)
 | 
			
		||||
			expr_type := c.unwrap_generic(c.expr(node.field_expr))
 | 
			
		||||
			expr_sym := c.table.sym(expr_type)
 | 
			
		||||
			if expr_type != ast.string_type {
 | 
			
		||||
				c.error('expected `string` instead of `$expr_sym.name` (e.g. `field.name`)',
 | 
			
		||||
					node.field_expr.pos())
 | 
			
		||||
			}
 | 
			
		||||
			if mut node.field_expr is ast.SelectorExpr {
 | 
			
		||||
				left_pos := node.field_expr.expr.pos()
 | 
			
		||||
				if c.comptime_fields_type.len == 0 {
 | 
			
		||||
					c.error('compile time field access can only be used when iterating over `T.fields`',
 | 
			
		||||
						left_pos)
 | 
			
		||||
				}
 | 
			
		||||
				expr_name := node.field_expr.expr.str()
 | 
			
		||||
				if expr_name in c.comptime_fields_type {
 | 
			
		||||
					return c.comptime_fields_type[expr_name]
 | 
			
		||||
				}
 | 
			
		||||
				c.error('unknown `\$for` variable `$expr_name`', left_pos)
 | 
			
		||||
			} else {
 | 
			
		||||
				c.error('expected selector expression e.g. `$(field.name)`', node.field_expr.pos())
 | 
			
		||||
			}
 | 
			
		||||
			return ast.void_type
 | 
			
		||||
			return c.comptime_selector(mut node)
 | 
			
		||||
		}
 | 
			
		||||
		ast.ConcatExpr {
 | 
			
		||||
			return c.concat_expr(mut node)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -90,6 +90,30 @@ fn (mut c Checker) comptime_call(mut node ast.ComptimeCall) ast.Type {
 | 
			
		|||
	return f.return_type
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn (mut c Checker) comptime_selector(mut node ast.ComptimeSelector) ast.Type {
 | 
			
		||||
	node.left_type = c.expr(node.left)
 | 
			
		||||
	expr_type := c.unwrap_generic(c.expr(node.field_expr))
 | 
			
		||||
	expr_sym := c.table.sym(expr_type)
 | 
			
		||||
	if expr_type != ast.string_type {
 | 
			
		||||
		c.error('expected `string` instead of `$expr_sym.name` (e.g. `field.name`)', node.field_expr.pos())
 | 
			
		||||
	}
 | 
			
		||||
	if mut node.field_expr is ast.SelectorExpr {
 | 
			
		||||
		left_pos := node.field_expr.expr.pos()
 | 
			
		||||
		if c.comptime_fields_type.len == 0 {
 | 
			
		||||
			c.error('compile time field access can only be used when iterating over `T.fields`',
 | 
			
		||||
				left_pos)
 | 
			
		||||
		}
 | 
			
		||||
		expr_name := node.field_expr.expr.str()
 | 
			
		||||
		if expr_name in c.comptime_fields_type {
 | 
			
		||||
			return c.comptime_fields_type[expr_name]
 | 
			
		||||
		}
 | 
			
		||||
		c.error('unknown `\$for` variable `$expr_name`', left_pos)
 | 
			
		||||
	} else {
 | 
			
		||||
		c.error('expected selector expression e.g. `$(field.name)`', node.field_expr.pos())
 | 
			
		||||
	}
 | 
			
		||||
	return ast.void_type
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn (mut c Checker) comptime_for(node ast.ComptimeFor) {
 | 
			
		||||
	typ := c.unwrap_generic(node.typ)
 | 
			
		||||
	sym := c.table.sym(typ)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue