Skip to content

Commit 97460f5

Browse files
committed
handle non-qualified names, add 'propagateEnumConstants' command line option
1 parent 0d171ca commit 97460f5

File tree

5 files changed

+25
-4
lines changed

5 files changed

+25
-4
lines changed

src/compiler/checker.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7452,6 +7452,8 @@ module ts {
74527452
}
74537453
return undefined;
74547454
case SyntaxKind.BinaryExpression:
7455+
if (!program.getCompilerOptions().propagateEnumConstants) return undefined;
7456+
74557457
var left = evalConstant((<BinaryExpression>e).left);
74567458
if (left === undefined) return undefined;
74577459
var right = evalConstant((<BinaryExpression>e).right);
@@ -7467,12 +7469,20 @@ module ts {
74677469
return undefined;
74687470
case SyntaxKind.NumericLiteral:
74697471
return +(<LiteralExpression>e).text;
7472+
case SyntaxKind.Identifier:
74707473
case SyntaxKind.PropertyAccess:
7471-
var refSymbol = resolveEntityName(member, e, SymbolFlags.EnumMember, /*suppressErrors*/ true);
7474+
if (!program.getCompilerOptions().propagateEnumConstants) return undefined;
7475+
7476+
var refSymbol =
7477+
e.kind === SyntaxKind.Identifier
7478+
? resolveName(member, (<Identifier>e).text, SymbolFlags.EnumMember, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined)
7479+
: resolveEntityName(member, e, SymbolFlags.EnumMember, /*suppressErrors*/ true);
7480+
74727481
if (!refSymbol) return undefined;
74737482
var refDecl = <EnumMember>refSymbol.valueDeclaration;
74747483
// self references are not permitted
7475-
if (member === refDecl) return undefined;
7484+
// non-qualified names are permitted only to members defined in the same enum
7485+
if (member === refDecl || (e.kind === SyntaxKind.Identifier && refDecl.parent !== member.parent)) return undefined;
74767486
// enumMemberValue might be undefined if corresponding enum value was not yet computed and it is ok to return undefined in this case
74777487
return <number>getNodeLinks(refDecl).enumMemberValue;
74787488
}

src/compiler/commandLineParser.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ module ts {
2424
type: "boolean",
2525
},
2626
{
27-
name: "emitBOM",
27+
name: "emitBOM",
2828
type: "boolean"
2929
},
3030
{
@@ -102,7 +102,7 @@ module ts {
102102
{
103103
name: "target",
104104
shortName: "t",
105-
type: { "es3": ScriptTarget.ES3, "es5": ScriptTarget.ES5 , "es6": ScriptTarget.ES6 },
105+
type: { "es3": ScriptTarget.ES3, "es5": ScriptTarget.ES5, "es6": ScriptTarget.ES6 },
106106
description: Diagnostics.Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES6_experimental,
107107
paramType: Diagnostics.VERSION,
108108
error: Diagnostics.Argument_for_target_option_must_be_es3_es5_or_es6
@@ -118,6 +118,11 @@ module ts {
118118
shortName: "w",
119119
type: "boolean",
120120
description: Diagnostics.Watch_input_files,
121+
},
122+
{
123+
name: "propagateEnumConstants",
124+
type: "boolean",
125+
description: Diagnostics.Propagate_constant_values_in_enum_member_initializers
121126
}
122127
];
123128

src/compiler/diagnosticInformationMap.generated.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ module ts {
369369
Specify_module_code_generation_Colon_commonjs_or_amd: { code: 6016, category: DiagnosticCategory.Message, key: "Specify module code generation: 'commonjs' or 'amd'" },
370370
Print_this_message: { code: 6017, category: DiagnosticCategory.Message, key: "Print this message." },
371371
Print_the_compiler_s_version: { code: 6019, category: DiagnosticCategory.Message, key: "Print the compiler's version." },
372+
Propagate_constant_values_in_enum_member_initializers: { code: 6020, category: DiagnosticCategory.Message, key: "Propagate constant values in enum member initializers." },
372373
Syntax_Colon_0: { code: 6023, category: DiagnosticCategory.Message, key: "Syntax: {0}" },
373374
options: { code: 6024, category: DiagnosticCategory.Message, key: "options" },
374375
file: { code: 6025, category: DiagnosticCategory.Message, key: "file" },

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1476,6 +1476,10 @@
14761476
"category": "Message",
14771477
"code": 6019
14781478
},
1479+
"Propagate constant values in enum member initializers.": {
1480+
"category": "Message",
1481+
"code": 6020
1482+
},
14791483
"Syntax: {0}": {
14801484
"category": "Message",
14811485
"code": 6023

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,6 +1093,7 @@ module ts {
10931093
target?: ScriptTarget;
10941094
version?: boolean;
10951095
watch?: boolean;
1096+
propagateEnumConstants?: boolean;
10961097
[option: string]: any;
10971098
}
10981099

0 commit comments

Comments
 (0)