gen: fix `arr.last().field` (#7076)
							parent
							
								
									ff26f0539c
								
							
						
					
					
						commit
						d8b8aca51e
					
				|  | @ -1002,6 +1002,27 @@ fn test_array_string_pop() { | |||
| 	assert a.cap == 3 | ||||
| } | ||||
| 
 | ||||
| fn test_array_first() { | ||||
| 	a := [3] | ||||
| 	assert a.first() == 3 | ||||
| 	b := [1, 2, 3, 4] | ||||
| 	assert b.first() == 1 | ||||
| 	c := ['abc', 'def'] | ||||
| 	assert c.first()[0] == `a` | ||||
| 	s := [Chunk{'a'}] | ||||
| 	assert s.first().val == 'a' | ||||
| } | ||||
| 
 | ||||
| fn test_array_last() { | ||||
| 	a := [3] | ||||
| 	assert a.last() == 3 | ||||
| 	b := [1, 2, 3, 4] | ||||
| 	assert b.last() == 4 | ||||
| 	c := ['abc', 'def'] | ||||
| 	assert c.last()[0] == `d` | ||||
| 	s := [Chunk{'a'}] | ||||
| 	assert s.last().val == 'a' | ||||
| } | ||||
| 
 | ||||
| [direct_array_access] | ||||
| fn test_direct_array_access() { | ||||
|  |  | |||
|  | @ -365,6 +365,7 @@ fn (mut g Gen) method_call(node ast.CallExpr) { | |||
| 	if node.name == 'str' { | ||||
| 		g.gen_str_for_type(node.receiver_type) | ||||
| 	} | ||||
| 	mut has_cast := false | ||||
| 	// TODO performance, detect `array` method differently
 | ||||
| 	if left_sym.kind == .array && node.name in | ||||
| 		['repeat', 'sort_with_compare', 'free', 'push_many', 'trim', 'first', 'last', 'pop', 'clone', 'reverse', 'slice'] { | ||||
|  | @ -374,7 +375,8 @@ fn (mut g Gen) method_call(node ast.CallExpr) { | |||
| 		receiver_type_name = 'array' | ||||
| 		if node.name in ['last', 'first', 'pop'] { | ||||
| 			return_type_str := g.typ(node.return_type) | ||||
| 			g.write('*($return_type_str*)') | ||||
| 			has_cast = true | ||||
| 			g.write('(*($return_type_str*)') | ||||
| 		} | ||||
| 	} | ||||
| 	mut name := util.no_dots('${receiver_type_name}_$node.name') | ||||
|  | @ -428,6 +430,9 @@ fn (mut g Gen) method_call(node ast.CallExpr) { | |||
| 	} else { | ||||
| 		g.expr(node.left) | ||||
| 	} | ||||
| 	if has_cast { | ||||
| 		g.write(')') | ||||
| 	} | ||||
| 	is_variadic := node.expected_arg_types.len > 0 && node.expected_arg_types[node.expected_arg_types.len - | ||||
| 		1].has_flag(.variadic) | ||||
| 	if node.args.len > 0 || is_variadic { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue