Skip to content

Commit b044b71

Browse files
authored
fix: Fix resolveNamedType cannot resolve type parameter in contextual element (#2448)
1 parent a20c005 commit b044b71

File tree

4 files changed

+370
-69
lines changed

4 files changed

+370
-69
lines changed

src/resolver.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,14 @@ export class Resolver extends DiagnosticEmitter {
765765
}
766766
let defaultType = typeParameterNode.defaultType;
767767
if (defaultType) {
768-
let resolvedDefaultType = this.resolveType(defaultType, ctxFlow.actualFunction, contextualTypeArguments, reportMode);
768+
// Default parameters are resolved in context of the called function, not the calling function
769+
let defaultTypeContextualTypeArguments: Map<string, Type> | null = null;
770+
if (prototype.parent.kind == ElementKind.CLASS) {
771+
defaultTypeContextualTypeArguments = (<Class>prototype.parent).contextualTypeArguments;
772+
} else if (prototype.parent.kind == ElementKind.FUNCTION) {
773+
defaultTypeContextualTypeArguments = (<Function>prototype.parent).contextualTypeArguments;
774+
}
775+
let resolvedDefaultType = this.resolveType(defaultType, prototype, defaultTypeContextualTypeArguments, reportMode);
769776
if (!resolvedDefaultType) return null;
770777
resolvedTypeArguments[i] = resolvedDefaultType;
771778
continue;

tests/compiler/optional-typeparameters.debug.wat

+192-22
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@
2626
(global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0))
2727
(global $optional-typeparameters/tConcrete (mut i32) (i32.const 0))
2828
(global $optional-typeparameters/tDerived (mut i32) (i32.const 0))
29+
(global $optional-typeparameters/tMethodDerived (mut i32) (i32.const 0))
30+
(global $optional-typeparameters/tMethodDerived2 (mut i32) (i32.const 0))
2931
(global $~lib/rt/__rtti_base i32 (i32.const 416))
30-
(global $~lib/memory/__data_end i32 (i32.const 460))
31-
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 16844))
32-
(global $~lib/memory/__heap_base i32 (i32.const 16844))
32+
(global $~lib/memory/__data_end i32 (i32.const 484))
33+
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 16868))
34+
(global $~lib/memory/__heap_base i32 (i32.const 16868))
3335
(memory $0 1)
3436
(data (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00")
3537
(data (i32.const 76) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00")
@@ -39,7 +41,7 @@
3941
(data (i32.const 268) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00")
4042
(data (i32.const 320) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")
4143
(data (i32.const 348) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")
42-
(data (i32.const 416) "\05\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00")
44+
(data (i32.const 416) "\08\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\00\00\00\00 \00\00\00\00\00\00\00")
4345
(table $0 1 1 funcref)
4446
(elem $0 (i32.const 1))
4547
(export "memory" (memory $0))
@@ -2132,6 +2134,16 @@
21322134
local.get $b
21332135
f64.add
21342136
)
2137+
(func $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>> (param $this i32)
2138+
i32.const 6
2139+
i32.const 6
2140+
i32.eq
2141+
drop
2142+
)
2143+
(func $optional-typeparameters/TestMethodDerived2<f64>#foo (param $this i32) (param $v i32)
2144+
local.get $v
2145+
call $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>>
2146+
)
21352147
(func $~lib/rt/__visit_globals (param $0 i32)
21362148
(local $1 i32)
21372149
global.get $optional-typeparameters/tConcrete
@@ -2148,6 +2160,20 @@
21482160
local.get $0
21492161
call $~lib/rt/itcms/__visit
21502162
end
2163+
global.get $optional-typeparameters/tMethodDerived
2164+
local.tee $1
2165+
if
2166+
local.get $1
2167+
local.get $0
2168+
call $~lib/rt/itcms/__visit
2169+
end
2170+
global.get $optional-typeparameters/tMethodDerived2
2171+
local.tee $1
2172+
if
2173+
local.get $1
2174+
local.get $0
2175+
call $~lib/rt/itcms/__visit
2176+
end
21512177
i32.const 224
21522178
local.get $0
21532179
call $~lib/rt/itcms/__visit
@@ -2166,28 +2192,90 @@
21662192
call $~lib/rt/itcms/__visit
21672193
end
21682194
)
2195+
(func $~lib/array/Array<~lib/string/String>#__visit (param $this i32) (param $cookie i32)
2196+
(local $var$2 i32)
2197+
(local $var$3 i32)
2198+
(local $var$4 i32)
2199+
(local $val i32)
2200+
i32.const 1
2201+
drop
2202+
local.get $this
2203+
i32.load offset=4
2204+
local.set $var$2
2205+
local.get $var$2
2206+
local.get $this
2207+
i32.load offset=12
2208+
i32.const 2
2209+
i32.shl
2210+
i32.add
2211+
local.set $var$3
2212+
loop $while-continue|0
2213+
local.get $var$2
2214+
local.get $var$3
2215+
i32.lt_u
2216+
local.set $var$4
2217+
local.get $var$4
2218+
if
2219+
local.get $var$2
2220+
i32.load
2221+
local.set $val
2222+
local.get $val
2223+
if
2224+
local.get $val
2225+
local.get $cookie
2226+
call $~lib/rt/itcms/__visit
2227+
end
2228+
local.get $var$2
2229+
i32.const 4
2230+
i32.add
2231+
local.set $var$2
2232+
br $while-continue|0
2233+
end
2234+
end
2235+
local.get $this
2236+
i32.load
2237+
local.get $cookie
2238+
call $~lib/rt/itcms/__visit
2239+
)
2240+
(func $~lib/array/Array<~lib/string/String>~visit (param $0 i32) (param $1 i32)
2241+
local.get $0
2242+
local.get $1
2243+
call $~lib/array/Array<~lib/string/String>#__visit
2244+
)
21692245
(func $~lib/rt/__visit_members (param $0 i32) (param $1 i32)
21702246
block $invalid
2171-
block $optional-typeparameters/TestDerived<f64,f64>
2172-
block $optional-typeparameters/TestConcrete<i32,i32>
2173-
block $~lib/arraybuffer/ArrayBufferView
2174-
block $~lib/string/String
2175-
block $~lib/arraybuffer/ArrayBuffer
2247+
block $optional-typeparameters/TestMethodDerived2<f64>
2248+
block $~lib/array/Array<~lib/string/String>
2249+
block $optional-typeparameters/TestMethodDerived<~lib/string/String>
2250+
block $optional-typeparameters/TestDerived<f64,f64>
2251+
block $optional-typeparameters/TestConcrete<i32,i32>
2252+
block $~lib/arraybuffer/ArrayBufferView
2253+
block $~lib/string/String
2254+
block $~lib/arraybuffer/ArrayBuffer
2255+
local.get $0
2256+
i32.const 8
2257+
i32.sub
2258+
i32.load
2259+
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $optional-typeparameters/TestConcrete<i32,i32> $optional-typeparameters/TestDerived<f64,f64> $optional-typeparameters/TestMethodDerived<~lib/string/String> $~lib/array/Array<~lib/string/String> $optional-typeparameters/TestMethodDerived2<f64> $invalid
2260+
end
2261+
return
2262+
end
2263+
return
2264+
end
21762265
local.get $0
2177-
i32.const 8
2178-
i32.sub
2179-
i32.load
2180-
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $optional-typeparameters/TestConcrete<i32,i32> $optional-typeparameters/TestDerived<f64,f64> $invalid
2266+
local.get $1
2267+
call $~lib/arraybuffer/ArrayBufferView~visit
2268+
return
21812269
end
21822270
return
21832271
end
21842272
return
21852273
end
2186-
local.get $0
2187-
local.get $1
2188-
call $~lib/arraybuffer/ArrayBufferView~visit
21892274
return
21902275
end
2276+
local.get $0
2277+
local.get $1
2278+
call $~lib/array/Array<~lib/string/String>~visit
21912279
return
21922280
end
21932281
return
@@ -2202,8 +2290,8 @@
22022290
global.get $~lib/memory/__data_end
22032291
i32.lt_s
22042292
if
2205-
i32.const 16864
2206-
i32.const 16912
2293+
i32.const 16896
2294+
i32.const 16944
22072295
i32.const 1
22082296
i32.const 1
22092297
call $~lib/builtins/abort
@@ -2213,13 +2301,13 @@
22132301
(func $start:optional-typeparameters
22142302
(local $0 i32)
22152303
global.get $~lib/memory/__stack_pointer
2216-
i32.const 4
2304+
i32.const 8
22172305
i32.sub
22182306
global.set $~lib/memory/__stack_pointer
22192307
call $~stack_check
22202308
global.get $~lib/memory/__stack_pointer
2221-
i32.const 0
2222-
i32.store
2309+
i64.const 0
2310+
i64.store
22232311
i32.const 1
22242312
call $optional-typeparameters/testConcrete<i32,i32>
22252313
drop
@@ -2269,8 +2357,34 @@
22692357
f64.const 2
22702358
call $optional-typeparameters/TestDerived<f64,f64>#test<f64>
22712359
drop
2360+
i32.const 0
2361+
call $optional-typeparameters/TestMethodDerived<~lib/string/String>#constructor
2362+
global.set $optional-typeparameters/tMethodDerived
2363+
global.get $optional-typeparameters/tMethodDerived
2364+
local.set $0
22722365
global.get $~lib/memory/__stack_pointer
2273-
i32.const 4
2366+
local.get $0
2367+
i32.store
2368+
local.get $0
2369+
call $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>>
2370+
i32.const 0
2371+
call $optional-typeparameters/TestMethodDerived2<f64>#constructor
2372+
global.set $optional-typeparameters/tMethodDerived2
2373+
global.get $optional-typeparameters/tMethodDerived2
2374+
local.set $0
2375+
global.get $~lib/memory/__stack_pointer
2376+
local.get $0
2377+
i32.store
2378+
local.get $0
2379+
global.get $optional-typeparameters/tMethodDerived
2380+
local.set $0
2381+
global.get $~lib/memory/__stack_pointer
2382+
local.get $0
2383+
i32.store offset=4
2384+
local.get $0
2385+
call $optional-typeparameters/TestMethodDerived2<f64>#foo
2386+
global.get $~lib/memory/__stack_pointer
2387+
i32.const 8
22742388
i32.add
22752389
global.set $~lib/memory/__stack_pointer
22762390
)
@@ -2330,4 +2444,60 @@
23302444
global.set $~lib/memory/__stack_pointer
23312445
local.get $1
23322446
)
2447+
(func $optional-typeparameters/TestMethodDerived<~lib/string/String>#constructor (param $0 i32) (result i32)
2448+
(local $1 i32)
2449+
global.get $~lib/memory/__stack_pointer
2450+
i32.const 4
2451+
i32.sub
2452+
global.set $~lib/memory/__stack_pointer
2453+
call $~stack_check
2454+
global.get $~lib/memory/__stack_pointer
2455+
i32.const 0
2456+
i32.store
2457+
local.get $0
2458+
i32.eqz
2459+
if
2460+
global.get $~lib/memory/__stack_pointer
2461+
i32.const 0
2462+
i32.const 5
2463+
call $~lib/rt/itcms/__new
2464+
local.tee $0
2465+
i32.store
2466+
end
2467+
local.get $0
2468+
local.set $1
2469+
global.get $~lib/memory/__stack_pointer
2470+
i32.const 4
2471+
i32.add
2472+
global.set $~lib/memory/__stack_pointer
2473+
local.get $1
2474+
)
2475+
(func $optional-typeparameters/TestMethodDerived2<f64>#constructor (param $0 i32) (result i32)
2476+
(local $1 i32)
2477+
global.get $~lib/memory/__stack_pointer
2478+
i32.const 4
2479+
i32.sub
2480+
global.set $~lib/memory/__stack_pointer
2481+
call $~stack_check
2482+
global.get $~lib/memory/__stack_pointer
2483+
i32.const 0
2484+
i32.store
2485+
local.get $0
2486+
i32.eqz
2487+
if
2488+
global.get $~lib/memory/__stack_pointer
2489+
i32.const 0
2490+
i32.const 7
2491+
call $~lib/rt/itcms/__new
2492+
local.tee $0
2493+
i32.store
2494+
end
2495+
local.get $0
2496+
local.set $1
2497+
global.get $~lib/memory/__stack_pointer
2498+
i32.const 4
2499+
i32.add
2500+
global.set $~lib/memory/__stack_pointer
2501+
local.get $1
2502+
)
23332503
)

0 commit comments

Comments
 (0)