From f9356b960fb5a224e84b0edf7a5d0cef5766e6b0 Mon Sep 17 00:00:00 2001 From: Erik McClenney Date: Tue, 14 Mar 2017 12:09:01 -0700 Subject: [PATCH] Allow export default abstract class. Related to issue 3792. --- src/compiler/parser.ts | 6 ++++++ .../classAbstractManyKeywords.errors.txt | 5 +---- .../reference/classAbstractManyKeywords.js | 3 +-- .../reference/exportDefaultAbstractClass.js | 21 +++++++++++++++++++ .../exportDefaultAbstractClass.symbols | 8 +++++++ .../exportDefaultAbstractClass.types | 8 +++++++ .../compiler/exportDefaultAbstractClass.ts | 5 +++++ 7 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 tests/baselines/reference/exportDefaultAbstractClass.js create mode 100644 tests/baselines/reference/exportDefaultAbstractClass.symbols create mode 100644 tests/baselines/reference/exportDefaultAbstractClass.types create mode 100644 tests/cases/compiler/exportDefaultAbstractClass.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 308d3a317f94e..b2d2a78454113 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1267,6 +1267,7 @@ namespace ts { function nextTokenIsClassOrFunctionOrAsync(): boolean { nextToken(); return token() === SyntaxKind.ClassKeyword || token() === SyntaxKind.FunctionKeyword || + (token() === SyntaxKind.AbstractKeyword && lookAhead(nextTokenIsClassKeywordOnSameLine)) || (token() === SyntaxKind.AsyncKeyword && lookAhead(nextTokenIsFunctionKeywordOnSameLine)); } @@ -4658,6 +4659,11 @@ namespace ts { return tokenIsIdentifierOrKeyword(token()) && !scanner.hasPrecedingLineBreak(); } + function nextTokenIsClassKeywordOnSameLine() { + nextToken(); + return token() === SyntaxKind.ClassKeyword && !scanner.hasPrecedingLineBreak(); + } + function nextTokenIsFunctionKeywordOnSameLine() { nextToken(); return token() === SyntaxKind.FunctionKeyword && !scanner.hasPrecedingLineBreak(); diff --git a/tests/baselines/reference/classAbstractManyKeywords.errors.txt b/tests/baselines/reference/classAbstractManyKeywords.errors.txt index 8f9e3fed18eb0..1b23bfac98298 100644 --- a/tests/baselines/reference/classAbstractManyKeywords.errors.txt +++ b/tests/baselines/reference/classAbstractManyKeywords.errors.txt @@ -1,12 +1,9 @@ -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractManyKeywords.ts(1,25): error TS1005: ';' expected. tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractManyKeywords.ts(3,1): error TS1128: Declaration or statement expected. tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractManyKeywords.ts(4,17): error TS1005: '=' expected. -==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractManyKeywords.ts (3 errors) ==== +==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractManyKeywords.ts (2 errors) ==== export default abstract class A {} - ~~~~~ -!!! error TS1005: ';' expected. export abstract class B {} default abstract class C {} ~~~~~~~ diff --git a/tests/baselines/reference/classAbstractManyKeywords.js b/tests/baselines/reference/classAbstractManyKeywords.js index 8ba50dcee1c62..c2af09eb4d8f8 100644 --- a/tests/baselines/reference/classAbstractManyKeywords.js +++ b/tests/baselines/reference/classAbstractManyKeywords.js @@ -7,12 +7,12 @@ import abstract class D {} //// [classAbstractManyKeywords.js] "use strict"; exports.__esModule = true; -exports["default"] = abstract; var A = (function () { function A() { } return A; }()); +exports["default"] = A; var B = (function () { function B() { } @@ -24,7 +24,6 @@ var C = (function () { } return C; }()); -var abstract = ; var D = (function () { function D() { } diff --git a/tests/baselines/reference/exportDefaultAbstractClass.js b/tests/baselines/reference/exportDefaultAbstractClass.js new file mode 100644 index 0000000000000..c8dba03543dc1 --- /dev/null +++ b/tests/baselines/reference/exportDefaultAbstractClass.js @@ -0,0 +1,21 @@ +//// [tests/cases/compiler/exportDefaultAbstractClass.ts] //// + +//// [a.ts] +export default abstract class A {} + +//// [b.ts] +import A from './a' + + +//// [a.js] +"use strict"; +exports.__esModule = true; +var A = (function () { + function A() { + } + return A; +}()); +exports["default"] = A; +//// [b.js] +"use strict"; +exports.__esModule = true; diff --git a/tests/baselines/reference/exportDefaultAbstractClass.symbols b/tests/baselines/reference/exportDefaultAbstractClass.symbols new file mode 100644 index 0000000000000..75c6c068f08e1 --- /dev/null +++ b/tests/baselines/reference/exportDefaultAbstractClass.symbols @@ -0,0 +1,8 @@ +=== tests/cases/compiler/a.ts === +export default abstract class A {} +>A : Symbol(A, Decl(a.ts, 0, 0)) + +=== tests/cases/compiler/b.ts === +import A from './a' +>A : Symbol(A, Decl(b.ts, 0, 6)) + diff --git a/tests/baselines/reference/exportDefaultAbstractClass.types b/tests/baselines/reference/exportDefaultAbstractClass.types new file mode 100644 index 0000000000000..d400be1af43f3 --- /dev/null +++ b/tests/baselines/reference/exportDefaultAbstractClass.types @@ -0,0 +1,8 @@ +=== tests/cases/compiler/a.ts === +export default abstract class A {} +>A : A + +=== tests/cases/compiler/b.ts === +import A from './a' +>A : typeof A + diff --git a/tests/cases/compiler/exportDefaultAbstractClass.ts b/tests/cases/compiler/exportDefaultAbstractClass.ts new file mode 100644 index 0000000000000..584e95b6b03b8 --- /dev/null +++ b/tests/cases/compiler/exportDefaultAbstractClass.ts @@ -0,0 +1,5 @@ +// @filename: a.ts +export default abstract class A {} + +// @filename: b.ts +import A from './a'