From 9b987eb947d1633a072c39f46255040dc7b4bedc Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Wed, 4 Apr 2018 15:26:10 -0700 Subject: [PATCH] Dont bind a local symbol for a default export without a name (#23152) --- src/compiler/binder.ts | 7 +++--- src/compiler/checker.ts | 2 +- ...defaultIsNotVisibleInLocalScope.errors.txt | 17 ++++++++++++++ .../defaultIsNotVisibleInLocalScope.js | 23 +++++++++++++++++++ .../defaultIsNotVisibleInLocalScope.symbols | 14 +++++++++++ .../defaultIsNotVisibleInLocalScope.types | 19 +++++++++++++++ .../defaultIsNotVisibleInLocalScope.ts | 9 ++++++++ 7 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 tests/baselines/reference/defaultIsNotVisibleInLocalScope.errors.txt create mode 100644 tests/baselines/reference/defaultIsNotVisibleInLocalScope.js create mode 100644 tests/baselines/reference/defaultIsNotVisibleInLocalScope.symbols create mode 100644 tests/baselines/reference/defaultIsNotVisibleInLocalScope.types create mode 100644 tests/cases/compiler/defaultIsNotVisibleInLocalScope.ts diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 948cd3884b3..9ae8ec22670 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -288,10 +288,6 @@ namespace ts { } Debug.fail("Unknown binary declaration kind"); break; - - case SyntaxKind.FunctionDeclaration: - case SyntaxKind.ClassDeclaration: - return (hasModifier(node, ModifierFlags.Default) ? InternalSymbolName.Default : undefined); case SyntaxKind.JSDocFunctionType: return (isJSDocConstructSignature(node) ? InternalSymbolName.New : InternalSymbolName.Call); case SyntaxKind.Parameter: @@ -459,6 +455,9 @@ namespace ts { if (node.kind === SyntaxKind.JSDocTypedefTag) Debug.assert(isInJavaScriptFile(node)); // We shouldn't add symbols for JSDoc nodes if not in a JS file. const isJSDocTypedefInJSDocNamespace = isJSDocTypedefTag(node) && node.name && node.name.kind === SyntaxKind.Identifier && node.name.isInJSDocNamespace; if ((!isAmbientModule(node) && (hasExportModifier || container.flags & NodeFlags.ExportContext)) || isJSDocTypedefInJSDocNamespace) { + if (hasModifier(node, ModifierFlags.Default) && !getDeclarationName(node)) { + return declareSymbol(container.symbol.exports, container.symbol, node, symbolFlags, symbolExcludes); // No local symbol for an unnamed default! + } const exportKind = symbolFlags & SymbolFlags.Value ? SymbolFlags.ExportValue : 0; const local = declareSymbol(container.locals, /*parent*/ undefined, node, exportKind, symbolExcludes); local.exportSymbol = declareSymbol(container.symbol.exports, container.symbol, node, symbolFlags, symbolExcludes); diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b36f86c1865..d0bd6a5bdee 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1291,7 +1291,7 @@ namespace ts { } } - if (result = lookup(moduleExports, name, meaning & SymbolFlags.ModuleMember)) { + if (name !== InternalSymbolName.Default && (result = lookup(moduleExports, name, meaning & SymbolFlags.ModuleMember))) { break loop; } break; diff --git a/tests/baselines/reference/defaultIsNotVisibleInLocalScope.errors.txt b/tests/baselines/reference/defaultIsNotVisibleInLocalScope.errors.txt new file mode 100644 index 00000000000..9405e2b8b5b --- /dev/null +++ b/tests/baselines/reference/defaultIsNotVisibleInLocalScope.errors.txt @@ -0,0 +1,17 @@ +tests/cases/compiler/a.ts(4,24): error TS2304: Cannot find name 'default'. +tests/cases/compiler/b.ts(2,24): error TS2304: Cannot find name 'default'. + + +==== tests/cases/compiler/a.ts (1 errors) ==== + export default function () { + return true; + } + export type X = typeof default; // expect error + ~~~~~~~ +!!! error TS2304: Cannot find name 'default'. + +==== tests/cases/compiler/b.ts (1 errors) ==== + export default { a: true } + export type X = typeof default; // expect error + ~~~~~~~ +!!! error TS2304: Cannot find name 'default'. \ No newline at end of file diff --git a/tests/baselines/reference/defaultIsNotVisibleInLocalScope.js b/tests/baselines/reference/defaultIsNotVisibleInLocalScope.js new file mode 100644 index 00000000000..32a77d91ecd --- /dev/null +++ b/tests/baselines/reference/defaultIsNotVisibleInLocalScope.js @@ -0,0 +1,23 @@ +//// [tests/cases/compiler/defaultIsNotVisibleInLocalScope.ts] //// + +//// [a.ts] +export default function () { + return true; +} +export type X = typeof default; // expect error + +//// [b.ts] +export default { a: true } +export type X = typeof default; // expect error + +//// [a.js] +"use strict"; +exports.__esModule = true; +function default_1() { + return true; +} +exports["default"] = default_1; +//// [b.js] +"use strict"; +exports.__esModule = true; +exports["default"] = { a: true }; diff --git a/tests/baselines/reference/defaultIsNotVisibleInLocalScope.symbols b/tests/baselines/reference/defaultIsNotVisibleInLocalScope.symbols new file mode 100644 index 00000000000..2e76fa47fcd --- /dev/null +++ b/tests/baselines/reference/defaultIsNotVisibleInLocalScope.symbols @@ -0,0 +1,14 @@ +=== tests/cases/compiler/a.ts === +export default function () { + return true; +} +export type X = typeof default; // expect error +>X : Symbol(X, Decl(a.ts, 2, 1)) + +=== tests/cases/compiler/b.ts === +export default { a: true } +>a : Symbol(a, Decl(b.ts, 0, 16)) + +export type X = typeof default; // expect error +>X : Symbol(X, Decl(b.ts, 0, 26)) + diff --git a/tests/baselines/reference/defaultIsNotVisibleInLocalScope.types b/tests/baselines/reference/defaultIsNotVisibleInLocalScope.types new file mode 100644 index 00000000000..fb92acd99a2 --- /dev/null +++ b/tests/baselines/reference/defaultIsNotVisibleInLocalScope.types @@ -0,0 +1,19 @@ +=== tests/cases/compiler/a.ts === +export default function () { + return true; +>true : true +} +export type X = typeof default; // expect error +>X : any +>default : any + +=== tests/cases/compiler/b.ts === +export default { a: true } +>{ a: true } : { a: boolean; } +>a : boolean +>true : true + +export type X = typeof default; // expect error +>X : any +>default : any + diff --git a/tests/cases/compiler/defaultIsNotVisibleInLocalScope.ts b/tests/cases/compiler/defaultIsNotVisibleInLocalScope.ts new file mode 100644 index 00000000000..d0c40960cea --- /dev/null +++ b/tests/cases/compiler/defaultIsNotVisibleInLocalScope.ts @@ -0,0 +1,9 @@ +// @filename: a.ts +export default function () { + return true; +} +export type X = typeof default; // expect error + +// @filename: b.ts +export default { a: true } +export type X = typeof default; // expect error \ No newline at end of file