Skip to content

Allow parsing a qualified type name containing a reserved word #18888

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
1 commit merged into from
Oct 3, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/compiler/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1217,8 +1217,8 @@ namespace ts {
return createIdentifier(isIdentifier(), diagnosticMessage);
}

function parseIdentifierName(): Identifier {
return createIdentifier(tokenIsIdentifierOrKeyword(token()));
function parseIdentifierName(diagnosticMessage?: DiagnosticMessage): Identifier {
return createIdentifier(tokenIsIdentifierOrKeyword(token()), diagnosticMessage);
}

function isLiteralPropertyName(): boolean {
Expand Down Expand Up @@ -1956,7 +1956,7 @@ namespace ts {
}

function parseEntityName(allowReservedWords: boolean, diagnosticMessage?: DiagnosticMessage): EntityName {
let entity: EntityName = allowReservedWords ? parseIdentifierName() : parseIdentifier(diagnosticMessage);
let entity: EntityName = allowReservedWords ? parseIdentifierName(diagnosticMessage) : parseIdentifier(diagnosticMessage);
let dotPos = scanner.getStartPos();
while (parseOptional(SyntaxKind.DotToken)) {
if (token() === SyntaxKind.LessThanToken) {
Expand Down Expand Up @@ -2096,7 +2096,7 @@ namespace ts {

function parseTypeReference(): TypeReferenceNode {
const node = <TypeReferenceNode>createNode(SyntaxKind.TypeReference);
node.typeName = parseEntityName(/*allowReservedWords*/ !!(contextFlags & NodeFlags.JSDoc), Diagnostics.Type_expected);
node.typeName = parseEntityName(/*allowReservedWords*/ true, Diagnostics.Type_expected);
if (!scanner.hasPrecedingLineBreak() && token() === SyntaxKind.LessThanToken) {
node.typeArguments = parseBracketedList(ParsingContext.TypeArguments, parseType, SyntaxKind.LessThanToken, SyntaxKind.GreaterThanToken);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(8,8): error TS1110: Type expected.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(8,8): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(8,8): error TS2304: Cannot find name 'super'.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(8,13): error TS1005: '=' expected.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(8,14): error TS1109: Expression expected.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(10,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(13,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(17,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(20,15): error TS1110: Type expected.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(20,15): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(20,15): error TS2304: Cannot find name 'super'.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(20,20): error TS1005: '=' expected.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(20,21): error TS1109: Expression expected.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(22,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(25,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(29,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.


==== tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts (10 errors) ====
==== tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts (12 errors) ====
// error to use super calls outside a constructor

class Base {
Expand All @@ -20,9 +22,11 @@ tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassS
class Derived extends Base {
a: super();
~~~~~
!!! error TS1110: Type expected.
~~~~~
!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
!!! error TS2304: Cannot find name 'super'.
~
!!! error TS1005: '=' expected.
~
!!! error TS1109: Expression expected.
b() {
super();
~~~~~
Expand All @@ -42,9 +46,11 @@ tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassS

static a: super();
~~~~~
!!! error TS1110: Type expected.
~~~~~
!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
!!! error TS2304: Cannot find name 'super'.
~
!!! error TS1005: '=' expected.
~
!!! error TS1109: Expression expected.
static b() {
super();
~~~~~
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ var Derived = /** @class */ (function (_super) {
__extends(Derived, _super);
function Derived() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.a = _this = _super.call(this) || this;
_this.a = ();
return _this;
}
Derived.prototype.b = function () {
Expand Down Expand Up @@ -83,6 +83,6 @@ var Derived = /** @class */ (function (_super) {
enumerable: true,
configurable: true
});
Derived.a = _this = _super.call(this) || this;
Derived.a = ();
return Derived;
}(Base));
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ class Derived extends Base {

a: super();
>a : any
> : No type information available!
>super() : void
>super : any
>super : No type information available!
>() : any
> : any

b() {
>b : () => void
Expand Down Expand Up @@ -46,9 +46,9 @@ class Derived extends Base {

static a: super();
>a : any
> : No type information available!
>super() : void
>super : any
>super : No type information available!
>() : any
> : any

static b() {
>b : () => void
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
tests/cases/compiler/example.js(3,20): error TS1003: Identifier expected.
tests/cases/compiler/example.js(3,20): error TS1110: Type expected.


==== tests/cases/compiler/example.js (1 errors) ====
// @ts-check
/**
* @type {function(@foo)}
~
!!! error TS1003: Identifier expected.
!!! error TS1110: Type expected.
*/
let x;
11 changes: 11 additions & 0 deletions tests/baselines/reference/parseEntityNameWithReservedWord.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
//// [parseEntityNameWithReservedWord.ts]
enum Bool { false }
const x: Bool.false = Bool.false;


//// [parseEntityNameWithReservedWord.js]
var Bool;
(function (Bool) {
Bool[Bool["false"] = 0] = "false";
})(Bool || (Bool = {}));
var x = Bool["false"];
13 changes: 13 additions & 0 deletions tests/baselines/reference/parseEntityNameWithReservedWord.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
=== tests/cases/compiler/parseEntityNameWithReservedWord.ts ===
enum Bool { false }
>Bool : Symbol(Bool, Decl(parseEntityNameWithReservedWord.ts, 0, 0))
>false : Symbol(Bool.false, Decl(parseEntityNameWithReservedWord.ts, 0, 11))

const x: Bool.false = Bool.false;
>x : Symbol(x, Decl(parseEntityNameWithReservedWord.ts, 1, 5))
>Bool : Symbol(Bool, Decl(parseEntityNameWithReservedWord.ts, 0, 0))
>false : Symbol(Bool.false, Decl(parseEntityNameWithReservedWord.ts, 0, 11))
>Bool.false : Symbol(Bool.false, Decl(parseEntityNameWithReservedWord.ts, 0, 11))
>Bool : Symbol(Bool, Decl(parseEntityNameWithReservedWord.ts, 0, 0))
>false : Symbol(Bool.false, Decl(parseEntityNameWithReservedWord.ts, 0, 11))

13 changes: 13 additions & 0 deletions tests/baselines/reference/parseEntityNameWithReservedWord.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
=== tests/cases/compiler/parseEntityNameWithReservedWord.ts ===
enum Bool { false }
>Bool : Bool
>false : Bool

const x: Bool.false = Bool.false;
>x : Bool
>Bool : any
>false : Bool
>Bool.false : Bool
>Bool : typeof Bool
>false : Bool

Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ParameterLists/parserErrorRecovery_ParameterList6.ts(2,23): error TS1110: Type expected.
tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ParameterLists/parserErrorRecovery_ParameterList6.ts(2,28): error TS1003: Identifier expected.
tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ParameterLists/parserErrorRecovery_ParameterList6.ts(3,1): error TS1128: Declaration or statement expected.
tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ParameterLists/parserErrorRecovery_ParameterList6.ts(2,23): error TS2304: Cannot find name 'break'.


==== tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ParameterLists/parserErrorRecovery_ParameterList6.ts (3 errors) ====
==== tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ParameterLists/parserErrorRecovery_ParameterList6.ts (1 errors) ====
class Foo {
public banana (x: break) { }
~~~~~
!!! error TS1110: Type expected.
~
!!! error TS1003: Identifier expected.
}
~
!!! error TS1128: Declaration or statement expected.
!!! error TS2304: Cannot find name 'break'.
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ class Foo {
var Foo = /** @class */ (function () {
function Foo() {
}
Foo.prototype.banana = function (x) { };
return Foo;
}());
break ;
{ }
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ class Foo {
>Foo : Foo

public banana (x: break) { }
>banana : (x: any) => any
>banana : (x: any) => void
>x : any
> : No type information available!
> : any
>break : No type information available!
}
10 changes: 2 additions & 8 deletions tests/baselines/reference/parservoidInQualifiedName2.errors.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
tests/cases/conformance/parser/ecmascript5/parservoidInQualifiedName2.ts(1,9): error TS2503: Cannot find namespace 'x'.
tests/cases/conformance/parser/ecmascript5/parservoidInQualifiedName2.ts(1,11): error TS1003: Identifier expected.
tests/cases/conformance/parser/ecmascript5/parservoidInQualifiedName2.ts(1,15): error TS1109: Expression expected.


==== tests/cases/conformance/parser/ecmascript5/parservoidInQualifiedName2.ts (3 errors) ====
==== tests/cases/conformance/parser/ecmascript5/parservoidInQualifiedName2.ts (1 errors) ====
var v : x.void;
~
!!! error TS2503: Cannot find namespace 'x'.
~~~~
!!! error TS1003: Identifier expected.
~
!!! error TS1109: Expression expected.
!!! error TS2503: Cannot find namespace 'x'.
2 changes: 1 addition & 1 deletion tests/baselines/reference/parservoidInQualifiedName2.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
var v : x.void;

//// [parservoidInQualifiedName2.js]
var v = void ;
var v;
4 changes: 1 addition & 3 deletions tests/baselines/reference/parservoidInQualifiedName2.types
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,5 @@
var v : x.void;
>v : any
>x : any
> : No type information available!
>void : undefined
> : any
>void : No type information available!

2 changes: 2 additions & 0 deletions tests/cases/compiler/parseEntityNameWithReservedWord.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
enum Bool { false }
const x: Bool.false = Bool.false;