From bcb180a99b6dbc22b0388926801dfaa442cc6669 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Wed, 23 Mar 2016 15:48:25 -0700 Subject: [PATCH] Fixes generated names and some formatting in system modules. --- src/compiler/factory.ts | 4 +- src/compiler/printer.ts | 47 ++++++++++++++----- src/compiler/transformers/destructuring.ts | 16 +++---- src/compiler/transformers/module/system.ts | 25 +++++----- src/compiler/types.ts | 7 +-- .../reference/aliasesInSystemModule2.js | 4 +- .../allowSyntheticDefaultImports2.js | 22 ++++----- .../allowSyntheticDefaultImports3.js | 22 ++++----- .../allowSyntheticDefaultImports5.js | 14 +++--- .../allowSyntheticDefaultImports6.js | 14 +++--- .../reference/ambientDeclarationsExternal.js | 2 +- ...nalModuleInsideNonAmbientExternalModule.js | 1 - ...rnalModuleWithInternalImportDeclaration.js | 2 +- ...lModuleWithoutInternalImportDeclaration.js | 2 +- .../ambientInsideNonAmbientExternalModule.js | 1 - tests/baselines/reference/systemModule10.js | 4 +- .../baselines/reference/systemModule10_ES5.js | 4 +- tests/baselines/reference/systemModule14.js | 4 +- tests/baselines/reference/systemModule9.js | 20 ++++---- 19 files changed, 116 insertions(+), 99 deletions(-) diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index 836b367d08d..f2d11ef227c 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -424,11 +424,11 @@ namespace ts { return block; } - export function createVariableStatement(modifiers: Modifier[], declarationList: VariableDeclarationList, location?: TextRange): VariableStatement { + export function createVariableStatement(modifiers: Modifier[], declarationList: VariableDeclarationList | VariableDeclaration[], location?: TextRange): VariableStatement { const node = createNode(SyntaxKind.VariableStatement, location); node.decorators = undefined; node.modifiers = modifiers ? createNodeArray(modifiers) : undefined; - node.declarationList = declarationList; + node.declarationList = isArray(declarationList) ? createVariableDeclarationList(declarationList) : declarationList; return node; } diff --git a/src/compiler/printer.ts b/src/compiler/printer.ts index da46a89b9e2..e2bef72f15a 100644 --- a/src/compiler/printer.ts +++ b/src/compiler/printer.ts @@ -2343,14 +2343,12 @@ const _super = (function (geti, seti) { return node; } - function getTextOfNode(node: Node, includeTrivia?: boolean) { - if (isIdentifier(node)) { - if (node.autoGenerateKind) { - return getGeneratedIdentifier(node); - } - else if (nodeIsSynthesized(node) || !node.parent) { - return unescapeIdentifier(node.text); - } + function getTextOfNode(node: Node, includeTrivia?: boolean): string { + if (isGeneratedIdentifier(node)) { + return getGeneratedIdentifier(node); + } + else if (isIdentifier(node) && (nodeIsSynthesized(node) || !node.parent)) { + return unescapeIdentifier(node.text); } else if (isLiteralExpression(node) && (nodeIsSynthesized(node) || !node.parent)) { return node.text; @@ -2452,7 +2450,7 @@ const _super = (function (geti, seti) { } function generateNameForModuleOrEnum(node: ModuleDeclaration | EnumDeclaration) { - const name = node.name.text; + const name = getTextOfNode(node.name); // Use module/enum name itself if it is unique, otherwise make a unique variation return isUniqueLocalName(name, node) ? name : makeUniqueName(name); } @@ -2472,10 +2470,10 @@ const _super = (function (geti, seti) { return makeUniqueName("class"); } - function generateNameForNode(node: Node) { + function generateNameForNode(node: Node): string { switch (node.kind) { case SyntaxKind.Identifier: - return makeUniqueName((node).text); + return makeUniqueName(getTextOfNode(node)); case SyntaxKind.ModuleDeclaration: case SyntaxKind.EnumDeclaration: return generateNameForModuleOrEnum(node); @@ -2502,14 +2500,37 @@ const _super = (function (geti, seti) { case GeneratedIdentifierKind.Unique: return makeUniqueName(node.text); case GeneratedIdentifierKind.Node: - return generateNameForNode(getOriginalNode(node)); + return generateNameForNode(getSourceNodeForGeneratedName(node)); } } function getGeneratedIdentifier(node: Identifier) { - const id = getOriginalNodeId(node); + const id = getNodeIdForGeneratedIdentifier(node); return nodeToGeneratedName[id] || (nodeToGeneratedName[id] = unescapeIdentifier(generateIdentifier(node))); } + + function getSourceNodeForGeneratedName(name: Identifier) { + let node: Node = name; + while (node.original !== undefined) { + node = node.original; + if (isIdentifier(node) && node.autoGenerateKind === GeneratedIdentifierKind.Node) { + break; + } + } + + return node; + } + + function getNodeIdForGeneratedIdentifier(node: Identifier) { + switch (node.autoGenerateKind) { + case GeneratedIdentifierKind.Auto: + case GeneratedIdentifierKind.Loop: + case GeneratedIdentifierKind.Unique: + return getNodeId(node); + case GeneratedIdentifierKind.Node: + return getNodeId(getSourceNodeForGeneratedName(node)); + } + } } function createDelimiterMap() { diff --git a/src/compiler/transformers/destructuring.ts b/src/compiler/transformers/destructuring.ts index bd3bbcdfd43..abe568a80f3 100644 --- a/src/compiler/transformers/destructuring.ts +++ b/src/compiler/transformers/destructuring.ts @@ -365,20 +365,18 @@ namespace ts { ensureIdentifier(propertyName.expression, /*reuseIdentifierExpressions*/ false, /*location*/ propertyName, emitTempVariableAssignment) ); } - else if (isIdentifier(propertyName)) { - return createPropertyAccess( - expression, - propertyName.text - ); - } - else { - // We create a synthetic copy of the identifier in order to avoid the rewriting that might - // otherwise occur when the identifier is emitted. + else if (isLiteralExpression(propertyName)) { return createElementAccess( expression, getSynthesizedClone(propertyName) ); } + else { + return createPropertyAccess( + expression, + isGeneratedIdentifier(propertyName) ? getSynthesizedClone(propertyName) : createIdentifier(propertyName.text) + ); + } } } diff --git a/src/compiler/transformers/module/system.ts b/src/compiler/transformers/module/system.ts index af7ff4e0031..4a508b3aa30 100644 --- a/src/compiler/transformers/module/system.ts +++ b/src/compiler/transformers/module/system.ts @@ -339,7 +339,8 @@ namespace ts { const setters: Expression[] = []; for (const group of dependencyGroups) { // derive a unique name for parameter from the first named entry in the group - const parameterName = createUniqueName(forEach(group.externalImports, getLocalNameTextForExternalImport) || ""); + const localName = forEach(group.externalImports, getLocalNameForExternalImport); + const parameterName = localName ? getGeneratedNameForNode(localName) : createUniqueName(""); const statements: Statement[] = []; for (const entry of group.externalImports) { const importVariableName = getLocalNameForExternalImport(entry); @@ -1121,11 +1122,6 @@ namespace ts { return undefined; } - function getLocalNameTextForExternalImport(node: ImportDeclaration | ExportDeclaration | ImportEqualsDeclaration): string { - const name = getLocalNameForExternalImport(node); - return name ? name.text : undefined; - } - function getLocalNameForExternalImport(node: ImportDeclaration | ExportDeclaration | ImportEqualsDeclaration): Identifier { const namespaceDeclaration = getNamespaceDeclarationNode(node); if (namespaceDeclaration && !isDefaultImport(node)) { @@ -1182,14 +1178,17 @@ namespace ts { ]), m, createBlock([ - createIf( - condition, - createStatement( - createAssignment( - createElementAccess(exports, n), - createElementAccess(m, n) + setNodeEmitFlags( + createIf( + condition, + createStatement( + createAssignment( + createElementAccess(exports, n), + createElementAccess(m, n) + ) ) - ) + ), + NodeEmitFlags.SingleLine ) ]) ), diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 02e289d221f..475d96b87f7 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -480,6 +480,7 @@ namespace ts { // @kind(SyntaxKind.StaticKeyword) export interface Modifier extends Node { } + /*@internal*/ export const enum GeneratedIdentifierKind { None, // Not automatically generated. Auto, // Automatically generated identifier. @@ -490,9 +491,9 @@ namespace ts { // @kind(SyntaxKind.Identifier) export interface Identifier extends PrimaryExpression { - text: string; // Text of identifier (with escapes converted to characters) - originalKeywordKind?: SyntaxKind; // Original syntaxKind which get set so that we can report an error later - autoGenerateKind?: GeneratedIdentifierKind; // Specifies whether to auto-generate the text for an identifier. + text: string; // Text of identifier (with escapes converted to characters) + originalKeywordKind?: SyntaxKind; // Original syntaxKind which get set so that we can report an error later + /*@internal*/ autoGenerateKind?: GeneratedIdentifierKind; // Specifies whether to auto-generate the text for an identifier. } // @kind(SyntaxKind.QualifiedName) diff --git a/tests/baselines/reference/aliasesInSystemModule2.js b/tests/baselines/reference/aliasesInSystemModule2.js index cb872c44e25..71fe558d43a 100644 --- a/tests/baselines/reference/aliasesInSystemModule2.js +++ b/tests/baselines/reference/aliasesInSystemModule2.js @@ -22,8 +22,8 @@ System.register(["foo"], function (exports_1, context_1) { var foo_1, cls, cls2, x, y, z, M; return { setters: [ - function (_1) { - foo_1 = _1; + function (foo_1_1) { + foo_1 = foo_1_1; } ], execute: function () { diff --git a/tests/baselines/reference/allowSyntheticDefaultImports2.js b/tests/baselines/reference/allowSyntheticDefaultImports2.js index 87e47f9c9a1..93c13617e4a 100644 --- a/tests/baselines/reference/allowSyntheticDefaultImports2.js +++ b/tests/baselines/reference/allowSyntheticDefaultImports2.js @@ -10,13 +10,13 @@ export class Foo { } //// [b.js] -System.register([], function(exports_1, context_1) { +System.register([], function (exports_1, context_1) { "use strict"; var __moduleName = context_1 && context_1.id; var Foo; return { - setters:[], - execute: function() { + setters: [], + execute: function () { Foo = (function () { function Foo() { } @@ -24,21 +24,21 @@ System.register([], function(exports_1, context_1) { }()); exports_1("Foo", Foo); } - } + }; }); //// [a.js] -System.register(["./b"], function(exports_1, context_1) { +System.register(["./b"], function (exports_1, context_1) { "use strict"; var __moduleName = context_1 && context_1.id; - var b_1; - var x; + var b_1, x; return { - setters:[ + setters: [ function (b_1_1) { b_1 = b_1_1; - }], - execute: function() { + } + ], + execute: function () { exports_1("x", x = new b_1["default"].Foo()); } - } + }; }); diff --git a/tests/baselines/reference/allowSyntheticDefaultImports3.js b/tests/baselines/reference/allowSyntheticDefaultImports3.js index 348ce42a60a..74b1dcb776d 100644 --- a/tests/baselines/reference/allowSyntheticDefaultImports3.js +++ b/tests/baselines/reference/allowSyntheticDefaultImports3.js @@ -11,13 +11,13 @@ export class Foo { //// [b.js] -System.register([], function(exports_1, context_1) { +System.register([], function (exports_1, context_1) { "use strict"; var __moduleName = context_1 && context_1.id; var Foo; return { - setters:[], - execute: function() { + setters: [], + execute: function () { Foo = (function () { function Foo() { } @@ -25,21 +25,21 @@ System.register([], function(exports_1, context_1) { }()); exports_1("Foo", Foo); } - } + }; }); //// [a.js] -System.register(["./b"], function(exports_1, context_1) { +System.register(["./b"], function (exports_1, context_1) { "use strict"; var __moduleName = context_1 && context_1.id; - var b_1; - var x; + var b_1, x; return { - setters:[ + setters: [ function (b_1_1) { b_1 = b_1_1; - }], - execute: function() { + } + ], + execute: function () { exports_1("x", x = new b_1["default"].Foo()); } - } + }; }); diff --git a/tests/baselines/reference/allowSyntheticDefaultImports5.js b/tests/baselines/reference/allowSyntheticDefaultImports5.js index f59226e152d..765d1140864 100644 --- a/tests/baselines/reference/allowSyntheticDefaultImports5.js +++ b/tests/baselines/reference/allowSyntheticDefaultImports5.js @@ -12,18 +12,18 @@ export var x = new Foo(); //// [a.js] -System.register(["./b"], function(exports_1, context_1) { +System.register(["./b"], function (exports_1, context_1) { "use strict"; var __moduleName = context_1 && context_1.id; - var b_1; - var x; + var b_1, x; return { - setters:[ + setters: [ function (b_1_1) { b_1 = b_1_1; - }], - execute: function() { + } + ], + execute: function () { exports_1("x", x = new b_1["default"]()); } - } + }; }); diff --git a/tests/baselines/reference/allowSyntheticDefaultImports6.js b/tests/baselines/reference/allowSyntheticDefaultImports6.js index d2f25e538c5..9ae7acae919 100644 --- a/tests/baselines/reference/allowSyntheticDefaultImports6.js +++ b/tests/baselines/reference/allowSyntheticDefaultImports6.js @@ -12,18 +12,18 @@ export var x = new Foo(); //// [a.js] -System.register(["./b"], function(exports_1, context_1) { +System.register(["./b"], function (exports_1, context_1) { "use strict"; var __moduleName = context_1 && context_1.id; - var b_1; - var x; + var b_1, x; return { - setters:[ + setters: [ function (b_1_1) { b_1 = b_1_1; - }], - execute: function() { + } + ], + execute: function () { exports_1("x", x = new b_1["default"]()); } - } + }; }); diff --git a/tests/baselines/reference/ambientDeclarationsExternal.js b/tests/baselines/reference/ambientDeclarationsExternal.js index 42375bc1d09..b92993128ab 100644 --- a/tests/baselines/reference/ambientDeclarationsExternal.js +++ b/tests/baselines/reference/ambientDeclarationsExternal.js @@ -29,6 +29,6 @@ var n: number; //// [consumer.js] "use strict"; // Ambient external module members are always exported with or without export keyword when module lacks export assignment -var imp3 = require('equ2'); +var imp3 = require("equ2"); var n = imp3.x; var n; diff --git a/tests/baselines/reference/ambientExternalModuleInsideNonAmbientExternalModule.js b/tests/baselines/reference/ambientExternalModuleInsideNonAmbientExternalModule.js index bb0d3a907ae..8a3e15e7c7f 100644 --- a/tests/baselines/reference/ambientExternalModuleInsideNonAmbientExternalModule.js +++ b/tests/baselines/reference/ambientExternalModuleInsideNonAmbientExternalModule.js @@ -3,5 +3,4 @@ export declare module "M" { } //// [ambientExternalModuleInsideNonAmbientExternalModule.js] define(["require", "exports"], function (require, exports) { - "use strict"; }); diff --git a/tests/baselines/reference/ambientExternalModuleWithInternalImportDeclaration.js b/tests/baselines/reference/ambientExternalModuleWithInternalImportDeclaration.js index 77d8e2d830d..c91adaff864 100644 --- a/tests/baselines/reference/ambientExternalModuleWithInternalImportDeclaration.js +++ b/tests/baselines/reference/ambientExternalModuleWithInternalImportDeclaration.js @@ -20,7 +20,7 @@ var c = new A(); //// [ambientExternalModuleWithInternalImportDeclaration_0.js] //// [ambientExternalModuleWithInternalImportDeclaration_1.js] -define(["require", "exports", 'M'], function (require, exports, A) { +define(["require", "exports", "M"], function (require, exports, A) { "use strict"; var c = new A(); }); diff --git a/tests/baselines/reference/ambientExternalModuleWithoutInternalImportDeclaration.js b/tests/baselines/reference/ambientExternalModuleWithoutInternalImportDeclaration.js index 158992234a2..4c70a338bc3 100644 --- a/tests/baselines/reference/ambientExternalModuleWithoutInternalImportDeclaration.js +++ b/tests/baselines/reference/ambientExternalModuleWithoutInternalImportDeclaration.js @@ -19,7 +19,7 @@ var c = new A(); //// [ambientExternalModuleWithoutInternalImportDeclaration_0.js] //// [ambientExternalModuleWithoutInternalImportDeclaration_1.js] -define(["require", "exports", 'M'], function (require, exports, A) { +define(["require", "exports", "M"], function (require, exports, A) { "use strict"; var c = new A(); }); diff --git a/tests/baselines/reference/ambientInsideNonAmbientExternalModule.js b/tests/baselines/reference/ambientInsideNonAmbientExternalModule.js index 0e2d08ae07b..5db44bb1ce1 100644 --- a/tests/baselines/reference/ambientInsideNonAmbientExternalModule.js +++ b/tests/baselines/reference/ambientInsideNonAmbientExternalModule.js @@ -7,5 +7,4 @@ export declare module M { } //// [ambientInsideNonAmbientExternalModule.js] define(["require", "exports"], function (require, exports) { - "use strict"; }); diff --git a/tests/baselines/reference/systemModule10.js b/tests/baselines/reference/systemModule10.js index 5e95c584345..10afa784ebb 100644 --- a/tests/baselines/reference/systemModule10.js +++ b/tests/baselines/reference/systemModule10.js @@ -16,8 +16,8 @@ System.register(["file1", "file2"], function (exports_1, context_1) { var file1_1, n2; return { setters: [ - function (_1) { - file1_1 = _1; + function (file1_1_1) { + file1_1 = file1_1_1; }, function (n2_1) { n2 = n2_1; diff --git a/tests/baselines/reference/systemModule10_ES5.js b/tests/baselines/reference/systemModule10_ES5.js index 272c8552bd4..830c611bd38 100644 --- a/tests/baselines/reference/systemModule10_ES5.js +++ b/tests/baselines/reference/systemModule10_ES5.js @@ -16,8 +16,8 @@ System.register(["file1", "file2"], function (exports_1, context_1) { var file1_1, n2; return { setters: [ - function (_1) { - file1_1 = _1; + function (file1_1_1) { + file1_1 = file1_1_1; }, function (n2_1) { n2 = n2_1; diff --git a/tests/baselines/reference/systemModule14.js b/tests/baselines/reference/systemModule14.js index 8dcd0652647..bebe9244e07 100644 --- a/tests/baselines/reference/systemModule14.js +++ b/tests/baselines/reference/systemModule14.js @@ -20,8 +20,8 @@ System.register(["foo"], function (exports_1, context_1) { var foo_1, x; return { setters: [ - function (_1) { - foo_1 = _1; + function (foo_1_1) { + foo_1 = foo_1_1; } ], execute: function () { diff --git a/tests/baselines/reference/systemModule9.js b/tests/baselines/reference/systemModule9.js index 188764a3b2d..e46b97a71a2 100644 --- a/tests/baselines/reference/systemModule9.js +++ b/tests/baselines/reference/systemModule9.js @@ -43,22 +43,22 @@ System.register(["file1", "file2", "file3", "file4", "file5", "file6", "file7"], function (ns_1) { ns = ns_1; }, + function (file2_1_1) { + file2_1 = file2_1_1; + }, + function (file3_1_1) { + file3_1 = file3_1_1; + }, function (_1) { - file2_1 = _1; }, - function (_2) { - file3_1 = _2; - }, - function (_3) { - }, - function (_4) { - file5_1 = _4; + function (file5_1_1) { + file5_1 = file5_1_1; }, function (ns3_1) { ns3 = ns3_1; }, - function (_5) { - exportStar_1(_5); + function (file7_1_1) { + exportStar_1(file7_1_1); } ], execute: function () {