Skip to content

Commit 1f1dcd6

Browse files
authored
When reusing input type nodes, only instantiate the type for comparison if it is a this type (microsoft#42584)
1 parent 5268264 commit 1f1dcd6

7 files changed

+231
-8
lines changed

src/compiler/checker.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6005,10 +6005,14 @@ namespace ts {
60056005
function serializeReturnTypeForSignature(context: NodeBuilderContext, type: Type, signature: Signature, includePrivateSymbol?: (s: Symbol) => void, bundled?: boolean) {
60066006
if (type !== errorType && context.enclosingDeclaration) {
60076007
const annotation = signature.declaration && getEffectiveReturnTypeNode(signature.declaration);
6008-
if (!!findAncestor(annotation, n => n === context.enclosingDeclaration) && annotation && instantiateType(getTypeFromTypeNode(annotation), signature.mapper) === type && existingTypeNodeIsNotReferenceOrIsReferenceWithCompatibleTypeArgumentCount(annotation, type)) {
6009-
const result = serializeExistingTypeNode(context, annotation, includePrivateSymbol, bundled);
6010-
if (result) {
6011-
return result;
6008+
if (!!findAncestor(annotation, n => n === context.enclosingDeclaration) && annotation) {
6009+
const annotated = getTypeFromTypeNode(annotation);
6010+
const thisInstantiated = annotated.flags & TypeFlags.TypeParameter && (annotated as TypeParameter).isThisType ? instantiateType(annotated, signature.mapper) : annotated;
6011+
if (thisInstantiated === type && existingTypeNodeIsNotReferenceOrIsReferenceWithCompatibleTypeArgumentCount(annotation, type)) {
6012+
const result = serializeExistingTypeNode(context, annotation, includePrivateSymbol, bundled);
6013+
if (result) {
6014+
return result;
6015+
}
60126016
}
60136017
}
60146018
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//// [declarationEmitOverloadedPrivateInference.ts]
2+
function noArgs(): string {
3+
return null as any;
4+
}
5+
6+
function oneArg(input: string): string {
7+
return null as any;
8+
}
9+
10+
export class Wrapper {
11+
private proxy<T, U>(fn: (options: T) => U): (options: T) => U;
12+
private proxy<T, U>(fn: (options?: T) => U, noArgs: true): (options?: T) => U;
13+
14+
private proxy<T, U>(fn: (options: T) => U) {
15+
return null as any;
16+
}
17+
18+
public Proxies = {
19+
Failure: this.proxy(noArgs, true),
20+
Success: this.proxy(oneArg),
21+
};
22+
}
23+
24+
//// [declarationEmitOverloadedPrivateInference.js]
25+
"use strict";
26+
exports.__esModule = true;
27+
exports.Wrapper = void 0;
28+
function noArgs() {
29+
return null;
30+
}
31+
function oneArg(input) {
32+
return null;
33+
}
34+
var Wrapper = /** @class */ (function () {
35+
function Wrapper() {
36+
this.Proxies = {
37+
Failure: this.proxy(noArgs, true),
38+
Success: this.proxy(oneArg)
39+
};
40+
}
41+
Wrapper.prototype.proxy = function (fn) {
42+
return null;
43+
};
44+
return Wrapper;
45+
}());
46+
exports.Wrapper = Wrapper;
47+
48+
49+
//// [declarationEmitOverloadedPrivateInference.d.ts]
50+
export declare class Wrapper {
51+
private proxy;
52+
Proxies: {
53+
Failure: (options?: unknown) => string;
54+
Success: (options: string) => string;
55+
};
56+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
=== tests/cases/compiler/declarationEmitOverloadedPrivateInference.ts ===
2+
function noArgs(): string {
3+
>noArgs : Symbol(noArgs, Decl(declarationEmitOverloadedPrivateInference.ts, 0, 0))
4+
5+
return null as any;
6+
}
7+
8+
function oneArg(input: string): string {
9+
>oneArg : Symbol(oneArg, Decl(declarationEmitOverloadedPrivateInference.ts, 2, 1))
10+
>input : Symbol(input, Decl(declarationEmitOverloadedPrivateInference.ts, 4, 16))
11+
12+
return null as any;
13+
}
14+
15+
export class Wrapper {
16+
>Wrapper : Symbol(Wrapper, Decl(declarationEmitOverloadedPrivateInference.ts, 6, 1))
17+
18+
private proxy<T, U>(fn: (options: T) => U): (options: T) => U;
19+
>proxy : Symbol(Wrapper.proxy, Decl(declarationEmitOverloadedPrivateInference.ts, 8, 22), Decl(declarationEmitOverloadedPrivateInference.ts, 9, 66), Decl(declarationEmitOverloadedPrivateInference.ts, 10, 82))
20+
>T : Symbol(T, Decl(declarationEmitOverloadedPrivateInference.ts, 9, 18))
21+
>U : Symbol(U, Decl(declarationEmitOverloadedPrivateInference.ts, 9, 20))
22+
>fn : Symbol(fn, Decl(declarationEmitOverloadedPrivateInference.ts, 9, 24))
23+
>options : Symbol(options, Decl(declarationEmitOverloadedPrivateInference.ts, 9, 29))
24+
>T : Symbol(T, Decl(declarationEmitOverloadedPrivateInference.ts, 9, 18))
25+
>U : Symbol(U, Decl(declarationEmitOverloadedPrivateInference.ts, 9, 20))
26+
>options : Symbol(options, Decl(declarationEmitOverloadedPrivateInference.ts, 9, 49))
27+
>T : Symbol(T, Decl(declarationEmitOverloadedPrivateInference.ts, 9, 18))
28+
>U : Symbol(U, Decl(declarationEmitOverloadedPrivateInference.ts, 9, 20))
29+
30+
private proxy<T, U>(fn: (options?: T) => U, noArgs: true): (options?: T) => U;
31+
>proxy : Symbol(Wrapper.proxy, Decl(declarationEmitOverloadedPrivateInference.ts, 8, 22), Decl(declarationEmitOverloadedPrivateInference.ts, 9, 66), Decl(declarationEmitOverloadedPrivateInference.ts, 10, 82))
32+
>T : Symbol(T, Decl(declarationEmitOverloadedPrivateInference.ts, 10, 18))
33+
>U : Symbol(U, Decl(declarationEmitOverloadedPrivateInference.ts, 10, 20))
34+
>fn : Symbol(fn, Decl(declarationEmitOverloadedPrivateInference.ts, 10, 24))
35+
>options : Symbol(options, Decl(declarationEmitOverloadedPrivateInference.ts, 10, 29))
36+
>T : Symbol(T, Decl(declarationEmitOverloadedPrivateInference.ts, 10, 18))
37+
>U : Symbol(U, Decl(declarationEmitOverloadedPrivateInference.ts, 10, 20))
38+
>noArgs : Symbol(noArgs, Decl(declarationEmitOverloadedPrivateInference.ts, 10, 47))
39+
>options : Symbol(options, Decl(declarationEmitOverloadedPrivateInference.ts, 10, 64))
40+
>T : Symbol(T, Decl(declarationEmitOverloadedPrivateInference.ts, 10, 18))
41+
>U : Symbol(U, Decl(declarationEmitOverloadedPrivateInference.ts, 10, 20))
42+
43+
private proxy<T, U>(fn: (options: T) => U) {
44+
>proxy : Symbol(Wrapper.proxy, Decl(declarationEmitOverloadedPrivateInference.ts, 8, 22), Decl(declarationEmitOverloadedPrivateInference.ts, 9, 66), Decl(declarationEmitOverloadedPrivateInference.ts, 10, 82))
45+
>T : Symbol(T, Decl(declarationEmitOverloadedPrivateInference.ts, 12, 18))
46+
>U : Symbol(U, Decl(declarationEmitOverloadedPrivateInference.ts, 12, 20))
47+
>fn : Symbol(fn, Decl(declarationEmitOverloadedPrivateInference.ts, 12, 24))
48+
>options : Symbol(options, Decl(declarationEmitOverloadedPrivateInference.ts, 12, 29))
49+
>T : Symbol(T, Decl(declarationEmitOverloadedPrivateInference.ts, 12, 18))
50+
>U : Symbol(U, Decl(declarationEmitOverloadedPrivateInference.ts, 12, 20))
51+
52+
return null as any;
53+
}
54+
55+
public Proxies = {
56+
>Proxies : Symbol(Wrapper.Proxies, Decl(declarationEmitOverloadedPrivateInference.ts, 14, 5))
57+
58+
Failure: this.proxy(noArgs, true),
59+
>Failure : Symbol(Failure, Decl(declarationEmitOverloadedPrivateInference.ts, 16, 22))
60+
>this.proxy : Symbol(Wrapper.proxy, Decl(declarationEmitOverloadedPrivateInference.ts, 8, 22), Decl(declarationEmitOverloadedPrivateInference.ts, 9, 66), Decl(declarationEmitOverloadedPrivateInference.ts, 10, 82))
61+
>this : Symbol(Wrapper, Decl(declarationEmitOverloadedPrivateInference.ts, 6, 1))
62+
>proxy : Symbol(Wrapper.proxy, Decl(declarationEmitOverloadedPrivateInference.ts, 8, 22), Decl(declarationEmitOverloadedPrivateInference.ts, 9, 66), Decl(declarationEmitOverloadedPrivateInference.ts, 10, 82))
63+
>noArgs : Symbol(noArgs, Decl(declarationEmitOverloadedPrivateInference.ts, 0, 0))
64+
65+
Success: this.proxy(oneArg),
66+
>Success : Symbol(Success, Decl(declarationEmitOverloadedPrivateInference.ts, 17, 42))
67+
>this.proxy : Symbol(Wrapper.proxy, Decl(declarationEmitOverloadedPrivateInference.ts, 8, 22), Decl(declarationEmitOverloadedPrivateInference.ts, 9, 66), Decl(declarationEmitOverloadedPrivateInference.ts, 10, 82))
68+
>this : Symbol(Wrapper, Decl(declarationEmitOverloadedPrivateInference.ts, 6, 1))
69+
>proxy : Symbol(Wrapper.proxy, Decl(declarationEmitOverloadedPrivateInference.ts, 8, 22), Decl(declarationEmitOverloadedPrivateInference.ts, 9, 66), Decl(declarationEmitOverloadedPrivateInference.ts, 10, 82))
70+
>oneArg : Symbol(oneArg, Decl(declarationEmitOverloadedPrivateInference.ts, 2, 1))
71+
72+
};
73+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
=== tests/cases/compiler/declarationEmitOverloadedPrivateInference.ts ===
2+
function noArgs(): string {
3+
>noArgs : () => string
4+
5+
return null as any;
6+
>null as any : any
7+
>null : null
8+
}
9+
10+
function oneArg(input: string): string {
11+
>oneArg : (input: string) => string
12+
>input : string
13+
14+
return null as any;
15+
>null as any : any
16+
>null : null
17+
}
18+
19+
export class Wrapper {
20+
>Wrapper : Wrapper
21+
22+
private proxy<T, U>(fn: (options: T) => U): (options: T) => U;
23+
>proxy : { <T, U>(fn: (options: T) => U): (options: T) => U; <T, U>(fn: (options?: T) => U, noArgs: true): (options?: T) => U; }
24+
>fn : (options: T) => U
25+
>options : T
26+
>options : T
27+
28+
private proxy<T, U>(fn: (options?: T) => U, noArgs: true): (options?: T) => U;
29+
>proxy : { <T, U>(fn: (options: T) => U): (options: T) => U; <T, U>(fn: (options?: T) => U, noArgs: true): (options?: T) => U; }
30+
>fn : (options?: T) => U
31+
>options : T
32+
>noArgs : true
33+
>true : true
34+
>options : T
35+
36+
private proxy<T, U>(fn: (options: T) => U) {
37+
>proxy : { <T, U>(fn: (options: T) => U): (options: T) => U; <T, U>(fn: (options?: T) => U, noArgs: true): (options?: T) => U; }
38+
>fn : (options: T) => U
39+
>options : T
40+
41+
return null as any;
42+
>null as any : any
43+
>null : null
44+
}
45+
46+
public Proxies = {
47+
>Proxies : { Failure: (options?: unknown) => string; Success: (options: string) => string; }
48+
>{ Failure: this.proxy(noArgs, true), Success: this.proxy(oneArg), } : { Failure: (options?: unknown) => string; Success: (options: string) => string; }
49+
50+
Failure: this.proxy(noArgs, true),
51+
>Failure : (options?: unknown) => string
52+
>this.proxy(noArgs, true) : (options?: unknown) => string
53+
>this.proxy : { <T, U>(fn: (options: T) => U): (options: T) => U; <T, U>(fn: (options?: T) => U, noArgs: true): (options?: T) => U; }
54+
>this : this
55+
>proxy : { <T, U>(fn: (options: T) => U): (options: T) => U; <T, U>(fn: (options?: T) => U, noArgs: true): (options?: T) => U; }
56+
>noArgs : () => string
57+
>true : true
58+
59+
Success: this.proxy(oneArg),
60+
>Success : (options: string) => string
61+
>this.proxy(oneArg) : (options: string) => string
62+
>this.proxy : { <T, U>(fn: (options: T) => U): (options: T) => U; <T, U>(fn: (options?: T) => U, noArgs: true): (options?: T) => U; }
63+
>this : this
64+
>proxy : { <T, U>(fn: (options: T) => U): (options: T) => U; <T, U>(fn: (options?: T) => U, noArgs: true): (options?: T) => U; }
65+
>oneArg : (input: string) => string
66+
67+
};
68+
}

0 commit comments

Comments
 (0)