From aa29644c2a17a9ea20aca894bf67c44c78f46b2d Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Tue, 8 Sep 2015 22:40:16 -0700 Subject: [PATCH] allow to use keywords as jsx identifiers --- src/compiler/parser.ts | 6 +++++- src/compiler/scanner.ts | 2 +- tests/baselines/reference/keywordInJsxIdentifier.js | 7 +++++++ .../baselines/reference/keywordInJsxIdentifier.symbols | 8 ++++++++ tests/baselines/reference/keywordInJsxIdentifier.types | 10 ++++++++++ tests/cases/compiler/keywordInJsxIdentifier.tsx | 4 ++++ 6 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/keywordInJsxIdentifier.js create mode 100644 tests/baselines/reference/keywordInJsxIdentifier.symbols create mode 100644 tests/baselines/reference/keywordInJsxIdentifier.types create mode 100644 tests/cases/compiler/keywordInJsxIdentifier.tsx diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 350b9d450b..57e1915656 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -12,6 +12,10 @@ namespace ts { export function createNode(kind: SyntaxKind): Node { return new (getNodeConstructor(kind))(); } + + export function tokenIsIdentifierOrKeyword(token: SyntaxKind): boolean { + return token >= SyntaxKind.Identifier; + } function visitNode(cbNode: (node: Node) => T, node: Node): T { if (node) { @@ -4102,7 +4106,7 @@ namespace ts { } function isIdentifierOrKeyword() { - return token >= SyntaxKind.Identifier; + return tokenIsIdentifierOrKeyword(token); } function nextTokenIsIdentifierOrKeywordOnSameLine() { diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 199e7e9b63..2e10a1f1b8 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -1590,7 +1590,7 @@ namespace ts { // Scans a JSX identifier; these differ from normal identifiers in that // they allow dashes function scanJsxIdentifier(): SyntaxKind { - if (token === SyntaxKind.Identifier) { + if (tokenIsIdentifierOrKeyword(token)) { let firstCharPosition = pos; while (pos < end) { let ch = text.charCodeAt(pos); diff --git a/tests/baselines/reference/keywordInJsxIdentifier.js b/tests/baselines/reference/keywordInJsxIdentifier.js new file mode 100644 index 0000000000..8a00a68e33 --- /dev/null +++ b/tests/baselines/reference/keywordInJsxIdentifier.js @@ -0,0 +1,7 @@ +//// [keywordInJsxIdentifier.tsx] + +declare var React: any; + + +//// [keywordInJsxIdentifier.js] +React.createElement("foo", {"class-id": true}); diff --git a/tests/baselines/reference/keywordInJsxIdentifier.symbols b/tests/baselines/reference/keywordInJsxIdentifier.symbols new file mode 100644 index 0000000000..6617a640dc --- /dev/null +++ b/tests/baselines/reference/keywordInJsxIdentifier.symbols @@ -0,0 +1,8 @@ +=== tests/cases/compiler/keywordInJsxIdentifier.tsx === + +declare var React: any; +>React : Symbol(React, Decl(keywordInJsxIdentifier.tsx, 1, 11)) + + +>class-id : Symbol(unknown) + diff --git a/tests/baselines/reference/keywordInJsxIdentifier.types b/tests/baselines/reference/keywordInJsxIdentifier.types new file mode 100644 index 0000000000..888d027fdd --- /dev/null +++ b/tests/baselines/reference/keywordInJsxIdentifier.types @@ -0,0 +1,10 @@ +=== tests/cases/compiler/keywordInJsxIdentifier.tsx === + +declare var React: any; +>React : any + + +> : any +>foo : any +>class-id : any + diff --git a/tests/cases/compiler/keywordInJsxIdentifier.tsx b/tests/cases/compiler/keywordInJsxIdentifier.tsx new file mode 100644 index 0000000000..8c09c90b17 --- /dev/null +++ b/tests/cases/compiler/keywordInJsxIdentifier.tsx @@ -0,0 +1,4 @@ +//@jsx: react + +declare var React: any; + \ No newline at end of file