diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ed34679e794..8d930bbfb72 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5357,6 +5357,14 @@ module ts { var properties: SymbolTable = {}; var contextualType = getContextualType(node); var typeFlags: TypeFlags; + + // Grammar checking for computedPropertyName + forEach(node.properties, property => { + if (property.name && property.name.kind === SyntaxKind.ComputedPropertyName) { + checkGrammarComputedPropertyName(property.name); + } + }); + for (var id in members) { if (hasProperty(members, id)) { var member = members[id]; @@ -5405,6 +5413,7 @@ module ts { properties[member.name] = member; } } + var stringIndexType = getIndexType(IndexKind.String); var numberIndexType = getIndexType(IndexKind.Number); var result = createAnonymousType(node.symbol, properties, emptyArray, emptyArray, stringIndexType, numberIndexType); @@ -9990,6 +9999,15 @@ module ts { } } + function checkGrammarComputedPropertyName(node: ComputedPropertyName): void { + if (compilerOptions.target < ScriptTarget.ES6) { + grammarErrorOnNode(node, Diagnostics.Computed_property_names_are_only_available_when_targeting_ECMAScript_6_and_higher); + } + else if (node.expression.kind === SyntaxKind.BinaryExpression && (node.expression).operator === SyntaxKind.CommaToken) { + grammarErrorOnNode(node.expression, Diagnostics.A_comma_expression_is_not_allowed_in_a_computed_property_name); + } + } + function hasParseDiagnostics(sourceFile: SourceFile): boolean { return sourceFile.parseDiagnostics.length > 0; } diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 14346dc312c..2d0e085f7f1 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4638,7 +4638,7 @@ module ts { //case SyntaxKind.BindingElement: return checkBindingElement(node); //case SyntaxKind.CatchClause: return checkCatchClause(node); //case SyntaxKind.ClassDeclaration: return checkClassDeclaration(node); - case SyntaxKind.ComputedPropertyName: return checkComputedPropertyName(node); + //case SyntaxKind.ComputedPropertyName: return checkComputedPropertyName(node); case SyntaxKind.Constructor: return checkConstructor(node); case SyntaxKind.DeleteExpression: return checkDeleteExpression( node); case SyntaxKind.ElementAccessExpression: return checkElementAccessExpression(node);