Allow export default abstract class. Related to issue 3792.

This commit is contained in:
Erik McClenney 2017-03-14 12:09:01 -07:00
parent ea57fbc59f
commit f9356b960f
7 changed files with 50 additions and 6 deletions

View file

@ -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();

View file

@ -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 {}
~~~~~~~

View file

@ -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() {
}

View file

@ -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;

View file

@ -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))

View file

@ -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

View file

@ -0,0 +1,5 @@
// @filename: a.ts
export default abstract class A {}
// @filename: b.ts
import A from './a'