diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 0eee4118f3e..a6973bb273b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6161,9 +6161,7 @@ module ts { } else { Debug.assert(memberDecl.kind === SyntaxKind.ShorthandPropertyAssignment); - type = memberDecl.name.kind === SyntaxKind.ComputedPropertyName - ? unknownType - : checkExpression(memberDecl.name, contextualMapper); + type = checkExpression((memberDecl).name, contextualMapper); } typeFlags |= type.flags; let prop = createSymbol(SymbolFlags.Property | SymbolFlags.Transient | member.flags, member.name); @@ -8053,7 +8051,7 @@ module ts { function checkNumericLiteral(node: LiteralExpression): Type { // Grammar checking - checkGrammarNumbericLiteral(node); + checkGrammarNumericLiteral(node); return numberType; } @@ -12017,8 +12015,8 @@ module ts { } // GRAMMAR CHECKING - function isReservedwordInStrictMode(node: Identifier): boolean { - // Check that originalKeywordKind is less than LastFurtureReservedWord to see if an Identifier is a strict-mode reserved word + function isReservedWordInStrictMode(node: Identifier): boolean { + // Check that originalKeywordKind is less than LastFutureReservedWord to see if an Identifier is a strict-mode reserved word return (node.parserContextFlags & ParserContextFlags.StrictMode) && (node.originalKeywordKind >= SyntaxKind.FirstFutureReservedWord && node.originalKeywordKind <= SyntaxKind.LastFutureReservedWord); } @@ -12063,7 +12061,7 @@ module ts { function checkGrammarDeclarationNameInStrictMode(node: Declaration): boolean { let name = node.name; - if (name && name.kind === SyntaxKind.Identifier && isReservedwordInStrictMode(name)) { + if (name && name.kind === SyntaxKind.Identifier && isReservedWordInStrictMode(name)) { let nameText = declarationNameToString(name); switch (node.kind) { case SyntaxKind.Parameter: @@ -12139,7 +12137,7 @@ module ts { // The function takes an identifier itself or an expression which has SyntaxKind.Identifier. function checkGrammarIdentifierInStrictMode(node: Expression | Identifier, nameText?: string): boolean { - if (node && node.kind === SyntaxKind.Identifier && isReservedwordInStrictMode(node)) { + if (node && node.kind === SyntaxKind.Identifier && isReservedWordInStrictMode(node)) { if (!nameText) { nameText = declarationNameToString(node); } @@ -12154,7 +12152,7 @@ module ts { // The function takes an identifier when uses as a typeName in TypeReferenceNode function checkGrammarTypeNameInStrictMode(node: Identifier): boolean { - if (node && node.kind === SyntaxKind.Identifier && isReservedwordInStrictMode(node)) { + if (node && node.kind === SyntaxKind.Identifier && isReservedWordInStrictMode(node)) { let nameText = declarationNameToString(node); // TODO (yuisu): Fix when module is a strict mode @@ -12606,7 +12604,7 @@ module ts { // Grammar checking for computedPropertName and shorthandPropertyAssignment checkGrammarForInvalidQuestionMark(prop,(prop).questionToken, Diagnostics.An_object_member_cannot_be_declared_optional); if (name.kind === SyntaxKind.NumericLiteral) { - checkGrammarNumbericLiteral(name); + checkGrammarNumericLiteral(name); } currentKind = Property; } @@ -13158,7 +13156,7 @@ module ts { } } - function checkGrammarNumbericLiteral(node: Identifier): boolean { + function checkGrammarNumericLiteral(node: Identifier): boolean { // Grammar checking if (node.flags & NodeFlags.OctalLiteral) { if (node.parserContextFlags & ParserContextFlags.StrictMode) { diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 0ca0976128f..6ad38ac73c1 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -3859,13 +3859,14 @@ module ts { function parseObjectBindingElement(): BindingElement { let node = createNode(SyntaxKind.BindingElement); // TODO(andersh): Handle computed properties - let id = parsePropertyName(); - if (id.kind === SyntaxKind.Identifier && token !== SyntaxKind.ColonToken) { - node.name = id; + let tokenIsIdentifier = isIdentifier(); + let propertyName = parsePropertyName(); + if (tokenIsIdentifier && token !== SyntaxKind.ColonToken) { + node.name = propertyName; } else { parseExpected(SyntaxKind.ColonToken); - node.propertyName = id; + node.propertyName = propertyName; node.name = parseIdentifierOrPattern(); } node.initializer = parseInitializer(/*inParameter*/ false); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 9fa4c941a94..078f3d060a6 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -389,7 +389,7 @@ module ts { export interface Identifier extends PrimaryExpression { text: string; // Text of identifier (with escapes converted to characters) - originalKeywordKind?: SyntaxKind; // Original syntaxKind which get set so that we can report an error later + originalKeywordKind?: SyntaxKind; // Original syntaxKind which get set so that we can report an error later } export interface QualifiedName extends Node { diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers01.errors.txt b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers01.errors.txt new file mode 100644 index 00000000000..b5dc0ac3c4b --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers01.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers01.ts(2,13): error TS1005: ':' expected. + + +==== tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers01.ts (1 errors) ==== + + var { while } = { while: 1 } + ~ +!!! error TS1005: ':' expected. \ No newline at end of file diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers01.js b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers01.js new file mode 100644 index 00000000000..cd339bb5907 --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers01.js @@ -0,0 +1,6 @@ +//// [objectBindingPatternKeywordIdentifiers01.ts] + +var { while } = { while: 1 } + +//// [objectBindingPatternKeywordIdentifiers01.js] +var = { while: 1 }.while; diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers02.errors.txt b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers02.errors.txt new file mode 100644 index 00000000000..7ac72469d08 --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers02.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers02.ts(2,14): error TS1003: Identifier expected. +tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers02.ts(2,20): error TS1005: ':' expected. + + +==== tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers02.ts (2 errors) ==== + + var { while: while } = { while: 1 } + ~~~~~ +!!! error TS1003: Identifier expected. + ~ +!!! error TS1005: ':' expected. \ No newline at end of file diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers02.js b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers02.js new file mode 100644 index 00000000000..0286a78ba82 --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers02.js @@ -0,0 +1,6 @@ +//// [objectBindingPatternKeywordIdentifiers02.ts] + +var { while: while } = { while: 1 } + +//// [objectBindingPatternKeywordIdentifiers02.js] +var _a = { while: 1 }, = _a.while, = _a.while; diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers03.errors.txt b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers03.errors.txt new file mode 100644 index 00000000000..6ffad2c0345 --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers03.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers03.ts(2,15): error TS1005: ':' expected. + + +==== tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers03.ts (1 errors) ==== + + var { "while" } = { while: 1 } + ~ +!!! error TS1005: ':' expected. \ No newline at end of file diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers03.js b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers03.js new file mode 100644 index 00000000000..4bbb1afb4cb --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers03.js @@ -0,0 +1,6 @@ +//// [objectBindingPatternKeywordIdentifiers03.ts] + +var { "while" } = { while: 1 } + +//// [objectBindingPatternKeywordIdentifiers03.js] +var = { while: 1 }["while"]; diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers04.errors.txt b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers04.errors.txt new file mode 100644 index 00000000000..69a8b48b2f1 --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers04.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers04.ts(2,16): error TS1003: Identifier expected. +tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers04.ts(2,22): error TS1005: ':' expected. + + +==== tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers04.ts (2 errors) ==== + + var { "while": while } = { while: 1 } + ~~~~~ +!!! error TS1003: Identifier expected. + ~ +!!! error TS1005: ':' expected. \ No newline at end of file diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers04.js b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers04.js new file mode 100644 index 00000000000..4e53b13c0a6 --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers04.js @@ -0,0 +1,6 @@ +//// [objectBindingPatternKeywordIdentifiers04.ts] + +var { "while": while } = { while: 1 } + +//// [objectBindingPatternKeywordIdentifiers04.js] +var _a = { while: 1 }, = _a["while"], = _a.while; diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers05.js b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers05.js new file mode 100644 index 00000000000..41c46c46506 --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers05.js @@ -0,0 +1,6 @@ +//// [objectBindingPatternKeywordIdentifiers05.ts] + +var { as } = { as: 1 } + +//// [objectBindingPatternKeywordIdentifiers05.js] +var as = { as: 1 }.as; diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers05.symbols b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers05.symbols new file mode 100644 index 00000000000..5ac9bb815f8 --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers05.symbols @@ -0,0 +1,6 @@ +=== tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers05.ts === + +var { as } = { as: 1 } +>as : Symbol(as, Decl(objectBindingPatternKeywordIdentifiers05.ts, 1, 5)) +>as : Symbol(as, Decl(objectBindingPatternKeywordIdentifiers05.ts, 1, 14)) + diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers05.types b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers05.types new file mode 100644 index 00000000000..d736121a3b7 --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers05.types @@ -0,0 +1,8 @@ +=== tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers05.ts === + +var { as } = { as: 1 } +>as : number +>{ as: 1 } : { as: number; } +>as : number +>1 : number + diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers06.js b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers06.js new file mode 100644 index 00000000000..d24c468e891 --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers06.js @@ -0,0 +1,6 @@ +//// [objectBindingPatternKeywordIdentifiers06.ts] + +var { as: as } = { as: 1 } + +//// [objectBindingPatternKeywordIdentifiers06.js] +var as = { as: 1 }.as; diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers06.symbols b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers06.symbols new file mode 100644 index 00000000000..7cee5f3009b --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers06.symbols @@ -0,0 +1,6 @@ +=== tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers06.ts === + +var { as: as } = { as: 1 } +>as : Symbol(as, Decl(objectBindingPatternKeywordIdentifiers06.ts, 1, 5)) +>as : Symbol(as, Decl(objectBindingPatternKeywordIdentifiers06.ts, 1, 18)) + diff --git a/tests/baselines/reference/objectBindingPatternKeywordIdentifiers06.types b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers06.types new file mode 100644 index 00000000000..739771385b2 --- /dev/null +++ b/tests/baselines/reference/objectBindingPatternKeywordIdentifiers06.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers06.ts === + +var { as: as } = { as: 1 } +>as : any +>as : number +>{ as: 1 } : { as: number; } +>as : number +>1 : number + diff --git a/tests/baselines/reference/reservedWords2.errors.txt b/tests/baselines/reference/reservedWords2.errors.txt index ec4b7b09887..3b3fe2c502c 100644 --- a/tests/baselines/reference/reservedWords2.errors.txt +++ b/tests/baselines/reference/reservedWords2.errors.txt @@ -15,6 +15,14 @@ tests/cases/compiler/reservedWords2.ts(5,10): error TS1003: Identifier expected. tests/cases/compiler/reservedWords2.ts(5,18): error TS1005: '=>' expected. tests/cases/compiler/reservedWords2.ts(6,7): error TS2300: Duplicate identifier '(Missing)'. tests/cases/compiler/reservedWords2.ts(6,8): error TS1003: Identifier expected. +tests/cases/compiler/reservedWords2.ts(7,11): error TS2300: Duplicate identifier '(Missing)'. +tests/cases/compiler/reservedWords2.ts(7,11): error TS1005: ':' expected. +tests/cases/compiler/reservedWords2.ts(7,19): error TS2300: Duplicate identifier '(Missing)'. +tests/cases/compiler/reservedWords2.ts(7,19): error TS1005: ':' expected. +tests/cases/compiler/reservedWords2.ts(8,10): error TS2300: Duplicate identifier '(Missing)'. +tests/cases/compiler/reservedWords2.ts(8,10): error TS1005: ':' expected. +tests/cases/compiler/reservedWords2.ts(8,30): error TS2300: Duplicate identifier '(Missing)'. +tests/cases/compiler/reservedWords2.ts(8,30): error TS1005: ':' expected. tests/cases/compiler/reservedWords2.ts(9,6): error TS1181: Array element destructuring pattern expected. tests/cases/compiler/reservedWords2.ts(9,14): error TS1005: ';' expected. tests/cases/compiler/reservedWords2.ts(9,18): error TS1005: '(' expected. @@ -23,7 +31,7 @@ tests/cases/compiler/reservedWords2.ts(10,5): error TS2300: Duplicate identifier tests/cases/compiler/reservedWords2.ts(10,6): error TS1003: Identifier expected. -==== tests/cases/compiler/reservedWords2.ts (23 errors) ==== +==== tests/cases/compiler/reservedWords2.ts (31 errors) ==== import while = require("dfdf"); ~~~~~~ !!! error TS1148: Cannot compile external modules unless the '--module' flag is provided. @@ -65,7 +73,23 @@ tests/cases/compiler/reservedWords2.ts(10,6): error TS1003: Identifier expected. ~~~~ !!! error TS1003: Identifier expected. var {while, return} = { while: 1, return: 2 }; + +!!! error TS2300: Duplicate identifier '(Missing)'. + ~ +!!! error TS1005: ':' expected. + +!!! error TS2300: Duplicate identifier '(Missing)'. + ~ +!!! error TS1005: ':' expected. var {this, switch: { continue} } = { this: 1, switch: { continue: 2 }}; + +!!! error TS2300: Duplicate identifier '(Missing)'. + ~ +!!! error TS1005: ':' expected. + +!!! error TS2300: Duplicate identifier '(Missing)'. + ~ +!!! error TS1005: ':' expected. var [debugger, if] = [1, 2]; ~~~~~~~~ !!! error TS1181: Array element destructuring pattern expected. diff --git a/tests/baselines/reference/reservedWords2.js b/tests/baselines/reference/reservedWords2.js index 4bda38842a3..6d5a5f530c5 100644 --- a/tests/baselines/reference/reservedWords2.js +++ b/tests/baselines/reference/reservedWords2.js @@ -24,8 +24,8 @@ typeof ; 10; throw function () { }; void {}; -var _a = { while: 1, return: 2 }, while = _a.while, return = _a.return; -var _b = { this: 1, switch: { continue: 2 } }, this = _b.this, continue = _b.switch.continue; +var _a = { while: 1, return: 2 }, = _a.while, = _a.return; +var _b = { this: 1, switch: { continue: 2 } }, = _b.this, = _b.switch.continue; var _c = void 0; debugger; if () diff --git a/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers01.ts b/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers01.ts new file mode 100644 index 00000000000..2c37f95efa0 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers01.ts @@ -0,0 +1,2 @@ + +var { while } = { while: 1 } \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers02.ts b/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers02.ts new file mode 100644 index 00000000000..dc1469c9b3a --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers02.ts @@ -0,0 +1,2 @@ + +var { while: while } = { while: 1 } \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers03.ts b/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers03.ts new file mode 100644 index 00000000000..64bb2afdffb --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers03.ts @@ -0,0 +1,2 @@ + +var { "while" } = { while: 1 } \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers04.ts b/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers04.ts new file mode 100644 index 00000000000..ab50bf3adde --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers04.ts @@ -0,0 +1,2 @@ + +var { "while": while } = { while: 1 } \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers05.ts b/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers05.ts new file mode 100644 index 00000000000..908eef86c53 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers05.ts @@ -0,0 +1,2 @@ + +var { as } = { as: 1 } \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers06.ts b/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers06.ts new file mode 100644 index 00000000000..82beeebacc3 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/objectBindingPatternKeywordIdentifiers06.ts @@ -0,0 +1,2 @@ + +var { as: as } = { as: 1 } \ No newline at end of file