Skip to content

fix: Fix resolveNamedType cannot resolve type parameter in contextual element #2448

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

9 changes: 8 additions & 1 deletion src/resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -763,7 +763,14 @@ export class Resolver extends DiagnosticEmitter {
}
let defaultType = typeParameterNode.defaultType;
if (defaultType) {
let resolvedDefaultType = this.resolveType(defaultType, ctxFlow.actualFunction, contextualTypeArguments, reportMode);
// Default parameters are resolved in context of the called function, not the calling function
let defaultTypeContextualTypeArguments: Map<string, Type> | null = null;
if (prototype.parent.kind == ElementKind.CLASS) {
defaultTypeContextualTypeArguments = (<Class>prototype.parent).contextualTypeArguments;
} else if (prototype.parent.kind == ElementKind.FUNCTION) {
defaultTypeContextualTypeArguments = (<Function>prototype.parent).contextualTypeArguments;
}
let resolvedDefaultType = this.resolveType(defaultType, prototype, defaultTypeContextualTypeArguments, reportMode);
if (!resolvedDefaultType) return null;
resolvedTypeArguments[i] = resolvedDefaultType;
continue;
Expand Down
214 changes: 192 additions & 22 deletions tests/compiler/optional-typeparameters.debug.wat
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,12 @@
(global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0))
(global $optional-typeparameters/tConcrete (mut i32) (i32.const 0))
(global $optional-typeparameters/tDerived (mut i32) (i32.const 0))
(global $optional-typeparameters/tMethodDerived (mut i32) (i32.const 0))
(global $optional-typeparameters/tMethodDerived2 (mut i32) (i32.const 0))
(global $~lib/rt/__rtti_base i32 (i32.const 416))
(global $~lib/memory/__data_end i32 (i32.const 460))
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 16844))
(global $~lib/memory/__heap_base i32 (i32.const 16844))
(global $~lib/memory/__data_end i32 (i32.const 484))
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 16868))
(global $~lib/memory/__heap_base i32 (i32.const 16868))
(memory $0 1)
(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")
(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")
Expand All @@ -39,7 +41,7 @@
(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")
(data (i32.const 320) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")
(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")
(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")
(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")
(table $0 1 1 funcref)
(elem $0 (i32.const 1))
(export "memory" (memory $0))
Expand Down Expand Up @@ -2132,6 +2134,16 @@
local.get $b
f64.add
)
(func $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>> (param $this i32)
i32.const 6
i32.const 6
i32.eq
drop
)
(func $optional-typeparameters/TestMethodDerived2<f64>#foo (param $this i32) (param $v i32)
local.get $v
call $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>>
)
(func $~lib/rt/__visit_globals (param $0 i32)
(local $1 i32)
global.get $optional-typeparameters/tConcrete
Expand All @@ -2148,6 +2160,20 @@
local.get $0
call $~lib/rt/itcms/__visit
end
global.get $optional-typeparameters/tMethodDerived
local.tee $1
if
local.get $1
local.get $0
call $~lib/rt/itcms/__visit
end
global.get $optional-typeparameters/tMethodDerived2
local.tee $1
if
local.get $1
local.get $0
call $~lib/rt/itcms/__visit
end
i32.const 224
local.get $0
call $~lib/rt/itcms/__visit
Expand All @@ -2166,28 +2192,90 @@
call $~lib/rt/itcms/__visit
end
)
(func $~lib/array/Array<~lib/string/String>#__visit (param $this i32) (param $cookie i32)
(local $var$2 i32)
(local $var$3 i32)
(local $var$4 i32)
(local $val i32)
i32.const 1
drop
local.get $this
i32.load offset=4
local.set $var$2
local.get $var$2
local.get $this
i32.load offset=12
i32.const 2
i32.shl
i32.add
local.set $var$3
loop $while-continue|0
local.get $var$2
local.get $var$3
i32.lt_u
local.set $var$4
local.get $var$4
if
local.get $var$2
i32.load
local.set $val
local.get $val
if
local.get $val
local.get $cookie
call $~lib/rt/itcms/__visit
end
local.get $var$2
i32.const 4
i32.add
local.set $var$2
br $while-continue|0
end
end
local.get $this
i32.load
local.get $cookie
call $~lib/rt/itcms/__visit
)
(func $~lib/array/Array<~lib/string/String>~visit (param $0 i32) (param $1 i32)
local.get $0
local.get $1
call $~lib/array/Array<~lib/string/String>#__visit
)
(func $~lib/rt/__visit_members (param $0 i32) (param $1 i32)
block $invalid
block $optional-typeparameters/TestDerived<f64,f64>
block $optional-typeparameters/TestConcrete<i32,i32>
block $~lib/arraybuffer/ArrayBufferView
block $~lib/string/String
block $~lib/arraybuffer/ArrayBuffer
block $optional-typeparameters/TestMethodDerived2<f64>
block $~lib/array/Array<~lib/string/String>
block $optional-typeparameters/TestMethodDerived<~lib/string/String>
block $optional-typeparameters/TestDerived<f64,f64>
block $optional-typeparameters/TestConcrete<i32,i32>
block $~lib/arraybuffer/ArrayBufferView
block $~lib/string/String
block $~lib/arraybuffer/ArrayBuffer
local.get $0
i32.const 8
i32.sub
i32.load
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
end
return
end
return
end
local.get $0
i32.const 8
i32.sub
i32.load
br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $optional-typeparameters/TestConcrete<i32,i32> $optional-typeparameters/TestDerived<f64,f64> $invalid
local.get $1
call $~lib/arraybuffer/ArrayBufferView~visit
return
end
return
end
return
end
local.get $0
local.get $1
call $~lib/arraybuffer/ArrayBufferView~visit
return
end
local.get $0
local.get $1
call $~lib/array/Array<~lib/string/String>~visit
return
end
return
Expand All @@ -2202,8 +2290,8 @@
global.get $~lib/memory/__data_end
i32.lt_s
if
i32.const 16864
i32.const 16912
i32.const 16896
i32.const 16944
i32.const 1
i32.const 1
call $~lib/builtins/abort
Expand All @@ -2213,13 +2301,13 @@
(func $start:optional-typeparameters
(local $0 i32)
global.get $~lib/memory/__stack_pointer
i32.const 4
i32.const 8
i32.sub
global.set $~lib/memory/__stack_pointer
call $~stack_check
global.get $~lib/memory/__stack_pointer
i32.const 0
i32.store
i64.const 0
i64.store
i32.const 1
call $optional-typeparameters/testConcrete<i32,i32>
drop
Expand Down Expand Up @@ -2269,8 +2357,34 @@
f64.const 2
call $optional-typeparameters/TestDerived<f64,f64>#test<f64>
drop
i32.const 0
call $optional-typeparameters/TestMethodDerived<~lib/string/String>#constructor
global.set $optional-typeparameters/tMethodDerived
global.get $optional-typeparameters/tMethodDerived
local.set $0
global.get $~lib/memory/__stack_pointer
i32.const 4
local.get $0
i32.store
local.get $0
call $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>>
i32.const 0
call $optional-typeparameters/TestMethodDerived2<f64>#constructor
global.set $optional-typeparameters/tMethodDerived2
global.get $optional-typeparameters/tMethodDerived2
local.set $0
global.get $~lib/memory/__stack_pointer
local.get $0
i32.store
local.get $0
global.get $optional-typeparameters/tMethodDerived
local.set $0
global.get $~lib/memory/__stack_pointer
local.get $0
i32.store offset=4
local.get $0
call $optional-typeparameters/TestMethodDerived2<f64>#foo
global.get $~lib/memory/__stack_pointer
i32.const 8
i32.add
global.set $~lib/memory/__stack_pointer
)
Expand Down Expand Up @@ -2330,4 +2444,60 @@
global.set $~lib/memory/__stack_pointer
local.get $1
)
(func $optional-typeparameters/TestMethodDerived<~lib/string/String>#constructor (param $0 i32) (result i32)
(local $1 i32)
global.get $~lib/memory/__stack_pointer
i32.const 4
i32.sub
global.set $~lib/memory/__stack_pointer
call $~stack_check
global.get $~lib/memory/__stack_pointer
i32.const 0
i32.store
local.get $0
i32.eqz
if
global.get $~lib/memory/__stack_pointer
i32.const 0
i32.const 5
call $~lib/rt/itcms/__new
local.tee $0
i32.store
end
local.get $0
local.set $1
global.get $~lib/memory/__stack_pointer
i32.const 4
i32.add
global.set $~lib/memory/__stack_pointer
local.get $1
)
(func $optional-typeparameters/TestMethodDerived2<f64>#constructor (param $0 i32) (result i32)
(local $1 i32)
global.get $~lib/memory/__stack_pointer
i32.const 4
i32.sub
global.set $~lib/memory/__stack_pointer
call $~stack_check
global.get $~lib/memory/__stack_pointer
i32.const 0
i32.store
local.get $0
i32.eqz
if
global.get $~lib/memory/__stack_pointer
i32.const 0
i32.const 7
call $~lib/rt/itcms/__new
local.tee $0
i32.store
end
local.get $0
local.set $1
global.get $~lib/memory/__stack_pointer
i32.const 4
i32.add
global.set $~lib/memory/__stack_pointer
local.get $1
)
)
Loading