From 5cc1e3450557f05d44d67beaa234b0cdd3dc2de1 Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Fri, 19 Aug 2022 10:24:10 +0800 Subject: [PATCH 1/9] add testcase #2447 --- .../optional-typeparameters.debug.wat | 146 ++++++++++++++--- .../optional-typeparameters.release.wat | 149 +++++++++++++----- tests/compiler/optional-typeparameters.ts | 15 +- 3 files changed, 247 insertions(+), 63 deletions(-) diff --git a/tests/compiler/optional-typeparameters.debug.wat b/tests/compiler/optional-typeparameters.debug.wat index b9bfe6b091..5c85c6f73d 100644 --- a/tests/compiler/optional-typeparameters.debug.wat +++ b/tests/compiler/optional-typeparameters.debug.wat @@ -26,10 +26,11 @@ (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 $~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 476)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 16860)) + (global $~lib/memory/__heap_base i32 (i32.const 16860)) (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") @@ -39,7 +40,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) "\07\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") (table $0 1 1 funcref) (elem $0 (i32.const 1)) (export "memory" (memory $0)) @@ -2132,6 +2133,9 @@ local.get $2 f64.add ) + (func $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>> (param $0 i32) + nop + ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) global.get $optional-typeparameters/tConcrete @@ -2148,6 +2152,13 @@ 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 i32.const 224 local.get $0 call $~lib/rt/itcms/__visit @@ -2166,30 +2177,89 @@ call $~lib/rt/itcms/__visit end ) + (func $~lib/array/Array<~lib/string/String>#__visit (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + i32.const 1 + drop + local.get $0 + i32.load offset=4 + local.set $2 + local.get $2 + local.get $0 + i32.load offset=12 + i32.const 2 + i32.shl + i32.add + local.set $3 + loop $while-continue|0 + local.get $2 + local.get $3 + i32.lt_u + local.set $4 + local.get $4 + if + local.get $2 + i32.load + local.set $5 + local.get $5 + if + local.get $5 + local.get $1 + call $~lib/rt/itcms/__visit + end + local.get $2 + i32.const 4 + i32.add + local.set $2 + br $while-continue|0 + end + end + local.get $0 + i32.load + local.get $1 + 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 - block $optional-typeparameters/TestConcrete - 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 $optional-typeparameters/TestDerived $invalid + block $~lib/array/Array<~lib/string/String> + block $optional-typeparameters/TestMethodDerived<~lib/string/String> + block $optional-typeparameters/TestDerived + block $optional-typeparameters/TestConcrete + 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 $optional-typeparameters/TestDerived $optional-typeparameters/TestMethodDerived<~lib/string/String> $~lib/array/Array<~lib/string/String> $invalid + end + return + end + return end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit return end return end - local.get $0 - local.get $1 - call $~lib/arraybuffer/ArrayBufferView~visit return end return end + local.get $0 + local.get $1 + call $~lib/array/Array<~lib/string/String>~visit return end unreachable @@ -2202,8 +2272,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 16864 - i32.const 16912 + i32.const 16880 + i32.const 16928 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2269,6 +2339,16 @@ f64.const 2 call $optional-typeparameters/TestDerived#test 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 + local.get $0 + i32.store + local.get $0 + call $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>> global.get $~lib/memory/__stack_pointer i32.const 4 i32.add @@ -2330,4 +2410,32 @@ 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 + ) ) diff --git a/tests/compiler/optional-typeparameters.release.wat b/tests/compiler/optional-typeparameters.release.wat index ddb8d5a540..fa50437e94 100644 --- a/tests/compiler/optional-typeparameters.release.wat +++ b/tests/compiler/optional-typeparameters.release.wat @@ -19,7 +19,8 @@ (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $optional-typeparameters/tConcrete (mut i32) (i32.const 0)) (global $optional-typeparameters/tDerived (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17868)) + (global $optional-typeparameters/tMethodDerived (mut i32) (i32.const 0)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17884)) (memory $0 1) (data (i32.const 1036) "<") (data (i32.const 1048) "\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") @@ -31,8 +32,8 @@ (data (i32.const 1304) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") (data (i32.const 1372) "<") (data (i32.const 1384) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") - (data (i32.const 1440) "\05\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 1468) " \00\00\00\00\00\00\00 ") + (data (i32.const 1440) "\07\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1468) " \00\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A") (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/visitRoots @@ -50,6 +51,12 @@ local.get $0 call $byn-split-outlined-A$~lib/rt/itcms/__visit end + global.get $optional-typeparameters/tMethodDerived + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end i32.const 1248 call $byn-split-outlined-A$~lib/rt/itcms/__visit i32.const 1056 @@ -623,10 +630,10 @@ if unreachable end - i32.const 17872 + i32.const 17888 i32.const 0 i32.store - i32.const 19440 + i32.const 19456 i32.const 0 i32.store loop $for-loop|0 @@ -637,7 +644,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 17872 + i32.const 17888 i32.add i32.const 0 i32.store offset=4 @@ -655,7 +662,7 @@ i32.add i32.const 2 i32.shl - i32.const 17872 + i32.const 17888 i32.add i32.const 0 i32.store offset=96 @@ -673,13 +680,13 @@ br $for-loop|0 end end - i32.const 17872 - i32.const 19444 + i32.const 17888 + i32.const 19460 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 17872 + i32.const 17888 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -764,7 +771,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 17868 + i32.const 17884 i32.lt_u if local.get $0 @@ -864,7 +871,7 @@ unreachable end local.get $0 - i32.const 17868 + i32.const 17884 i32.lt_u if local.get $0 @@ -887,7 +894,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 17868 + i32.const 17884 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1240,36 +1247,72 @@ local.get $0 ) (func $~lib/rt/__visit_members (param $0 i32) - block $invalid - block $optional-typeparameters/TestDerived - block $optional-typeparameters/TestConcrete - 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 $optional-typeparameters/TestDerived $invalid + (local $1 i32) + (local $2 i32) + (local $3 i32) + block $folding-inner0 + block $invalid + block $~lib/array/Array<~lib/string/String> + block $optional-typeparameters/TestMethodDerived<~lib/string/String> + block $optional-typeparameters/TestDerived + block $optional-typeparameters/TestConcrete + 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 $folding-inner0 $optional-typeparameters/TestConcrete $optional-typeparameters/TestDerived $optional-typeparameters/TestMethodDerived<~lib/string/String> $~lib/array/Array<~lib/string/String> $invalid + end + return + end + return end return end return end - local.get $0 - i32.load - local.tee $0 + return + end + local.get $0 + i32.load offset=4 + local.tee $1 + local.get $0 + i32.load offset=12 + i32.const 2 + i32.shl + i32.add + local.set $3 + loop $while-continue|0 + local.get $1 + local.get $3 + i32.lt_u if - local.get $0 - call $byn-split-outlined-A$~lib/rt/itcms/__visit + local.get $1 + i32.load + local.tee $2 + if + local.get $2 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + local.get $1 + i32.const 4 + i32.add + local.set $1 + br $while-continue|0 end - return end - return + br $folding-inner0 end - return + unreachable + end + local.get $0 + i32.load + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit end - unreachable ) (func $~start (local $0 i32) @@ -1279,7 +1322,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 1484 + i32.const 1500 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1289,7 +1332,7 @@ memory.size i32.const 16 i32.shl - i32.const 17868 + i32.const 17884 i32.sub i32.const 1 i32.shr_u @@ -1323,7 +1366,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1484 + i32.const 1500 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1349,7 +1392,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1484 + i32.const 1500 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1372,12 +1415,38 @@ i32.store global.get $~lib/memory/__stack_pointer i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1500 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i32.const 0 + i32.store + local.get $0 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $optional-typeparameters/tMethodDerived + global.get $~lib/memory/__stack_pointer + global.get $optional-typeparameters/tMethodDerived + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer return end - i32.const 17888 - i32.const 17936 + i32.const 17904 + i32.const 17952 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1426,7 +1495,7 @@ if i32.const 0 local.get $1 - i32.const 17868 + i32.const 17884 i32.lt_u local.get $1 i32.load offset=8 diff --git a/tests/compiler/optional-typeparameters.ts b/tests/compiler/optional-typeparameters.ts index a726b28f4a..8fbf479197 100644 --- a/tests/compiler/optional-typeparameters.ts +++ b/tests/compiler/optional-typeparameters.ts @@ -1,21 +1,21 @@ -function testConcrete(a: T): U { +function testConcrete(a: T): U { return a; } -function testDerived(a: T): U { +function testDerived(a: T): U { return a; } testConcrete(1); testDerived(2); -class TestConcrete { +class TestConcrete { test(a: T, b: U): V { return a + b; } } -class TestDerived { +class TestDerived { test(a: T, b: U): V { return a + b; } @@ -25,3 +25,10 @@ var tConcrete = new TestConcrete(); tConcrete.test(1, 2); var tDerived = new TestDerived(); tDerived.test(1, 2); + +class TestMethodDerived { + test(): void {} +} + +var tMethodDerived = new TestMethodDerived(); +tMethodDerived.test(); From e97a88fa4bb949e78efb988562c4502e8b756d17 Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Fri, 19 Aug 2022 10:28:59 +0800 Subject: [PATCH 2/9] fix: fix `resolveNamedType` cannot resolve type parameter in contextual element --- src/program.ts | 24 ++++++++++++++++++++++++ src/resolver.ts | 9 +++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/program.ts b/src/program.ts index 5d47d44b88..43a43dc45e 100644 --- a/src/program.ts +++ b/src/program.ts @@ -2841,6 +2841,10 @@ export abstract class Element { return this.parent.lookup(name, isType); } + lookupGenericType(name: string): Type | null { + return this.parent.lookupGenericType(name); + } + /** Adds an element as a member of this one. Reports and returns `false` if a duplicate. */ add(name: string, element: DeclaredElement, localIdentifierIfImport: IdentifierExpression | null = null): bool { var originalDeclaration = element.declaration; @@ -3124,6 +3128,10 @@ export class File extends Element { return this.program.lookup(name); // has no meaningful parent } + override lookupGenericType(name: string): Type | null { + return null; + } + /** Ensures that an element is an export of this file. */ ensureExport(name: string, element: DeclaredElement): void { var exports = this.exports; @@ -3687,6 +3695,14 @@ export class Function extends TypedElement { registerConcreteElement(program, this); } + override lookupGenericType(name: string): Type | null { + let contextualTypeArguments = this.contextualTypeArguments; + if (contextualTypeArguments && contextualTypeArguments.has(name)) { + return assert(contextualTypeArguments.get(name)); + } + return this.parent.lookupGenericType(name); + } + /** Gets the name of the parameter at the specified index. */ getParameterName(index: i32): string { var parameters = (this.declaration).signature.parameters; @@ -4297,6 +4313,14 @@ export class Class extends TypedElement { registerConcreteElement(program, this); } + override lookupGenericType(name: string): Type | null { + let contextualTypeArguments = this.contextualTypeArguments; + if (contextualTypeArguments && contextualTypeArguments.has(name)) { + return assert(contextualTypeArguments.get(name)); + } + return this.parent.lookupGenericType(name); + } + /** Sets the base class. */ setBase(base: Class): void { assert(!this.base); diff --git a/src/resolver.ts b/src/resolver.ts index 5a19f8e152..fb61c38963 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -188,8 +188,13 @@ export class Resolver extends DiagnosticEmitter { // Look up in contextual types if a simple type if (isSimpleType) { let simpleName = nameNode.identifier.text; + let type: Type | null = null; if (ctxTypes && ctxTypes.has(simpleName)) { - let type = assert(ctxTypes.get(simpleName)); + type = assert(ctxTypes.get(simpleName)); + } else { + type = ctxElement.lookupGenericType(simpleName); + } + if (type) { if (typeArgumentNodes && typeArgumentNodes.length > 0) { if (reportMode == ReportMode.REPORT) { this.error( @@ -763,7 +768,7 @@ export class Resolver extends DiagnosticEmitter { } let defaultType = typeParameterNode.defaultType; if (defaultType) { - let resolvedDefaultType = this.resolveType(defaultType, ctxFlow.actualFunction, contextualTypeArguments, reportMode); + let resolvedDefaultType = this.resolveType(defaultType, prototype, contextualTypeArguments, reportMode); if (!resolvedDefaultType) return null; resolvedTypeArguments[i] = resolvedDefaultType; continue; From 749140c9d55db5754d38d7af75296b0dfa0bbf1d Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Fri, 19 Aug 2022 10:47:28 +0800 Subject: [PATCH 3/9] fix bootstrap --- src/program.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/program.ts b/src/program.ts index 43a43dc45e..0085d95aa1 100644 --- a/src/program.ts +++ b/src/program.ts @@ -3128,7 +3128,8 @@ export class File extends Element { return this.program.lookup(name); // has no meaningful parent } - override lookupGenericType(name: string): Type | null { + /* @override */ + lookupGenericType(name: string): Type | null { return null; } @@ -3695,12 +3696,13 @@ export class Function extends TypedElement { registerConcreteElement(program, this); } - override lookupGenericType(name: string): Type | null { + /* @override */ + lookupGenericType(name: string): Type | null { let contextualTypeArguments = this.contextualTypeArguments; if (contextualTypeArguments && contextualTypeArguments.has(name)) { return assert(contextualTypeArguments.get(name)); } - return this.parent.lookupGenericType(name); + return super.lookupGenericType(name); } /** Gets the name of the parameter at the specified index. */ @@ -4313,12 +4315,13 @@ export class Class extends TypedElement { registerConcreteElement(program, this); } - override lookupGenericType(name: string): Type | null { + /* @override */ + lookupGenericType(name: string): Type | null { let contextualTypeArguments = this.contextualTypeArguments; if (contextualTypeArguments && contextualTypeArguments.has(name)) { return assert(contextualTypeArguments.get(name)); } - return this.parent.lookupGenericType(name); + return super.lookupGenericType(name); } /** Sets the base class. */ From b0bb7c485cfd87f5a2d0ebff8ea410774ff952ac Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Sun, 21 Aug 2022 07:51:13 +0800 Subject: [PATCH 4/9] Revert "fix bootstrap" This reverts commit 749140c9d55db5754d38d7af75296b0dfa0bbf1d. --- src/program.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/program.ts b/src/program.ts index 0085d95aa1..43a43dc45e 100644 --- a/src/program.ts +++ b/src/program.ts @@ -3128,8 +3128,7 @@ export class File extends Element { return this.program.lookup(name); // has no meaningful parent } - /* @override */ - lookupGenericType(name: string): Type | null { + override lookupGenericType(name: string): Type | null { return null; } @@ -3696,13 +3695,12 @@ export class Function extends TypedElement { registerConcreteElement(program, this); } - /* @override */ - lookupGenericType(name: string): Type | null { + override lookupGenericType(name: string): Type | null { let contextualTypeArguments = this.contextualTypeArguments; if (contextualTypeArguments && contextualTypeArguments.has(name)) { return assert(contextualTypeArguments.get(name)); } - return super.lookupGenericType(name); + return this.parent.lookupGenericType(name); } /** Gets the name of the parameter at the specified index. */ @@ -4315,13 +4313,12 @@ export class Class extends TypedElement { registerConcreteElement(program, this); } - /* @override */ - lookupGenericType(name: string): Type | null { + override lookupGenericType(name: string): Type | null { let contextualTypeArguments = this.contextualTypeArguments; if (contextualTypeArguments && contextualTypeArguments.has(name)) { return assert(contextualTypeArguments.get(name)); } - return super.lookupGenericType(name); + return this.parent.lookupGenericType(name); } /** Sets the base class. */ From 4ffbfb6beda1ec3e9cc893edbbad44c605c4e339 Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Sun, 21 Aug 2022 07:51:54 +0800 Subject: [PATCH 5/9] Revert "fix: fix `resolveNamedType` cannot resolve type parameter in contextual element" This reverts commit e97a88fa4bb949e78efb988562c4502e8b756d17. --- src/program.ts | 24 ------------------------ src/resolver.ts | 9 ++------- 2 files changed, 2 insertions(+), 31 deletions(-) diff --git a/src/program.ts b/src/program.ts index 43a43dc45e..5d47d44b88 100644 --- a/src/program.ts +++ b/src/program.ts @@ -2841,10 +2841,6 @@ export abstract class Element { return this.parent.lookup(name, isType); } - lookupGenericType(name: string): Type | null { - return this.parent.lookupGenericType(name); - } - /** Adds an element as a member of this one. Reports and returns `false` if a duplicate. */ add(name: string, element: DeclaredElement, localIdentifierIfImport: IdentifierExpression | null = null): bool { var originalDeclaration = element.declaration; @@ -3128,10 +3124,6 @@ export class File extends Element { return this.program.lookup(name); // has no meaningful parent } - override lookupGenericType(name: string): Type | null { - return null; - } - /** Ensures that an element is an export of this file. */ ensureExport(name: string, element: DeclaredElement): void { var exports = this.exports; @@ -3695,14 +3687,6 @@ export class Function extends TypedElement { registerConcreteElement(program, this); } - override lookupGenericType(name: string): Type | null { - let contextualTypeArguments = this.contextualTypeArguments; - if (contextualTypeArguments && contextualTypeArguments.has(name)) { - return assert(contextualTypeArguments.get(name)); - } - return this.parent.lookupGenericType(name); - } - /** Gets the name of the parameter at the specified index. */ getParameterName(index: i32): string { var parameters = (this.declaration).signature.parameters; @@ -4313,14 +4297,6 @@ export class Class extends TypedElement { registerConcreteElement(program, this); } - override lookupGenericType(name: string): Type | null { - let contextualTypeArguments = this.contextualTypeArguments; - if (contextualTypeArguments && contextualTypeArguments.has(name)) { - return assert(contextualTypeArguments.get(name)); - } - return this.parent.lookupGenericType(name); - } - /** Sets the base class. */ setBase(base: Class): void { assert(!this.base); diff --git a/src/resolver.ts b/src/resolver.ts index fb61c38963..5a19f8e152 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -188,13 +188,8 @@ export class Resolver extends DiagnosticEmitter { // Look up in contextual types if a simple type if (isSimpleType) { let simpleName = nameNode.identifier.text; - let type: Type | null = null; if (ctxTypes && ctxTypes.has(simpleName)) { - type = assert(ctxTypes.get(simpleName)); - } else { - type = ctxElement.lookupGenericType(simpleName); - } - if (type) { + let type = assert(ctxTypes.get(simpleName)); if (typeArgumentNodes && typeArgumentNodes.length > 0) { if (reportMode == ReportMode.REPORT) { this.error( @@ -768,7 +763,7 @@ export class Resolver extends DiagnosticEmitter { } let defaultType = typeParameterNode.defaultType; if (defaultType) { - let resolvedDefaultType = this.resolveType(defaultType, prototype, contextualTypeArguments, reportMode); + let resolvedDefaultType = this.resolveType(defaultType, ctxFlow.actualFunction, contextualTypeArguments, reportMode); if (!resolvedDefaultType) return null; resolvedTypeArguments[i] = resolvedDefaultType; continue; From 2ebefe597210703a002851aa638530dbc5f682ed Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Sun, 21 Aug 2022 08:00:46 +0800 Subject: [PATCH 6/9] use callee ctx to infer default type --- src/resolver.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/resolver.ts b/src/resolver.ts index 5a19f8e152..159e200a77 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -763,7 +763,13 @@ export class Resolver extends DiagnosticEmitter { } let defaultType = typeParameterNode.defaultType; if (defaultType) { - let resolvedDefaultType = this.resolveType(defaultType, ctxFlow.actualFunction, contextualTypeArguments, reportMode); + let defaultTypeContextualTypeArguments: Map | null = null; + if (prototype.parent.kind == ElementKind.CLASS) { + defaultTypeContextualTypeArguments = (prototype.parent).contextualTypeArguments; + } else if (prototype.parent.kind == ElementKind.FUNCTION) { + defaultTypeContextualTypeArguments = (prototype.parent).contextualTypeArguments; + } + let resolvedDefaultType = this.resolveType(defaultType, prototype, defaultTypeContextualTypeArguments, reportMode); if (!resolvedDefaultType) return null; resolvedTypeArguments[i] = resolvedDefaultType; continue; From 277318d5d1e3422e1b7e9eca6b564ac819240094 Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Sun, 21 Aug 2022 08:22:44 +0800 Subject: [PATCH 7/9] add testcase --- .../optional-typeparameters.debug.wat | 120 +++++++++---- .../optional-typeparameters.release.wat | 161 +++++++++++------- tests/compiler/optional-typeparameters.ts | 11 +- 3 files changed, 201 insertions(+), 91 deletions(-) diff --git a/tests/compiler/optional-typeparameters.debug.wat b/tests/compiler/optional-typeparameters.debug.wat index 5c85c6f73d..fc9f68cd86 100644 --- a/tests/compiler/optional-typeparameters.debug.wat +++ b/tests/compiler/optional-typeparameters.debug.wat @@ -27,10 +27,11 @@ (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 476)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 16860)) - (global $~lib/memory/__heap_base i32 (i32.const 16860)) + (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") @@ -40,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) "\07\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") + (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)) @@ -2134,7 +2135,14 @@ f64.add ) (func $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>> (param $0 i32) - nop + i32.const 6 + i32.const 6 + i32.eq + drop + ) + (func $optional-typeparameters/TestMethodDerived2#foo (param $0 i32) (param $1 i32) + local.get $1 + 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) @@ -2159,6 +2167,13 @@ 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 @@ -2229,37 +2244,40 @@ ) (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) block $invalid - block $~lib/array/Array<~lib/string/String> - block $optional-typeparameters/TestMethodDerived<~lib/string/String> - block $optional-typeparameters/TestDerived - block $optional-typeparameters/TestConcrete - 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 $optional-typeparameters/TestDerived $optional-typeparameters/TestMethodDerived<~lib/string/String> $~lib/array/Array<~lib/string/String> $invalid + block $optional-typeparameters/TestMethodDerived2 + block $~lib/array/Array<~lib/string/String> + block $optional-typeparameters/TestMethodDerived<~lib/string/String> + block $optional-typeparameters/TestDerived + block $optional-typeparameters/TestConcrete + 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 $optional-typeparameters/TestDerived $optional-typeparameters/TestMethodDerived<~lib/string/String> $~lib/array/Array<~lib/string/String> $optional-typeparameters/TestMethodDerived2 $invalid + 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/arraybuffer/ArrayBufferView~visit return end return end return end + local.get $0 + local.get $1 + call $~lib/array/Array<~lib/string/String>~visit return end - local.get $0 - local.get $1 - call $~lib/array/Array<~lib/string/String>~visit return end unreachable @@ -2272,8 +2290,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 16880 - i32.const 16928 + i32.const 16896 + i32.const 16944 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2283,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 drop @@ -2349,8 +2367,24 @@ 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#constructor + global.set $optional-typeparameters/tMethodDerived2 + global.get $optional-typeparameters/tMethodDerived2 + local.set $0 global.get $~lib/memory/__stack_pointer - i32.const 4 + 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#foo + global.get $~lib/memory/__stack_pointer + i32.const 8 i32.add global.set $~lib/memory/__stack_pointer ) @@ -2438,4 +2472,32 @@ global.set $~lib/memory/__stack_pointer local.get $1 ) + (func $optional-typeparameters/TestMethodDerived2#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 + ) ) diff --git a/tests/compiler/optional-typeparameters.release.wat b/tests/compiler/optional-typeparameters.release.wat index fa50437e94..f8d4bdf5dd 100644 --- a/tests/compiler/optional-typeparameters.release.wat +++ b/tests/compiler/optional-typeparameters.release.wat @@ -20,7 +20,8 @@ (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 $~lib/memory/__stack_pointer (mut i32) (i32.const 17884)) + (global $optional-typeparameters/tMethodDerived2 (mut i32) (i32.const 0)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17892)) (memory $0 1) (data (i32.const 1036) "<") (data (i32.const 1048) "\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") @@ -32,8 +33,8 @@ (data (i32.const 1304) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") (data (i32.const 1372) "<") (data (i32.const 1384) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") - (data (i32.const 1440) "\07\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 1468) " \00\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A") + (data (i32.const 1440) "\08\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1468) " \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 ") (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/visitRoots @@ -57,6 +58,12 @@ local.get $0 call $byn-split-outlined-A$~lib/rt/itcms/__visit end + global.get $optional-typeparameters/tMethodDerived2 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end i32.const 1248 call $byn-split-outlined-A$~lib/rt/itcms/__visit i32.const 1056 @@ -630,10 +637,10 @@ if unreachable end - i32.const 17888 + i32.const 17904 i32.const 0 i32.store - i32.const 19456 + i32.const 19472 i32.const 0 i32.store loop $for-loop|0 @@ -644,7 +651,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 17888 + i32.const 17904 i32.add i32.const 0 i32.store offset=4 @@ -662,7 +669,7 @@ i32.add i32.const 2 i32.shl - i32.const 17888 + i32.const 17904 i32.add i32.const 0 i32.store offset=96 @@ -680,13 +687,13 @@ br $for-loop|0 end end - i32.const 17888 - i32.const 19460 + i32.const 17904 + i32.const 19476 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 17888 + i32.const 17904 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -771,7 +778,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 17884 + i32.const 17892 i32.lt_u if local.get $0 @@ -871,7 +878,7 @@ unreachable end local.get $0 - i32.const 17884 + i32.const 17892 i32.lt_u if local.get $0 @@ -894,7 +901,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 17884 + i32.const 17892 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1252,17 +1259,20 @@ (local $3 i32) block $folding-inner0 block $invalid - block $~lib/array/Array<~lib/string/String> - block $optional-typeparameters/TestMethodDerived<~lib/string/String> - block $optional-typeparameters/TestDerived - block $optional-typeparameters/TestConcrete - 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 $folding-inner0 $optional-typeparameters/TestConcrete $optional-typeparameters/TestDerived $optional-typeparameters/TestMethodDerived<~lib/string/String> $~lib/array/Array<~lib/string/String> $invalid + block $optional-typeparameters/TestMethodDerived2 + block $~lib/array/Array<~lib/string/String> + block $optional-typeparameters/TestMethodDerived<~lib/string/String> + block $optional-typeparameters/TestDerived + block $optional-typeparameters/TestConcrete + 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 $folding-inner0 $optional-typeparameters/TestConcrete $optional-typeparameters/TestDerived $optional-typeparameters/TestMethodDerived<~lib/string/String> $~lib/array/Array<~lib/string/String> $optional-typeparameters/TestMethodDerived2 $invalid + end + return end return end @@ -1272,37 +1282,37 @@ end return end - return - end - local.get $0 - i32.load offset=4 - local.tee $1 - local.get $0 - i32.load offset=12 - i32.const 2 - i32.shl - i32.add - local.set $3 - loop $while-continue|0 - local.get $1 - local.get $3 - i32.lt_u - if + local.get $0 + i32.load offset=4 + local.tee $1 + local.get $0 + i32.load offset=12 + i32.const 2 + i32.shl + i32.add + local.set $3 + loop $while-continue|0 local.get $1 - i32.load - local.tee $2 + local.get $3 + i32.lt_u if - local.get $2 - call $byn-split-outlined-A$~lib/rt/itcms/__visit + local.get $1 + i32.load + local.tee $2 + if + local.get $2 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + local.get $1 + i32.const 4 + i32.add + local.set $1 + br $while-continue|0 end - local.get $1 - i32.const 4 - i32.add - local.set $1 - br $while-continue|0 end + br $folding-inner0 end - br $folding-inner0 + return end unreachable end @@ -1317,22 +1327,22 @@ (func $~start (local $0 i32) global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.const 8 i32.sub global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 1500 + i32.const 1508 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer local.tee $0 - i32.const 0 - i32.store + i64.const 0 + i64.store memory.size i32.const 16 i32.shl - i32.const 17884 + i32.const 17892 i32.sub i32.const 1 i32.shr_u @@ -1366,7 +1376,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1500 + i32.const 1508 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1392,7 +1402,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1500 + i32.const 1508 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1418,7 +1428,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1500 + i32.const 1508 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1441,12 +1451,41 @@ i32.store global.get $~lib/memory/__stack_pointer i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1508 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i32.const 0 + i32.store + local.get $0 + i32.const 7 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $optional-typeparameters/tMethodDerived2 + global.get $~lib/memory/__stack_pointer + global.get $optional-typeparameters/tMethodDerived2 + i32.store + global.get $~lib/memory/__stack_pointer + global.get $optional-typeparameters/tMethodDerived + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 8 i32.add global.set $~lib/memory/__stack_pointer return end - i32.const 17904 - i32.const 17952 + i32.const 17920 + i32.const 17968 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1495,7 +1534,7 @@ if i32.const 0 local.get $1 - i32.const 17884 + i32.const 17892 i32.lt_u local.get $1 i32.load offset=8 diff --git a/tests/compiler/optional-typeparameters.ts b/tests/compiler/optional-typeparameters.ts index 8fbf479197..7ba1699c0e 100644 --- a/tests/compiler/optional-typeparameters.ts +++ b/tests/compiler/optional-typeparameters.ts @@ -27,8 +27,17 @@ var tDerived = new TestDerived(); tDerived.test(1, 2); class TestMethodDerived { - test(): void {} + test(): void { + assert(idof() == idof()); + } +} +class TestMethodDerived2 { + foo(v: TestMethodDerived): void { + v.test(); + } } var tMethodDerived = new TestMethodDerived(); tMethodDerived.test(); +var tMethodDerived2 = new TestMethodDerived2(); +tMethodDerived2.foo(tMethodDerived); From 622e4866915dccf140ef2df62896bc43f294d46f Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Sun, 21 Aug 2022 09:33:58 +0800 Subject: [PATCH 8/9] add docs --- src/resolver.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/resolver.ts b/src/resolver.ts index 159e200a77..6689c88add 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -763,12 +763,13 @@ export class Resolver extends DiagnosticEmitter { } let defaultType = typeParameterNode.defaultType; if (defaultType) { + // Default parameters are resolved in context of the called function, not the calling function let defaultTypeContextualTypeArguments: Map | null = null; if (prototype.parent.kind == ElementKind.CLASS) { defaultTypeContextualTypeArguments = (prototype.parent).contextualTypeArguments; } else if (prototype.parent.kind == ElementKind.FUNCTION) { defaultTypeContextualTypeArguments = (prototype.parent).contextualTypeArguments; - } + } let resolvedDefaultType = this.resolveType(defaultType, prototype, defaultTypeContextualTypeArguments, reportMode); if (!resolvedDefaultType) return null; resolvedTypeArguments[i] = resolvedDefaultType; From b6e3ab6cc2d4fb2761337cb405d3ec7b5ac5d10e Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Sun, 21 Aug 2022 09:56:55 +0800 Subject: [PATCH 9/9] resolve conflict --- .../optional-typeparameters.debug.wat | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/tests/compiler/optional-typeparameters.debug.wat b/tests/compiler/optional-typeparameters.debug.wat index e978c512c1..cbe085dc33 100644 --- a/tests/compiler/optional-typeparameters.debug.wat +++ b/tests/compiler/optional-typeparameters.debug.wat @@ -2134,14 +2134,14 @@ local.get $b f64.add ) - (func $optional-typeparameters/TestMethodDerived<~lib/string/String>#test<~lib/array/Array<~lib/string/String>> (param $0 i32) + (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#foo (param $0 i32) (param $1 i32) - local.get $1 + (func $optional-typeparameters/TestMethodDerived2#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) @@ -2192,49 +2192,49 @@ call $~lib/rt/itcms/__visit end ) - (func $~lib/array/Array<~lib/string/String>#__visit (param $0 i32) (param $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) + (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 $0 + local.get $this i32.load offset=4 - local.set $2 - local.get $2 - local.get $0 + local.set $var$2 + local.get $var$2 + local.get $this i32.load offset=12 i32.const 2 i32.shl i32.add - local.set $3 + local.set $var$3 loop $while-continue|0 - local.get $2 - local.get $3 + local.get $var$2 + local.get $var$3 i32.lt_u - local.set $4 - local.get $4 + local.set $var$4 + local.get $var$4 if - local.get $2 + local.get $var$2 i32.load - local.set $5 - local.get $5 + local.set $val + local.get $val if - local.get $5 - local.get $1 + local.get $val + local.get $cookie call $~lib/rt/itcms/__visit end - local.get $2 + local.get $var$2 i32.const 4 i32.add - local.set $2 + local.set $var$2 br $while-continue|0 end end - local.get $0 + local.get $this i32.load - local.get $1 + local.get $cookie call $~lib/rt/itcms/__visit ) (func $~lib/array/Array<~lib/string/String>~visit (param $0 i32) (param $1 i32)