Skip to content

Commit e91568c

Browse files
author
Andy Hanson
committed
Always fill in type arguments in pickLongestCandidateSignature (Fixes #19854)
1 parent b1d6817 commit e91568c

File tree

3 files changed

+28
-17
lines changed

3 files changed

+28
-17
lines changed

src/compiler/checker.ts

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3199,7 +3199,7 @@ namespace ts {
31993199
if ((symbol as TransientSymbol).syntheticLiteralTypeOrigin) {
32003200
const stringValue = (symbol as TransientSymbol).syntheticLiteralTypeOrigin.value;
32013201
if (!isIdentifierText(stringValue, compilerOptions.target)) {
3202-
return `"${escapeString(stringValue, CharacterCodes.doubleQuote)}"`;
3202+
return '"' + escapeString(stringValue, CharacterCodes.doubleQuote) + '"';
32033203
}
32043204
}
32053205
return symbolName(symbol);
@@ -5562,9 +5562,9 @@ namespace ts {
55625562
/**
55635563
* Gets the symbolic name for a late-bound member from its type.
55645564
*/
5565-
function getLateBoundNameFromType(type: LiteralType | UniqueESSymbolType) {
5565+
function getLateBoundNameFromType(type: LiteralType | UniqueESSymbolType): __String | undefined {
55665566
if (type.flags & TypeFlags.UniqueESSymbol) {
5567-
return `__@${type.symbol.escapedName}@${getSymbolId(type.symbol)}` as __String;
5567+
return "__@" + type.symbol.escapedName + "@" + getSymbolId(type.symbol) as __String;
55685568
}
55695569
if (type.flags & TypeFlags.StringOrNumberLiteral) {
55705570
return escapeLeadingUnderscores("" + (<LiteralType>type).value);
@@ -17176,21 +17176,22 @@ namespace ts {
1717617176
const candidate = candidates[bestIndex];
1717717177

1717817178
const { typeParameters } = candidate;
17179-
if (typeParameters && callLikeExpressionMayHaveTypeArguments(node) && node.typeArguments) {
17180-
const typeArguments = node.typeArguments.map(getTypeOfNode);
17181-
while (typeArguments.length > typeParameters.length) {
17182-
typeArguments.pop();
17183-
}
17184-
while (typeArguments.length < typeParameters.length) {
17185-
typeArguments.push(getDefaultTypeArgumentType(isInJavaScriptFile(node)));
17186-
}
17179+
if (!typeParameters) {
17180+
return candidate;
17181+
}
1718717182

17188-
const instantiated = createSignatureInstantiation(candidate, typeArguments);
17189-
candidates[bestIndex] = instantiated;
17190-
return instantiated;
17183+
const typeArgumentNodes: ReadonlyArray<TypeNode> = callLikeExpressionMayHaveTypeArguments(node) ? node.typeArguments || emptyArray : emptyArray;
17184+
const typeArguments = typeArgumentNodes.map(getTypeOfNode);
17185+
while (typeArguments.length > typeParameters.length) {
17186+
typeArguments.pop();
17187+
}
17188+
while (typeArguments.length < typeParameters.length) {
17189+
typeArguments.push(getDefaultTypeArgumentType(isInJavaScriptFile(node)));
1719117190
}
1719217191

17193-
return candidate;
17192+
const instantiated = createSignatureInstantiation(candidate, typeArguments);
17193+
candidates[bestIndex] = instantiated;
17194+
return instantiated;
1719417195
}
1719517196

1719617197
function getLongestCandidateIndex(candidates: ReadonlyArray<Signature>, argsCount: number): number {

src/harness/harness.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ namespace assert {
3737
assert(!expr, msg);
3838
}
3939
export function equal<T>(a: T, b: T, msg = "Expected values to be equal."): void {
40-
assert(a === b, msg);
40+
assert(a === b, () => `${msg} Expected:\n${stringify(a)}\nActual:\n${stringify(b)}`);
4141
}
4242
export function notEqual<T>(a: T, b: T, msg = "Expected values to not be equal."): void {
4343
assert(a !== b, msg);
@@ -49,7 +49,7 @@ namespace assert {
4949
assert(x === undefined, msg);
5050
}
5151
export function deepEqual<T>(a: T, b: T, msg?: string): void {
52-
assert(isDeepEqual(a, b), msg || (() => `Expected values to be deeply equal:\nExpected:\n${JSON.stringify(a, undefined, 4)}\nActual:\n${JSON.stringify(b, undefined, 4)}`));
52+
assert(isDeepEqual(a, b), msg || (() => `Expected values to be deeply equal:\nExpected:\n${stringify(a)}\nActual:\n${stringify(b)}`));
5353
}
5454
export function lengthOf(a: ReadonlyArray<{}>, length: number, msg = "Expected length to match."): void {
5555
assert(a.length === length, msg);
@@ -76,6 +76,10 @@ namespace assert {
7676
const bKeys = Object.keys(b).sort();
7777
return aKeys.length === bKeys.length && aKeys.every((key, i) => bKeys[i] === key && isDeepEqual((a as any)[key], (b as any)[key]));
7878
}
79+
80+
function stringify(value: {} | null | undefined): string {
81+
return JSON.stringify(value, undefined, 4);
82+
}
7983
}
8084
declare var __dirname: string; // Node-specific
8185
var global: NodeJS.Global = <any>Function("return this").call(undefined);
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
////declare function f<T>(x: number): T;
4+
////const x/**/ = f();
5+
6+
verify.quickInfoAt("", "const x: {}");

0 commit comments

Comments
 (0)