checker: add checks for map key/value types (#6283)
							parent
							
								
									81778e507f
								
							
						
					
					
						commit
						8ef55bd8c9
					
				| 
						 | 
					@ -343,6 +343,17 @@ pub fn (mut c Checker) struct_decl(decl ast.StructDecl) {
 | 
				
			||||||
					field.pos)
 | 
										field.pos)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if sym.kind == .map {
 | 
				
			||||||
 | 
								info := sym.map_info()
 | 
				
			||||||
 | 
								key_sym := c.table.get_type_symbol(info.key_type)
 | 
				
			||||||
 | 
								value_sym := c.table.get_type_symbol(info.value_type)
 | 
				
			||||||
 | 
								if key_sym.kind == .placeholder {
 | 
				
			||||||
 | 
									c.error('unknown type `$key_sym.source_name`', field.pos)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if value_sym.kind == .placeholder {
 | 
				
			||||||
 | 
									c.error('unknown type `$value_sym.source_name`', field.pos)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if field.has_default_expr {
 | 
							if field.has_default_expr {
 | 
				
			||||||
			c.expected_type = field.typ
 | 
								c.expected_type = field.typ
 | 
				
			||||||
			field_expr_type := c.expr(field.default_expr)
 | 
								field_expr_type := c.expr(field.default_expr)
 | 
				
			||||||
| 
						 | 
					@ -3365,6 +3376,14 @@ pub fn (mut c Checker) map_init(mut node ast.MapInit) table.Type {
 | 
				
			||||||
	// `x ;= map[string]string` - set in parser
 | 
						// `x ;= map[string]string` - set in parser
 | 
				
			||||||
	if node.typ != 0 {
 | 
						if node.typ != 0 {
 | 
				
			||||||
		info := c.table.get_type_symbol(node.typ).map_info()
 | 
							info := c.table.get_type_symbol(node.typ).map_info()
 | 
				
			||||||
 | 
							key_sym := c.table.get_type_symbol(info.key_type)
 | 
				
			||||||
 | 
							value_sym := c.table.get_type_symbol(info.value_type)
 | 
				
			||||||
 | 
							if key_sym.kind == .placeholder {
 | 
				
			||||||
 | 
								c.error('unknown type `$key_sym.source_name`', node.pos)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if value_sym.kind == .placeholder {
 | 
				
			||||||
 | 
								c.error('unknown type `$value_sym.source_name`', node.pos)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		node.key_type = info.key_type
 | 
							node.key_type = info.key_type
 | 
				
			||||||
		node.value_type = info.value_type
 | 
							node.value_type = info.value_type
 | 
				
			||||||
		return node.typ
 | 
							return node.typ
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,5 @@
 | 
				
			||||||
 | 
					vlib/v/checker/tests/map_unknown_value.vv:2:5: error: unknown type `DoesNotExist`
 | 
				
			||||||
 | 
					    1 | struct App {
 | 
				
			||||||
 | 
					    2 |     my_map map[string]DoesNotExist
 | 
				
			||||||
 | 
					      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					    3 | }
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					struct App {
 | 
				
			||||||
 | 
					    my_map map[string]DoesNotExist
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue