checker: check sumtype common fields for mutability when assigning too
							parent
							
								
									a4df418a68
								
							
						
					
					
						commit
						96ef553f59
					
				| 
						 | 
				
			
			@ -1823,6 +1823,7 @@ fn (mut c Checker) fail_if_immutable(expr ast.Expr) (string, token.Position) {
 | 
			
		|||
									c.error('$expr_name must be added to the `lock` list above',
 | 
			
		||||
										expr.pos)
 | 
			
		||||
								}
 | 
			
		||||
								return '', expr.pos
 | 
			
		||||
							}
 | 
			
		||||
							to_lock = expr_name
 | 
			
		||||
							pos = expr.pos
 | 
			
		||||
| 
						 | 
				
			
			@ -1851,6 +1852,22 @@ fn (mut c Checker) fail_if_immutable(expr ast.Expr) (string, token.Position) {
 | 
			
		|||
						type_str := c.table.type_to_str(expr.expr_type)
 | 
			
		||||
						c.error('field `$expr.field_name` of interface `$type_str` is immutable',
 | 
			
		||||
							expr.pos)
 | 
			
		||||
						return '', expr.pos
 | 
			
		||||
					}
 | 
			
		||||
					c.fail_if_immutable(expr.expr)
 | 
			
		||||
				}
 | 
			
		||||
				.sum_type {
 | 
			
		||||
					sumtype_info := typ_sym.info as ast.SumType
 | 
			
		||||
					mut field_info := sumtype_info.find_field(expr.field_name) or {
 | 
			
		||||
						type_str := c.table.type_to_str(expr.expr_type)
 | 
			
		||||
						c.error('unknown field `${type_str}.$expr.field_name`', expr.pos)
 | 
			
		||||
						return '', pos
 | 
			
		||||
					}
 | 
			
		||||
					if !field_info.is_mut {
 | 
			
		||||
						type_str := c.table.type_to_str(expr.expr_type)
 | 
			
		||||
						c.error('field `$expr.field_name` of sumtype `$type_str` is immutable',
 | 
			
		||||
							expr.pos)
 | 
			
		||||
						return '', expr.pos
 | 
			
		||||
					}
 | 
			
		||||
					c.fail_if_immutable(expr.expr)
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			@ -1858,6 +1875,7 @@ fn (mut c Checker) fail_if_immutable(expr ast.Expr) (string, token.Position) {
 | 
			
		|||
					// This should only happen in `builtin`
 | 
			
		||||
					if c.file.mod.name != 'builtin' {
 | 
			
		||||
						c.error('`$typ_sym.kind` can not be modified', expr.pos)
 | 
			
		||||
						return '', expr.pos
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				.aggregate, .placeholder {
 | 
			
		||||
| 
						 | 
				
			
			@ -1865,6 +1883,7 @@ fn (mut c Checker) fail_if_immutable(expr ast.Expr) (string, token.Position) {
 | 
			
		|||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					c.error('unexpected symbol `$typ_sym.kind`', expr.pos)
 | 
			
		||||
					return '', expr.pos
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -1891,6 +1910,7 @@ fn (mut c Checker) fail_if_immutable(expr ast.Expr) (string, token.Position) {
 | 
			
		|||
		else {
 | 
			
		||||
			if !expr.is_lit() {
 | 
			
		||||
				c.error('unexpected expression `$expr.type_name()`', expr.position())
 | 
			
		||||
				return '', pos
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue