@@ -1158,14 +1158,22 @@ fn (mut g Gen) change_comptime_args(func ast.Fn, mut node_ ast.CallExpr, concret
1158
1158
return comptime_args
1159
1159
}
1160
1160
1161
- fn (mut g Gen) method_call (node ast.CallExpr) {
1162
- // TODO: there are still due to unchecked exprs (opt/some fn arg )
1163
- if node. left_type == 0 {
1164
- g. checker_bug ( 'CallExpr.left_type is 0 in method_call' , node.pos)
1161
+ fn (mut g Gen) resolve_receiver_name (node ast.CallExpr, unwrapped_rec_type ast.Type, final_left_sym ast.TypeSymbol, left_sym ast.TypeSymbol, typ_sym ast.TypeSymbol) string {
1162
+ mut receiver_type_name := util. no_dots (g. cc_type (unwrapped_rec_type, false ) )
1163
+ if final_left_sym. kind == . map && node.name in [ 'clone' , 'move' ] {
1164
+ receiver_type_name = 'map'
1165
1165
}
1166
- if node.receiver_type == 0 {
1167
- g.checker_bug ('CallExpr.receiver_type is 0 in method_call' , node.pos)
1166
+ if final_left_sym.kind == .array && ! (left_sym.kind == .alias && left_sym.has_method (node.name))
1167
+ && node.name in ['clear' , 'repeat' , 'sort_with_compare' , 'sorted_with_compare' , 'free' , 'push_many' , 'trim' , 'first' , 'last' , 'pop' , 'clone' , 'reverse' , 'slice' , 'pointers' ] {
1168
+ if ! (left_sym.info is ast.Alias && typ_sym.has_method (node.name)) {
1169
+ // `array_Xyz_clone` => `array_clone`
1170
+ receiver_type_name = 'array'
1171
+ }
1168
1172
}
1173
+ return receiver_type_name
1174
+ }
1175
+
1176
+ fn (mut g Gen) resolve_receiver_type (node ast.CallExpr) (ast.Type, & ast.TypeSymbol) {
1169
1177
left_type := g.unwrap_generic (node.left_type)
1170
1178
mut unwrapped_rec_type := node.receiver_type
1171
1179
if g.cur_fn != unsafe { nil } && g.cur_fn.generic_names.len > 0 { // in generic fn
@@ -1215,9 +1223,23 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
1215
1223
unwrapped_rec_type = node.from_embed_types.last ()
1216
1224
typ_sym = g.table.sym (unwrapped_rec_type)
1217
1225
}
1226
+ return unwrapped_rec_type, typ_sym
1227
+ }
1228
+
1229
+ fn (mut g Gen) method_call (node ast.CallExpr) {
1230
+ // TODO: there are still due to unchecked exprs (opt/some fn arg)
1231
+ if node.left_type == 0 {
1232
+ g.checker_bug ('CallExpr.left_type is 0 in method_call' , node.pos)
1233
+ }
1234
+ if node.receiver_type == 0 {
1235
+ g.checker_bug ('CallExpr.receiver_type is 0 in method_call' , node.pos)
1236
+ }
1237
+ left_type := g.unwrap_generic (node.left_type)
1238
+ mut unwrapped_rec_type , typ_sym := g.resolve_receiver_type (node)
1239
+
1218
1240
rec_cc_type := g.cc_type (unwrapped_rec_type, false )
1219
1241
mut receiver_type_name := util.no_dots (rec_cc_type)
1220
- if mut typ_sym.info is ast.Interface && typ_sym.info.defines_method (node.name) {
1242
+ if typ_sym.info is ast.Interface && typ_sym.info.defines_method (node.name) {
1221
1243
// Speaker_name_table[s._interface_idx].speak(s._object)
1222
1244
$if debug_interface_method_call ? {
1223
1245
eprintln ('>>> interface typ_sym.name: ${typ_sym.name} | receiver_type_name: ${receiver_type_name} | pos: ${node.pos} ' )
@@ -1306,15 +1328,11 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
1306
1328
g.get_free_method (rec_type)
1307
1329
}
1308
1330
mut has_cast := false
1309
- if final_left_sym. kind == . map && node.name in [ 'clone' , 'move' ] {
1310
- receiver_type_name = 'map'
1311
- }
1331
+
1332
+ receiver_type_name = g. resolve_receiver_name (node, unwrapped_rec_type, final_left_sym,
1333
+ left_sym, typ_sym)
1312
1334
if final_left_sym.kind == .array && ! (left_sym.kind == .alias && left_sym.has_method (node.name))
1313
1335
&& node.name in ['clear' , 'repeat' , 'sort_with_compare' , 'sorted_with_compare' , 'free' , 'push_many' , 'trim' , 'first' , 'last' , 'pop' , 'clone' , 'reverse' , 'slice' , 'pointers' ] {
1314
- if ! (left_sym.info is ast.Alias && typ_sym.has_method (node.name)) {
1315
- // `array_Xyz_clone` => `array_clone`
1316
- receiver_type_name = 'array'
1317
- }
1318
1336
if node.name in ['last' , 'first' , 'pop' ] {
1319
1337
return_type_str := g.typ (node.return_type)
1320
1338
has_cast = true
0 commit comments