parser: map or block; checker: require ref field init
							parent
							
								
									3a86f27b9f
								
							
						
					
					
						commit
						1f74f83bc6
					
				|  | @ -429,7 +429,7 @@ fn test_modify_map_value() { | ||||||
| 
 | 
 | ||||||
| fn test_map_clone() { | fn test_map_clone() { | ||||||
| 	mut nums := { | 	mut nums := { | ||||||
| 		'foo': 1, | 		'foo': 1 | ||||||
| 		'bar': 2 | 		'bar': 2 | ||||||
| 	} | 	} | ||||||
| 	mut nums2 := nums.clone() | 	mut nums2 := nums.clone() | ||||||
|  | @ -453,3 +453,12 @@ fn test_map_default_zero() { | ||||||
| 	println(x) | 	println(x) | ||||||
| 	assert x == '' | 	assert x == '' | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | fn test_map_or() { | ||||||
|  | 	m := { | ||||||
|  | 		'first':  1 | ||||||
|  | 		'second': 2 | ||||||
|  | 		'third':  3 | ||||||
|  | 	} | ||||||
|  | 	// num := m['first'] or { return }
 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -524,6 +524,7 @@ pub: | ||||||
| 	pos       token.Position | 	pos       token.Position | ||||||
| 	left      Expr | 	left      Expr | ||||||
| 	index     Expr // [0], RangeExpr [start..end] or map[key]
 | 	index     Expr // [0], RangeExpr [start..end] or map[key]
 | ||||||
|  | 	or_expr   OrExpr | ||||||
| pub mut: | pub mut: | ||||||
| 	left_type table.Type // array, map, fixed array
 | 	left_type table.Type // array, map, fixed array
 | ||||||
| 	is_setter bool | 	is_setter bool | ||||||
|  |  | ||||||
|  | @ -591,7 +591,7 @@ pub fn (mut c Checker) struct_init(mut struct_init ast.StructInit) table.Type { | ||||||
| 					continue | 					continue | ||||||
| 				} | 				} | ||||||
| 				if field.typ.is_ptr() && !c.pref.translated { | 				if field.typ.is_ptr() && !c.pref.translated { | ||||||
| 					c.warn('reference field `${type_sym.name}.$field.name` must be initialized', | 					c.error('reference field `${type_sym.name}.$field.name` must be initialized', | ||||||
| 						struct_init.pos) | 						struct_init.pos) | ||||||
| 				} | 				} | ||||||
| 				// Check for `[required]` struct attr
 | 				// Check for `[required]` struct attr
 | ||||||
|  |  | ||||||
|  | @ -54,7 +54,7 @@ pub fn (mut p Parser) call_expr(language table.Language, mod string) ast.CallExp | ||||||
| 		p.next() | 		p.next() | ||||||
| 	} | 	} | ||||||
| 	pos := first_pos.extend(last_pos) | 	pos := first_pos.extend(last_pos) | ||||||
| 	mut or_stmts := []ast.Stmt{} | 	mut or_stmts := []ast.Stmt{} // TODO remove unnecessary allocations by just using .absent
 | ||||||
| 	mut or_pos := p.tok.position() | 	mut or_pos := p.tok.position() | ||||||
| 	if p.tok.kind == .key_orelse { | 	if p.tok.kind == .key_orelse { | ||||||
| 		// `foo() or {}``
 | 		// `foo() or {}``
 | ||||||
|  |  | ||||||
|  | @ -1326,10 +1326,34 @@ fn (mut p Parser) index_expr(left ast.Expr) ast.IndexExpr { | ||||||
| 	// [expr]
 | 	// [expr]
 | ||||||
| 	pos := start_pos.extend(p.tok.position()) | 	pos := start_pos.extend(p.tok.position()) | ||||||
| 	p.check(.rsbr) | 	p.check(.rsbr) | ||||||
|  | 	// a[i] or { ... }
 | ||||||
|  | 	if p.tok.kind == .key_orelse { | ||||||
|  | 		was_inside_or_expr := p.inside_or_expr | ||||||
|  | 		mut or_pos := p.tok.position() | ||||||
|  | 		p.next() | ||||||
|  | 		p.open_scope() | ||||||
|  | 		or_stmts := p.parse_block_no_scope(false) | ||||||
|  | 		or_pos = or_pos.extend(p.prev_tok.position()) | ||||||
|  | 		p.close_scope() | ||||||
|  | 		p.inside_or_expr = was_inside_or_expr | ||||||
| 		return ast.IndexExpr{ | 		return ast.IndexExpr{ | ||||||
| 			left: left | 			left: left | ||||||
| 			index: expr | 			index: expr | ||||||
| 			pos: pos | 			pos: pos | ||||||
|  | 			or_expr: ast.OrExpr{ | ||||||
|  | 				kind: .block | ||||||
|  | 				stmts: or_stmts | ||||||
|  | 				pos: or_pos | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return ast.IndexExpr{ | ||||||
|  | 		left: left | ||||||
|  | 		index: expr | ||||||
|  | 		pos: pos | ||||||
|  | 		or_expr: ast.OrExpr{ | ||||||
|  | 			kind: .absent | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -244,7 +244,7 @@ pub fn (mut p Parser) expr(precedence int) ast.Expr { | ||||||
| 		else { | 		else { | ||||||
| 			if p.tok.kind != .eof { | 			if p.tok.kind != .eof { | ||||||
| 				// eof should be handled where it happens
 | 				// eof should be handled where it happens
 | ||||||
| 				p.error_with_pos('invalid expression: unexpected $p.tok.kind.str() token', | 				p.error_with_pos('invalid expression: unexpected `$p.tok.kind.str()` token', | ||||||
| 					p.tok.position()) | 					p.tok.position()) | ||||||
| 				return ast.Expr{} | 				return ast.Expr{} | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue