From 97460f51239e1e05e2dcd9a9d5a9ddbbd1180d25 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Sat, 25 Oct 2014 17:26:24 -0700 Subject: [PATCH] handle non-qualified names, add 'propagateEnumConstants' command line option --- src/compiler/checker.ts | 14 ++++++++++++-- src/compiler/commandLineParser.ts | 9 +++++++-- src/compiler/diagnosticInformationMap.generated.ts | 1 + src/compiler/diagnosticMessages.json | 4 ++++ src/compiler/types.ts | 1 + 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 572e97eac67..435787405a1 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7452,6 +7452,8 @@ module ts { } return undefined; case SyntaxKind.BinaryExpression: + if (!program.getCompilerOptions().propagateEnumConstants) return undefined; + var left = evalConstant((e).left); if (left === undefined) return undefined; var right = evalConstant((e).right); @@ -7467,12 +7469,20 @@ module ts { return undefined; case SyntaxKind.NumericLiteral: return +(e).text; + case SyntaxKind.Identifier: case SyntaxKind.PropertyAccess: - var refSymbol = resolveEntityName(member, e, SymbolFlags.EnumMember, /*suppressErrors*/ true); + if (!program.getCompilerOptions().propagateEnumConstants) return undefined; + + var refSymbol = + e.kind === SyntaxKind.Identifier + ? resolveName(member, (e).text, SymbolFlags.EnumMember, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined) + : resolveEntityName(member, e, SymbolFlags.EnumMember, /*suppressErrors*/ true); + if (!refSymbol) return undefined; var refDecl = refSymbol.valueDeclaration; // self references are not permitted - if (member === refDecl) return undefined; + // non-qualified names are permitted only to members defined in the same enum + if (member === refDecl || (e.kind === SyntaxKind.Identifier && refDecl.parent !== member.parent)) return undefined; // enumMemberValue might be undefined if corresponding enum value was not yet computed and it is ok to return undefined in this case return getNodeLinks(refDecl).enumMemberValue; } diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index a7993484c64..667102ce315 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -24,7 +24,7 @@ module ts { type: "boolean", }, { - name: "emitBOM", + name: "emitBOM", type: "boolean" }, { @@ -102,7 +102,7 @@ module ts { { name: "target", shortName: "t", - type: { "es3": ScriptTarget.ES3, "es5": ScriptTarget.ES5 , "es6": ScriptTarget.ES6 }, + type: { "es3": ScriptTarget.ES3, "es5": ScriptTarget.ES5, "es6": ScriptTarget.ES6 }, description: Diagnostics.Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES6_experimental, paramType: Diagnostics.VERSION, error: Diagnostics.Argument_for_target_option_must_be_es3_es5_or_es6 @@ -118,6 +118,11 @@ module ts { shortName: "w", type: "boolean", description: Diagnostics.Watch_input_files, + }, + { + name: "propagateEnumConstants", + type: "boolean", + description: Diagnostics.Propagate_constant_values_in_enum_member_initializers } ]; diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index a5dda0b1f4b..4b0db71d051 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -369,6 +369,7 @@ module ts { Specify_module_code_generation_Colon_commonjs_or_amd: { code: 6016, category: DiagnosticCategory.Message, key: "Specify module code generation: 'commonjs' or 'amd'" }, Print_this_message: { code: 6017, category: DiagnosticCategory.Message, key: "Print this message." }, Print_the_compiler_s_version: { code: 6019, category: DiagnosticCategory.Message, key: "Print the compiler's version." }, + Propagate_constant_values_in_enum_member_initializers: { code: 6020, category: DiagnosticCategory.Message, key: "Propagate constant values in enum member initializers." }, Syntax_Colon_0: { code: 6023, category: DiagnosticCategory.Message, key: "Syntax: {0}" }, options: { code: 6024, category: DiagnosticCategory.Message, key: "options" }, file: { code: 6025, category: DiagnosticCategory.Message, key: "file" }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 1336af21aaf..7132fc8feef 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1476,6 +1476,10 @@ "category": "Message", "code": 6019 }, + "Propagate constant values in enum member initializers.": { + "category": "Message", + "code": 6020 + }, "Syntax: {0}": { "category": "Message", "code": 6023 diff --git a/src/compiler/types.ts b/src/compiler/types.ts index aa2ca3b4ba8..7396b4a337b 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1093,6 +1093,7 @@ module ts { target?: ScriptTarget; version?: boolean; watch?: boolean; + propagateEnumConstants?: boolean; [option: string]: any; }