From 54bbf74f62db993ab5f7957f7f449fb469922b65 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Wed, 28 Nov 2018 13:58:43 -0800 Subject: [PATCH] Do not lookup name of default property symbols from the symbols value declaration (#28711) --- src/compiler/checker.ts | 10 +++++-- .../keyofModuleObjectHasCorrectKeys.js | 27 +++++++++++++++++++ .../keyofModuleObjectHasCorrectKeys.symbols | 27 +++++++++++++++++++ .../keyofModuleObjectHasCorrectKeys.types | 27 +++++++++++++++++++ .../keyofModuleObjectHasCorrectKeys.ts | 11 ++++++++ 5 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/keyofModuleObjectHasCorrectKeys.js create mode 100644 tests/baselines/reference/keyofModuleObjectHasCorrectKeys.symbols create mode 100644 tests/baselines/reference/keyofModuleObjectHasCorrectKeys.types create mode 100644 tests/cases/compiler/keyofModuleObjectHasCorrectKeys.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7a1364c7a1f..da3c807777c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9410,8 +9410,13 @@ namespace ts { if (!(getDeclarationModifierFlagsFromSymbol(prop) & ModifierFlags.NonPublicAccessibilityModifier)) { let type = getLateBoundSymbol(prop).nameType; if (!type && !isKnownSymbol(prop)) { - const name = prop.valueDeclaration && getNameOfDeclaration(prop.valueDeclaration) as PropertyName; - type = name && getLiteralTypeFromPropertyName(name) || getLiteralType(symbolName(prop)); + if (prop.escapedName === InternalSymbolName.Default) { + type = getLiteralType("default"); + } + else { + const name = prop.valueDeclaration && getNameOfDeclaration(prop.valueDeclaration) as PropertyName; + type = name && getLiteralTypeFromPropertyName(name) || getLiteralType(symbolName(prop)); + } } if (type && type.flags & include) { return type; @@ -20873,6 +20878,7 @@ namespace ts { if (hasSyntheticDefault) { const memberTable = createSymbolTable(); const newSymbol = createSymbol(SymbolFlags.Alias, InternalSymbolName.Default); + newSymbol.nameType = getLiteralType("default"); newSymbol.target = resolveSymbol(symbol); memberTable.set(InternalSymbolName.Default, newSymbol); const anonymousSymbol = createSymbol(SymbolFlags.TypeLiteral, InternalSymbolName.Type); diff --git a/tests/baselines/reference/keyofModuleObjectHasCorrectKeys.js b/tests/baselines/reference/keyofModuleObjectHasCorrectKeys.js new file mode 100644 index 00000000000..78a974bf590 --- /dev/null +++ b/tests/baselines/reference/keyofModuleObjectHasCorrectKeys.js @@ -0,0 +1,27 @@ +//// [tests/cases/compiler/keyofModuleObjectHasCorrectKeys.ts] //// + +//// [example.ts] +export default function add(a: number, b: number) { + return a + b; +} + +//// [test.ts] +import * as example from './example'; + +declare function test(object: T, method: keyof T): void; + +test(example, "default"); + + +//// [example.js] +"use strict"; +exports.__esModule = true; +function add(a, b) { + return a + b; +} +exports["default"] = add; +//// [test.js] +"use strict"; +exports.__esModule = true; +var example = require("./example"); +test(example, "default"); diff --git a/tests/baselines/reference/keyofModuleObjectHasCorrectKeys.symbols b/tests/baselines/reference/keyofModuleObjectHasCorrectKeys.symbols new file mode 100644 index 00000000000..b92bc8aa5ac --- /dev/null +++ b/tests/baselines/reference/keyofModuleObjectHasCorrectKeys.symbols @@ -0,0 +1,27 @@ +=== tests/cases/compiler/example.ts === +export default function add(a: number, b: number) { +>add : Symbol(add, Decl(example.ts, 0, 0)) +>a : Symbol(a, Decl(example.ts, 0, 28)) +>b : Symbol(b, Decl(example.ts, 0, 38)) + + return a + b; +>a : Symbol(a, Decl(example.ts, 0, 28)) +>b : Symbol(b, Decl(example.ts, 0, 38)) +} + +=== tests/cases/compiler/test.ts === +import * as example from './example'; +>example : Symbol(example, Decl(test.ts, 0, 6)) + +declare function test(object: T, method: keyof T): void; +>test : Symbol(test, Decl(test.ts, 0, 37)) +>T : Symbol(T, Decl(test.ts, 2, 22)) +>object : Symbol(object, Decl(test.ts, 2, 25)) +>T : Symbol(T, Decl(test.ts, 2, 22)) +>method : Symbol(method, Decl(test.ts, 2, 35)) +>T : Symbol(T, Decl(test.ts, 2, 22)) + +test(example, "default"); +>test : Symbol(test, Decl(test.ts, 0, 37)) +>example : Symbol(example, Decl(test.ts, 0, 6)) + diff --git a/tests/baselines/reference/keyofModuleObjectHasCorrectKeys.types b/tests/baselines/reference/keyofModuleObjectHasCorrectKeys.types new file mode 100644 index 00000000000..f3f83f3942a --- /dev/null +++ b/tests/baselines/reference/keyofModuleObjectHasCorrectKeys.types @@ -0,0 +1,27 @@ +=== tests/cases/compiler/example.ts === +export default function add(a: number, b: number) { +>add : (a: number, b: number) => number +>a : number +>b : number + + return a + b; +>a + b : number +>a : number +>b : number +} + +=== tests/cases/compiler/test.ts === +import * as example from './example'; +>example : typeof example + +declare function test(object: T, method: keyof T): void; +>test : (object: T, method: keyof T) => void +>object : T +>method : keyof T + +test(example, "default"); +>test(example, "default") : void +>test : (object: T, method: keyof T) => void +>example : typeof example +>"default" : "default" + diff --git a/tests/cases/compiler/keyofModuleObjectHasCorrectKeys.ts b/tests/cases/compiler/keyofModuleObjectHasCorrectKeys.ts new file mode 100644 index 00000000000..3d92dff9a2f --- /dev/null +++ b/tests/cases/compiler/keyofModuleObjectHasCorrectKeys.ts @@ -0,0 +1,11 @@ +// @filename: example.ts +export default function add(a: number, b: number) { + return a + b; +} + +// @filename: test.ts +import * as example from './example'; + +declare function test(object: T, method: keyof T): void; + +test(example, "default");