diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1f152a83b99..bd993d0217f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -11220,13 +11220,18 @@ module ts { return isConstEnumSymbol(s) || s.constEnumOnlyModule; } - function isReferencedAliasDeclaration(node: Node): boolean { + function isReferencedAliasDeclaration(node: Node, checkChildren?: boolean): boolean { if (isAliasSymbolDeclaration(node)) { let symbol = getSymbolOfNode(node); if (getSymbolLinks(symbol).referenced) { return true; } } + + if (checkChildren) { + return forEachChild(node, node => isReferencedAliasDeclaration(node, checkChildren)); + } + return false; } function isImplementationOfOverload(node: FunctionLikeDeclaration) { diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 3d80a9eb08a..2cced08c60a 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2717,7 +2717,7 @@ module ts { if (!(node.flags & NodeFlags.Export)) { emitStartOfVariableDeclarationList(node.declarationList); } - else if (languageVersion >= ScriptTarget.ES6 && node.parent.kind === SyntaxKind.SourceFile) { + else if (isES6ExportedDeclaration(node)) { // Exported ES6 module member write("export "); emitStartOfVariableDeclarationList(node.declarationList); @@ -3686,8 +3686,8 @@ module ts { // ES6 import if (node.importClause) { - let shouldEmitDefaultBindings = hasReferencedDefaultName(node.importClause); - let shouldEmitNamedBindings = hasReferencedNamedBindings(node.importClause); + let shouldEmitDefaultBindings = resolver.isReferencedAliasDeclaration(node.importClause); + let shouldEmitNamedBindings = node.importClause.namedBindings && resolver.isReferencedAliasDeclaration(node.importClause.namedBindings, /* checkChildren */ true); if (shouldEmitDefaultBindings || shouldEmitNamedBindings) { write("import "); emitStart(node.importClause); @@ -3726,27 +3726,6 @@ module ts { } } - function hasReferencedDefaultName(importClause: ImportClause) { - // If the default import is used, the mark will be on the importClause, - // as the alias declaration. - // If there are other named bindings on the import clause, we will - // will mark either the namedBindings(import * as n) or the NamedImport - // in the case of import {a} - return resolver.isReferencedAliasDeclaration(importClause); - } - - function hasReferencedNamedBindings(importClause: ImportClause) { - if (importClause && importClause.namedBindings) { - if (importClause.namedBindings.kind === SyntaxKind.NamespaceImport) { - return resolver.isReferencedAliasDeclaration(importClause.namedBindings); - } - else { - return forEach((importClause.namedBindings).elements, - namedImport => resolver.isReferencedAliasDeclaration(namedImport)); - } - } - } - function emitExternalImportDeclaration(node: ImportDeclaration | ImportEqualsDeclaration) { if (contains(externalImports, node)) { let isExportedImport = node.kind === SyntaxKind.ImportEqualsDeclaration && (node.flags & NodeFlags.Export) !== 0; @@ -3961,8 +3940,7 @@ module ts { switch (node.kind) { case SyntaxKind.ImportDeclaration: if (!(node).importClause || - hasReferencedDefaultName((node).importClause) || - hasReferencedNamedBindings((node).importClause)) { + resolver.isReferencedAliasDeclaration((node).importClause, /*checkChildren*/ true)) { // import "mod" // import x from "mod" where x is referenced // import * as x from "mod" where x is referenced diff --git a/src/compiler/types.ts b/src/compiler/types.ts index bc61eaf01d9..63db8e6be0a 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1207,7 +1207,7 @@ module ts { getGeneratedNameForNode(node: Node): string; getExpressionNameSubstitution(node: Identifier): string; isValueAliasDeclaration(node: Node): boolean; - isReferencedAliasDeclaration(node: Node): boolean; + isReferencedAliasDeclaration(node: Node, checkChildren?: boolean): boolean; isTopLevelValueImportEqualsWithEntityName(node: ImportEqualsDeclaration): boolean; getNodeCheckFlags(node: Node): NodeCheckFlags; isDeclarationVisible(node: Declaration): boolean; diff --git a/tests/baselines/reference/APISample_compile.js b/tests/baselines/reference/APISample_compile.js index 9fb87e68517..cc6a2d6b70f 100644 --- a/tests/baselines/reference/APISample_compile.js +++ b/tests/baselines/reference/APISample_compile.js @@ -942,7 +942,7 @@ declare module "typescript" { getGeneratedNameForNode(node: Node): string; getExpressionNameSubstitution(node: Identifier): string; isValueAliasDeclaration(node: Node): boolean; - isReferencedAliasDeclaration(node: Node): boolean; + isReferencedAliasDeclaration(node: Node, checkChildren?: boolean): boolean; isTopLevelValueImportEqualsWithEntityName(node: ImportEqualsDeclaration): boolean; getNodeCheckFlags(node: Node): NodeCheckFlags; isDeclarationVisible(node: Declaration): boolean; diff --git a/tests/baselines/reference/APISample_compile.types b/tests/baselines/reference/APISample_compile.types index d0c895fd031..0798444f9c5 100644 --- a/tests/baselines/reference/APISample_compile.types +++ b/tests/baselines/reference/APISample_compile.types @@ -3021,10 +3021,11 @@ declare module "typescript" { >node : Node >Node : Node - isReferencedAliasDeclaration(node: Node): boolean; ->isReferencedAliasDeclaration : (node: Node) => boolean + isReferencedAliasDeclaration(node: Node, checkChildren?: boolean): boolean; +>isReferencedAliasDeclaration : (node: Node, checkChildren?: boolean) => boolean >node : Node >Node : Node +>checkChildren : boolean isTopLevelValueImportEqualsWithEntityName(node: ImportEqualsDeclaration): boolean; >isTopLevelValueImportEqualsWithEntityName : (node: ImportEqualsDeclaration) => boolean diff --git a/tests/baselines/reference/APISample_linter.js b/tests/baselines/reference/APISample_linter.js index 6167cd99cb1..7adc64a083e 100644 --- a/tests/baselines/reference/APISample_linter.js +++ b/tests/baselines/reference/APISample_linter.js @@ -973,7 +973,7 @@ declare module "typescript" { getGeneratedNameForNode(node: Node): string; getExpressionNameSubstitution(node: Identifier): string; isValueAliasDeclaration(node: Node): boolean; - isReferencedAliasDeclaration(node: Node): boolean; + isReferencedAliasDeclaration(node: Node, checkChildren?: boolean): boolean; isTopLevelValueImportEqualsWithEntityName(node: ImportEqualsDeclaration): boolean; getNodeCheckFlags(node: Node): NodeCheckFlags; isDeclarationVisible(node: Declaration): boolean; diff --git a/tests/baselines/reference/APISample_linter.types b/tests/baselines/reference/APISample_linter.types index 3e44508c623..4d63f8b9a6e 100644 --- a/tests/baselines/reference/APISample_linter.types +++ b/tests/baselines/reference/APISample_linter.types @@ -3167,10 +3167,11 @@ declare module "typescript" { >node : Node >Node : Node - isReferencedAliasDeclaration(node: Node): boolean; ->isReferencedAliasDeclaration : (node: Node) => boolean + isReferencedAliasDeclaration(node: Node, checkChildren?: boolean): boolean; +>isReferencedAliasDeclaration : (node: Node, checkChildren?: boolean) => boolean >node : Node >Node : Node +>checkChildren : boolean isTopLevelValueImportEqualsWithEntityName(node: ImportEqualsDeclaration): boolean; >isTopLevelValueImportEqualsWithEntityName : (node: ImportEqualsDeclaration) => boolean diff --git a/tests/baselines/reference/APISample_transform.js b/tests/baselines/reference/APISample_transform.js index a0f984ed22b..447bbec9af8 100644 --- a/tests/baselines/reference/APISample_transform.js +++ b/tests/baselines/reference/APISample_transform.js @@ -974,7 +974,7 @@ declare module "typescript" { getGeneratedNameForNode(node: Node): string; getExpressionNameSubstitution(node: Identifier): string; isValueAliasDeclaration(node: Node): boolean; - isReferencedAliasDeclaration(node: Node): boolean; + isReferencedAliasDeclaration(node: Node, checkChildren?: boolean): boolean; isTopLevelValueImportEqualsWithEntityName(node: ImportEqualsDeclaration): boolean; getNodeCheckFlags(node: Node): NodeCheckFlags; isDeclarationVisible(node: Declaration): boolean; diff --git a/tests/baselines/reference/APISample_transform.types b/tests/baselines/reference/APISample_transform.types index 1c415af8599..c599e6653df 100644 --- a/tests/baselines/reference/APISample_transform.types +++ b/tests/baselines/reference/APISample_transform.types @@ -3117,10 +3117,11 @@ declare module "typescript" { >node : Node >Node : Node - isReferencedAliasDeclaration(node: Node): boolean; ->isReferencedAliasDeclaration : (node: Node) => boolean + isReferencedAliasDeclaration(node: Node, checkChildren?: boolean): boolean; +>isReferencedAliasDeclaration : (node: Node, checkChildren?: boolean) => boolean >node : Node >Node : Node +>checkChildren : boolean isTopLevelValueImportEqualsWithEntityName(node: ImportEqualsDeclaration): boolean; >isTopLevelValueImportEqualsWithEntityName : (node: ImportEqualsDeclaration) => boolean diff --git a/tests/baselines/reference/APISample_watcher.js b/tests/baselines/reference/APISample_watcher.js index ed372a7e876..3db6132e363 100644 --- a/tests/baselines/reference/APISample_watcher.js +++ b/tests/baselines/reference/APISample_watcher.js @@ -1011,7 +1011,7 @@ declare module "typescript" { getGeneratedNameForNode(node: Node): string; getExpressionNameSubstitution(node: Identifier): string; isValueAliasDeclaration(node: Node): boolean; - isReferencedAliasDeclaration(node: Node): boolean; + isReferencedAliasDeclaration(node: Node, checkChildren?: boolean): boolean; isTopLevelValueImportEqualsWithEntityName(node: ImportEqualsDeclaration): boolean; getNodeCheckFlags(node: Node): NodeCheckFlags; isDeclarationVisible(node: Declaration): boolean; diff --git a/tests/baselines/reference/APISample_watcher.types b/tests/baselines/reference/APISample_watcher.types index 72cde72f1ae..a51d148634f 100644 --- a/tests/baselines/reference/APISample_watcher.types +++ b/tests/baselines/reference/APISample_watcher.types @@ -3290,10 +3290,11 @@ declare module "typescript" { >node : Node >Node : Node - isReferencedAliasDeclaration(node: Node): boolean; ->isReferencedAliasDeclaration : (node: Node) => boolean + isReferencedAliasDeclaration(node: Node, checkChildren?: boolean): boolean; +>isReferencedAliasDeclaration : (node: Node, checkChildren?: boolean) => boolean >node : Node >Node : Node +>checkChildren : boolean isTopLevelValueImportEqualsWithEntityName(node: ImportEqualsDeclaration): boolean; >isTopLevelValueImportEqualsWithEntityName : (node: ImportEqualsDeclaration) => boolean