gen: fix `arr.last().field` (#7076)

pull/7080/head^2
Enzo 2020-12-02 04:35:00 +01:00 committed by GitHub
parent ff26f0539c
commit d8b8aca51e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 1 deletions

View File

@ -1002,6 +1002,27 @@ fn test_array_string_pop() {
assert a.cap == 3 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] [direct_array_access]
fn test_direct_array_access() { fn test_direct_array_access() {

View File

@ -365,6 +365,7 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
if node.name == 'str' { if node.name == 'str' {
g.gen_str_for_type(node.receiver_type) g.gen_str_for_type(node.receiver_type)
} }
mut has_cast := false
// TODO performance, detect `array` method differently // TODO performance, detect `array` method differently
if left_sym.kind == .array && node.name in if left_sym.kind == .array && node.name in
['repeat', 'sort_with_compare', 'free', 'push_many', 'trim', 'first', 'last', 'pop', 'clone', 'reverse', 'slice'] { ['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' receiver_type_name = 'array'
if node.name in ['last', 'first', 'pop'] { if node.name in ['last', 'first', 'pop'] {
return_type_str := g.typ(node.return_type) 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') mut name := util.no_dots('${receiver_type_name}_$node.name')
@ -428,6 +430,9 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
} else { } else {
g.expr(node.left) 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 - is_variadic := node.expected_arg_types.len > 0 && node.expected_arg_types[node.expected_arg_types.len -
1].has_flag(.variadic) 1].has_flag(.variadic)
if node.args.len > 0 || is_variadic { if node.args.len > 0 || is_variadic {