From f4ff322df38014f313ac7288e363f2cad0829c26 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Thu, 8 Mar 2018 11:15:09 -0800 Subject: [PATCH] Handle resolving and unknown symbols in getLiteralTypeFromPropertyName --- src/compiler/checker.ts | 2 +- ...alTypeNameAssertionNotTriggered.errors.txt | 17 +++++++++++++ .../literalTypeNameAssertionNotTriggered.js | 22 ++++++++++++++++ ...teralTypeNameAssertionNotTriggered.symbols | 23 +++++++++++++++++ ...literalTypeNameAssertionNotTriggered.types | 25 +++++++++++++++++++ .../literalTypeNameAssertionNotTriggered.ts | 8 ++++++ 6 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/literalTypeNameAssertionNotTriggered.errors.txt create mode 100644 tests/baselines/reference/literalTypeNameAssertionNotTriggered.js create mode 100644 tests/baselines/reference/literalTypeNameAssertionNotTriggered.symbols create mode 100644 tests/baselines/reference/literalTypeNameAssertionNotTriggered.types create mode 100644 tests/cases/compiler/literalTypeNameAssertionNotTriggered.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 19b9389bf0ccb..71e669aeacf9f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8014,7 +8014,7 @@ namespace ts { function getLiteralTypeFromPropertyName(prop: Symbol) { const links = getSymbolLinks(getLateBoundSymbol(prop)); if (!links.nameType) { - if (links.target) { + if (links.target && links.target !== unknownSymbol && links.target !== resolvingSymbol) { Debug.assert(links.target.escapedName === prop.escapedName || links.target.escapedName === InternalSymbolName.Computed, "Target symbol and symbol do not have the same name"); links.nameType = getLiteralTypeFromPropertyName(links.target); } diff --git a/tests/baselines/reference/literalTypeNameAssertionNotTriggered.errors.txt b/tests/baselines/reference/literalTypeNameAssertionNotTriggered.errors.txt new file mode 100644 index 0000000000000..e7b16c340102b --- /dev/null +++ b/tests/baselines/reference/literalTypeNameAssertionNotTriggered.errors.txt @@ -0,0 +1,17 @@ +/a.ts(1,20): error TS2307: Cannot find module 'something'. +/b.ts(3,6): error TS2345: Argument of type '""' is not assignable to parameter of type '"x"'. + + +==== /b.ts (1 errors) ==== + import a = require('./a'); + declare function f(obj: T, key: keyof T): void; + f(a, ""); + ~~ +!!! error TS2345: Argument of type '""' is not assignable to parameter of type '"x"'. + +==== /a.ts (1 errors) ==== + import x = require("something"); + ~~~~~~~~~~~ +!!! error TS2307: Cannot find module 'something'. + export { x }; + \ No newline at end of file diff --git a/tests/baselines/reference/literalTypeNameAssertionNotTriggered.js b/tests/baselines/reference/literalTypeNameAssertionNotTriggered.js new file mode 100644 index 0000000000000..28f6ce119f221 --- /dev/null +++ b/tests/baselines/reference/literalTypeNameAssertionNotTriggered.js @@ -0,0 +1,22 @@ +//// [tests/cases/compiler/literalTypeNameAssertionNotTriggered.ts] //// + +//// [a.ts] +import x = require("something"); +export { x }; + +//// [b.ts] +import a = require('./a'); +declare function f(obj: T, key: keyof T): void; +f(a, ""); + + +//// [a.js] +"use strict"; +exports.__esModule = true; +var x = require("something"); +exports.x = x; +//// [b.js] +"use strict"; +exports.__esModule = true; +var a = require("./a"); +f(a, ""); diff --git a/tests/baselines/reference/literalTypeNameAssertionNotTriggered.symbols b/tests/baselines/reference/literalTypeNameAssertionNotTriggered.symbols new file mode 100644 index 0000000000000..dcdfae542a8a1 --- /dev/null +++ b/tests/baselines/reference/literalTypeNameAssertionNotTriggered.symbols @@ -0,0 +1,23 @@ +=== /b.ts === +import a = require('./a'); +>a : Symbol(a, Decl(b.ts, 0, 0)) + +declare function f(obj: T, key: keyof T): void; +>f : Symbol(f, Decl(b.ts, 0, 26)) +>T : Symbol(T, Decl(b.ts, 1, 19)) +>obj : Symbol(obj, Decl(b.ts, 1, 22)) +>T : Symbol(T, Decl(b.ts, 1, 19)) +>key : Symbol(key, Decl(b.ts, 1, 29)) +>T : Symbol(T, Decl(b.ts, 1, 19)) + +f(a, ""); +>f : Symbol(f, Decl(b.ts, 0, 26)) +>a : Symbol(a, Decl(b.ts, 0, 0)) + +=== /a.ts === +import x = require("something"); +>x : Symbol(x, Decl(a.ts, 0, 0)) + +export { x }; +>x : Symbol(x, Decl(a.ts, 1, 8)) + diff --git a/tests/baselines/reference/literalTypeNameAssertionNotTriggered.types b/tests/baselines/reference/literalTypeNameAssertionNotTriggered.types new file mode 100644 index 0000000000000..b692d38bd0f8c --- /dev/null +++ b/tests/baselines/reference/literalTypeNameAssertionNotTriggered.types @@ -0,0 +1,25 @@ +=== /b.ts === +import a = require('./a'); +>a : typeof a + +declare function f(obj: T, key: keyof T): void; +>f : (obj: T, key: keyof T) => void +>T : T +>obj : T +>T : T +>key : keyof T +>T : T + +f(a, ""); +>f(a, "") : any +>f : (obj: T, key: keyof T) => void +>a : typeof a +>"" : "" + +=== /a.ts === +import x = require("something"); +>x : any + +export { x }; +>x : any + diff --git a/tests/cases/compiler/literalTypeNameAssertionNotTriggered.ts b/tests/cases/compiler/literalTypeNameAssertionNotTriggered.ts new file mode 100644 index 0000000000000..02396d0fd6593 --- /dev/null +++ b/tests/cases/compiler/literalTypeNameAssertionNotTriggered.ts @@ -0,0 +1,8 @@ +// @Filename: /a.ts +import x = require("something"); +export { x }; + +// @Filename: /b.ts +import a = require('./a'); +declare function f(obj: T, key: keyof T): void; +f(a, "");