handle non-qualified names, add 'propagateEnumConstants' command line option

This commit is contained in:
Vladimir Matveev
2014-10-25 17:26:24 -07:00
parent 0d171ca9a1
commit 97460f5123
5 changed files with 25 additions and 4 deletions

View File

@@ -7452,6 +7452,8 @@ module ts {
}
return undefined;
case SyntaxKind.BinaryExpression:
if (!program.getCompilerOptions().propagateEnumConstants) return undefined;
var left = evalConstant((<BinaryExpression>e).left);
if (left === undefined) return undefined;
var right = evalConstant((<BinaryExpression>e).right);
@@ -7467,12 +7469,20 @@ module ts {
return undefined;
case SyntaxKind.NumericLiteral:
return +(<LiteralExpression>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, (<Identifier>e).text, SymbolFlags.EnumMember, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined)
: resolveEntityName(member, e, SymbolFlags.EnumMember, /*suppressErrors*/ true);
if (!refSymbol) return undefined;
var refDecl = <EnumMember>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 <number>getNodeLinks(refDecl).enumMemberValue;
}

View File

@@ -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
}
];

View File

@@ -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" },

View File

@@ -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

View File

@@ -1093,6 +1093,7 @@ module ts {
target?: ScriptTarget;
version?: boolean;
watch?: boolean;
propagateEnumConstants?: boolean;
[option: string]: any;
}