Skip to content

Commit e5e5ad8

Browse files
committed
Merge pull request #2471 from Microsoft/revisedNameGen2
Revised name generation #2, fixes #2449, #2447
2 parents baac6d8 + f0cbcd6 commit e5e5ad8

File tree

95 files changed

+993
-903
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+993
-903
lines changed

src/compiler/checker.ts

+23-141
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ module ts {
55
let nextNodeId = 1;
66
let nextMergeId = 1;
77

8+
// @internal
9+
export function getNodeId(node: Node): number {
10+
if (!node.id) node.id = nextNodeId++;
11+
return node.id;
12+
}
13+
814
/* @internal */ export let checkTime = 0;
915

1016
/* @internal */
@@ -264,8 +270,8 @@ module ts {
264270
}
265271

266272
function getNodeLinks(node: Node): NodeLinks {
267-
if (!node.id) node.id = nextNodeId++;
268-
return nodeLinks[node.id] || (nodeLinks[node.id] = {});
273+
let nodeId = getNodeId(node);
274+
return nodeLinks[nodeId] || (nodeLinks[nodeId] = {});
269275
}
270276

271277
function getSourceFile(node: Node): SourceFile {
@@ -10963,134 +10969,7 @@ module ts {
1096310969
return symbol.flags & SymbolFlags.ValueModule && symbol.declarations.length === 1 && symbol.declarations[0].kind === SyntaxKind.SourceFile;
1096410970
}
1096510971

10966-
function isNodeDescendentOf(node: Node, ancestor: Node): boolean {
10967-
while (node) {
10968-
if (node === ancestor) return true;
10969-
node = node.parent;
10970-
}
10971-
return false;
10972-
}
10973-
10974-
function isUniqueLocalName(name: string, container: Node): boolean {
10975-
for (let node = container; isNodeDescendentOf(node, container); node = node.nextContainer) {
10976-
if (node.locals && hasProperty(node.locals, name)) {
10977-
// We conservatively include alias symbols to cover cases where they're emitted as locals
10978-
if (node.locals[name].flags & (SymbolFlags.Value | SymbolFlags.ExportValue | SymbolFlags.Alias)) {
10979-
return false;
10980-
}
10981-
}
10982-
}
10983-
return true;
10984-
}
10985-
10986-
function getGeneratedNamesForSourceFile(sourceFile: SourceFile): Map<string> {
10987-
let links = getNodeLinks(sourceFile);
10988-
let generatedNames = links.generatedNames;
10989-
if (!generatedNames) {
10990-
generatedNames = links.generatedNames = {};
10991-
generateNames(sourceFile);
10992-
}
10993-
return generatedNames;
10994-
10995-
function generateNames(node: Node) {
10996-
switch (node.kind) {
10997-
case SyntaxKind.FunctionDeclaration:
10998-
case SyntaxKind.ClassDeclaration:
10999-
generateNameForFunctionOrClassDeclaration(<Declaration>node);
11000-
break;
11001-
case SyntaxKind.ModuleDeclaration:
11002-
generateNameForModuleOrEnum(<ModuleDeclaration>node);
11003-
generateNames((<ModuleDeclaration>node).body);
11004-
break;
11005-
case SyntaxKind.EnumDeclaration:
11006-
generateNameForModuleOrEnum(<EnumDeclaration>node);
11007-
break;
11008-
case SyntaxKind.ImportDeclaration:
11009-
generateNameForImportDeclaration(<ImportDeclaration>node);
11010-
break;
11011-
case SyntaxKind.ExportDeclaration:
11012-
generateNameForExportDeclaration(<ExportDeclaration>node);
11013-
break;
11014-
case SyntaxKind.ExportAssignment:
11015-
generateNameForExportAssignment(<ExportAssignment>node);
11016-
break;
11017-
case SyntaxKind.SourceFile:
11018-
case SyntaxKind.ModuleBlock:
11019-
forEach((<SourceFile | ModuleBlock>node).statements, generateNames);
11020-
break;
11021-
}
11022-
}
11023-
11024-
function isExistingName(name: string) {
11025-
return hasProperty(globals, name) || hasProperty(sourceFile.identifiers, name) || hasProperty(generatedNames, name);
11026-
}
11027-
11028-
function makeUniqueName(baseName: string): string {
11029-
let name = generateUniqueName(baseName, isExistingName);
11030-
return generatedNames[name] = name;
11031-
}
11032-
11033-
function assignGeneratedName(node: Node, name: string) {
11034-
getNodeLinks(node).generatedName = unescapeIdentifier(name);
11035-
}
11036-
11037-
function generateNameForFunctionOrClassDeclaration(node: Declaration) {
11038-
if (!node.name) {
11039-
assignGeneratedName(node, makeUniqueName("default"));
11040-
}
11041-
}
11042-
11043-
function generateNameForModuleOrEnum(node: ModuleDeclaration | EnumDeclaration) {
11044-
if (node.name.kind === SyntaxKind.Identifier) {
11045-
let name = node.name.text;
11046-
// Use module/enum name itself if it is unique, otherwise make a unique variation
11047-
assignGeneratedName(node, isUniqueLocalName(name, node) ? name : makeUniqueName(name));
11048-
}
11049-
}
11050-
11051-
function generateNameForImportOrExportDeclaration(node: ImportDeclaration | ExportDeclaration) {
11052-
let expr = getExternalModuleName(node);
11053-
let baseName = expr.kind === SyntaxKind.StringLiteral ?
11054-
escapeIdentifier(makeIdentifierFromModuleName((<LiteralExpression>expr).text)) : "module";
11055-
assignGeneratedName(node, makeUniqueName(baseName));
11056-
}
11057-
11058-
function generateNameForImportDeclaration(node: ImportDeclaration) {
11059-
if (node.importClause && node.importClause.namedBindings && node.importClause.namedBindings.kind === SyntaxKind.NamedImports) {
11060-
generateNameForImportOrExportDeclaration(node);
11061-
}
11062-
}
11063-
11064-
function generateNameForExportDeclaration(node: ExportDeclaration) {
11065-
if (node.moduleSpecifier) {
11066-
generateNameForImportOrExportDeclaration(node);
11067-
}
11068-
}
11069-
11070-
function generateNameForExportAssignment(node: ExportAssignment) {
11071-
if (node.expression && node.expression.kind !== SyntaxKind.Identifier) {
11072-
assignGeneratedName(node, makeUniqueName("default"));
11073-
}
11074-
}
11075-
}
11076-
11077-
function getGeneratedNameForNode(node: Node) {
11078-
let links = getNodeLinks(node);
11079-
if (!links.generatedName) {
11080-
getGeneratedNamesForSourceFile(getSourceFile(node));
11081-
}
11082-
return links.generatedName;
11083-
}
11084-
11085-
function getLocalNameOfContainer(container: ModuleDeclaration | EnumDeclaration): string {
11086-
return getGeneratedNameForNode(container);
11087-
}
11088-
11089-
function getLocalNameForImportDeclaration(node: ImportDeclaration): string {
11090-
return getGeneratedNameForNode(node);
11091-
}
11092-
11093-
function getAliasNameSubstitution(symbol: Symbol): string {
10972+
function getAliasNameSubstitution(symbol: Symbol, getGeneratedNameForNode: (Node: Node) => string): string {
1109410973
let declaration = getDeclarationOfAliasSymbol(symbol);
1109510974
if (declaration && declaration.kind === SyntaxKind.ImportSpecifier) {
1109610975
let moduleName = getGeneratedNameForNode(<ImportDeclaration>declaration.parent.parent.parent);
@@ -11099,7 +10978,7 @@ module ts {
1109910978
}
1110010979
}
1110110980

11102-
function getExportNameSubstitution(symbol: Symbol, location: Node): string {
10981+
function getExportNameSubstitution(symbol: Symbol, location: Node, getGeneratedNameForNode: (Node: Node) => string): string {
1110310982
if (isExternalModuleSymbol(symbol.parent)) {
1110410983
var symbolName = unescapeIdentifier(symbol.name);
1110510984
// If this is es6 or higher, just use the name of the export
@@ -11121,24 +11000,24 @@ module ts {
1112111000
}
1112211001
}
1112311002

11124-
function getExpressionNameSubstitution(node: Identifier): string {
11003+
function getExpressionNameSubstitution(node: Identifier, getGeneratedNameForNode: (Node: Node) => string): string {
1112511004
let symbol = getNodeLinks(node).resolvedSymbol;
1112611005
if (symbol) {
1112711006
// Whan an identifier resolves to a parented symbol, it references an exported entity from
1112811007
// another declaration of the same internal module.
1112911008
if (symbol.parent) {
11130-
return getExportNameSubstitution(symbol, node.parent);
11009+
return getExportNameSubstitution(symbol, node.parent, getGeneratedNameForNode);
1113111010
}
1113211011
// If we reference an exported entity within the same module declaration, then whether
1113311012
// we prefix depends on the kind of entity. SymbolFlags.ExportHasLocal encompasses all the
1113411013
// kinds that we do NOT prefix.
1113511014
let exportSymbol = getExportSymbolOfValueSymbolIfExported(symbol);
1113611015
if (symbol !== exportSymbol && !(exportSymbol.flags & SymbolFlags.ExportHasLocal)) {
11137-
return getExportNameSubstitution(exportSymbol, node.parent);
11016+
return getExportNameSubstitution(exportSymbol, node.parent, getGeneratedNameForNode);
1113811017
}
1113911018
// Named imports from ES6 import declarations are rewritten
1114011019
if (symbol.flags & SymbolFlags.Alias && languageVersion < ScriptTarget.ES6) {
11141-
return getAliasNameSubstitution(symbol);
11020+
return getAliasNameSubstitution(symbol, getGeneratedNameForNode);
1114211021
}
1114311022
}
1114411023
}
@@ -11241,10 +11120,13 @@ module ts {
1124111120
getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
1124211121
}
1124311122

11244-
function isUnknownIdentifier(location: Node, name: string): boolean {
11245-
Debug.assert(!nodeIsSynthesized(location), "isUnknownIdentifier called with a synthesized location");
11246-
return !resolveName(location, name, SymbolFlags.Value, /*nodeNotFoundMessage*/ undefined, /*nameArg*/ undefined) &&
11247-
!hasProperty(getGeneratedNamesForSourceFile(getSourceFile(location)), name);
11123+
function hasGlobalName(name: string): boolean {
11124+
return hasProperty(globals, name);
11125+
}
11126+
11127+
function resolvesToSomeValue(location: Node, name: string): boolean {
11128+
Debug.assert(!nodeIsSynthesized(location), "resolvesToSomeValue called with a synthesized location");
11129+
return !!resolveName(location, name, SymbolFlags.Value, /*nodeNotFoundMessage*/ undefined, /*nameArg*/ undefined);
1124811130
}
1124911131

1125011132
function getBlockScopedVariableId(n: Identifier): number {
@@ -11274,8 +11156,8 @@ module ts {
1127411156

1127511157
function createResolver(): EmitResolver {
1127611158
return {
11277-
getGeneratedNameForNode,
1127811159
getExpressionNameSubstitution,
11160+
hasGlobalName,
1127911161
hasExportDefaultValue,
1128011162
isReferencedAliasDeclaration,
1128111163
getNodeCheckFlags,
@@ -11288,7 +11170,7 @@ module ts {
1128811170
isSymbolAccessible,
1128911171
isEntityNameVisible,
1129011172
getConstantValue,
11291-
isUnknownIdentifier,
11173+
resolvesToSomeValue,
1129211174
collectLinkedAliases,
1129311175
getBlockScopedVariableId,
1129411176
};

0 commit comments

Comments
 (0)