diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 6ce2ef1461f7a..99e5c40f0545a 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -865,12 +865,13 @@ module ts { return createMissingList(); } - function parseEntityName(): EntityName { + // The allowReservedWords parameter controls whether reserved words are permitted after the first dot + function parseEntityName(allowReservedWords: boolean): EntityName { var entity: EntityName = parseIdentifier(); while (parseOptional(SyntaxKind.DotToken)) { var node = createNode(SyntaxKind.QualifiedName, entity.pos); node.left = entity; - node.right = parseIdentifier(); + node.right = allowReservedWords ? parseIdentifierName() : parseIdentifier(); entity = finishNode(node); } return entity; @@ -899,7 +900,7 @@ module ts { function parseTypeReference(): TypeReferenceNode { var node = createNode(SyntaxKind.TypeReference); - node.typeName = parseEntityName(); + node.typeName = parseEntityName(/*allowReservedWords*/ false); if (!scanner.hasPrecedingLineBreak() && token === SyntaxKind.LessThanToken) { node.typeArguments = parseTypeArguments(); } @@ -909,7 +910,7 @@ module ts { function parseTypeQuery(): TypeQueryNode { var node = createNode(SyntaxKind.TypeQuery); parseExpected(SyntaxKind.TypeOfKeyword); - node.exprName = parseEntityName(); + node.exprName = parseEntityName(/*allowReservedWords*/ true); return finishNode(node); } @@ -2815,7 +2816,7 @@ module ts { parseExpected(SyntaxKind.ImportKeyword); node.name = parseIdentifier(); parseExpected(SyntaxKind.EqualsToken); - var entityName = parseEntityName(); + var entityName = parseEntityName(/*allowReservedWords*/ false); if (entityName.kind === SyntaxKind.Identifier && (entityName).text === "require" && parseOptional(SyntaxKind.OpenParenToken)) { node.externalModuleName = parseStringLiteral(); parseExpected(SyntaxKind.CloseParenToken); diff --git a/tests/baselines/reference/typeQueryWithReservedWords.js b/tests/baselines/reference/typeQueryWithReservedWords.js new file mode 100644 index 0000000000000..e6e7f86541bbe --- /dev/null +++ b/tests/baselines/reference/typeQueryWithReservedWords.js @@ -0,0 +1,29 @@ +//// [typeQueryWithReservedWords.ts] +class Controller { + create() { + } + delete() { + } + var() { + } +} + +interface IScope { + create: typeof Controller.prototype.create; + delete: typeof Controller.prototype.delete; // Should not error + var: typeof Controller.prototype.var; // Should not error +} + + +//// [typeQueryWithReservedWords.js] +var Controller = (function () { + function Controller() { + } + Controller.prototype.create = function () { + }; + Controller.prototype.delete = function () { + }; + Controller.prototype.var = function () { + }; + return Controller; +})(); diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryWithReservedWords.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryWithReservedWords.ts new file mode 100644 index 0000000000000..5fb9d2233f1e5 --- /dev/null +++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryWithReservedWords.ts @@ -0,0 +1,14 @@ +class Controller { + create() { + } + delete() { + } + var() { + } +} + +interface IScope { + create: typeof Controller.prototype.create; + delete: typeof Controller.prototype.delete; // Should not error + var: typeof Controller.prototype.var; // Should not error +}