@@ -4308,6 +4308,51 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
43084308 }
43094309 if typ != ast.string_type || g.comptime.comptime_for_method != unsafe { nil } {
43104310 expr := node.args[0 ].expr
4311+ if expr is ast.ComptimeSelector {
4312+ if expr.typ_key != '' {
4313+ typ = g.type_resolver.get_ct_type_or_default (expr.typ_key, typ)
4314+ }
4315+ } else if expr is ast.ComptimeCall {
4316+ if expr.kind == .method {
4317+ sym := g.table.sym (g.unwrap_generic (expr.left_type))
4318+ if m := sym.find_method (g.comptime.comptime_for_method.name) {
4319+ typ = m.return_type
4320+ }
4321+ }
4322+ } else if expr is ast.Ident && expr.obj is ast.Var {
4323+ typ = expr.obj.typ
4324+ if expr.name in g.type_resolver.type_map {
4325+ resolved := g.type_resolver.get_ct_type_or_default (expr.name, typ)
4326+ if resolved != 0 && resolved != ast.void_type {
4327+ typ = resolved
4328+ }
4329+ }
4330+ if expr.ct_expr || expr.obj.ct_type_var != .no_comptime {
4331+ resolved := g.type_resolver.get_type_or_default (ast.Expr (expr), typ)
4332+ if resolved != 0 && resolved != ast.void_type {
4333+ typ = resolved
4334+ }
4335+ } else if g.cur_fn != unsafe { nil } && g.cur_concrete_types.len > 0 {
4336+ // In generic contexts, scope var types may be stale.
4337+ resolved := g.resolved_expr_type (expr, expr.obj.typ)
4338+ if resolved != 0 {
4339+ typ = resolved
4340+ }
4341+ }
4342+ if expr.obj.smartcasts.len > 0 {
4343+ typ = g.unwrap_generic (expr.obj.smartcasts.last ())
4344+ cast_sym := g.table.sym (typ)
4345+ if cast_sym.info is ast.Aggregate {
4346+ typ = cast_sym.info.types[g.aggregate_type_idx]
4347+ } else if expr.obj.ct_type_var == .smartcast {
4348+ typ = g.unwrap_generic (g.type_resolver.get_type (expr))
4349+ }
4350+ }
4351+ // handling println(var or { ... })
4352+ if typ.has_flag (.option) && expr.or_expr.kind != .absent {
4353+ typ = typ.clear_flag (.option)
4354+ }
4355+ }
43114356 typ_sym := g.table.sym (typ)
43124357 needs_tmp_string := ! typ.has_option_or_result ()
43134358 && (g.is_autofree || g.pref.gc_mode == .boehm_leak)
@@ -4341,40 +4386,6 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
43414386 g.writeln ('; builtin__${c_fn_name(print_method)} (${tmp} ); builtin__string_free(&${tmp} );' )
43424387 } else {
43434388 g.write ('builtin__${c_fn_name(print_method)} (' )
4344- if expr is ast.ComptimeSelector {
4345- if expr.typ_key != '' {
4346- typ = g.type_resolver.get_ct_type_or_default (expr.typ_key, typ)
4347- }
4348- } else if expr is ast.ComptimeCall {
4349- if expr.kind == .method {
4350- sym := g.table.sym (g.unwrap_generic (expr.left_type))
4351- if m := sym.find_method (g.comptime.comptime_for_method.name) {
4352- typ = m.return_type
4353- }
4354- }
4355- } else if expr is ast.Ident && expr.obj is ast.Var {
4356- typ = expr.obj.typ
4357- // In generic contexts, scope var types may be stale
4358- if g.cur_fn != unsafe { nil } && g.cur_concrete_types.len > 0 {
4359- resolved := g.resolved_expr_type (expr, expr.obj.typ)
4360- if resolved != 0 {
4361- typ = resolved
4362- }
4363- }
4364- if expr.obj.smartcasts.len > 0 {
4365- typ = g.unwrap_generic (expr.obj.smartcasts.last ())
4366- cast_sym := g.table.sym (typ)
4367- if cast_sym.info is ast.Aggregate {
4368- typ = cast_sym.info.types[g.aggregate_type_idx]
4369- } else if expr.obj.ct_type_var == .smartcast {
4370- typ = g.unwrap_generic (g.type_resolver.get_type (expr))
4371- }
4372- }
4373- // handling println( var or { ... })
4374- if typ.has_flag (.option) && expr.or_expr.kind != .absent {
4375- typ = typ.clear_flag (.option)
4376- }
4377- }
43784389 g.gen_expr_to_string (expr, typ)
43794390 g.write (')' )
43804391 }
0 commit comments