babel-parser: Add new typescript plugin option dts: boolean (#13113)

This commit is contained in:
Sosuke Suzuki 2021-04-29 01:24:18 +09:00 committed by GitHub
parent be03be1bc3
commit 7f5b212322
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 219 additions and 11 deletions

View File

@ -1689,7 +1689,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
kind = "let"; kind = "let";
} }
return this.tsInDeclareContext(() => { return this.tsInAmbientContext(() => {
switch (starttype) { switch (starttype) {
case tt._function: case tt._function:
nany.declare = true; nany.declare = true;
@ -1979,7 +1979,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
this.finishNode(node, bodilessType); this.finishNode(node, bodilessType);
return; return;
} }
if (bodilessType === "TSDeclareFunction" && this.state.isDeclareContext) { if (bodilessType === "TSDeclareFunction" && this.state.isAmbientContext) {
this.raise(node.start, TSErrors.DeclareFunctionHasImplementation); this.raise(node.start, TSErrors.DeclareFunctionHasImplementation);
if ( if (
// $FlowIgnore // $FlowIgnore
@ -2342,7 +2342,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
); );
}; };
if (member.declare) { if (member.declare) {
this.tsInDeclareContext(callParseClassMember); this.tsInAmbientContext(callParseClassMember);
} else { } else {
callParseClassMember(); callParseClassMember();
} }
@ -2569,7 +2569,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
parseClassProperty(node: N.ClassProperty): N.ClassProperty { parseClassProperty(node: N.ClassProperty): N.ClassProperty {
this.parseClassPropertyAnnotation(node); this.parseClassPropertyAnnotation(node);
if (this.state.isDeclareContext && this.match(tt.eq)) { if (this.state.isAmbientContext && this.match(tt.eq)) {
this.raise(this.state.start, TSErrors.DeclareClassFieldHasInitializer); this.raise(this.state.start, TSErrors.DeclareClassFieldHasInitializer);
} }
@ -2824,7 +2824,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
if (this.eat(tt.question)) { if (this.eat(tt.question)) {
if ( if (
param.type !== "Identifier" && param.type !== "Identifier" &&
!this.state.isDeclareContext && !this.state.isAmbientContext &&
!this.state.inType !this.state.inType
) { ) {
this.raise(param.start, TSErrors.PatternIsOptional); this.raise(param.start, TSErrors.PatternIsOptional);
@ -2935,7 +2935,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
checkCommaAfterRest(close) { checkCommaAfterRest(close) {
if ( if (
this.state.isDeclareContext && this.state.isAmbientContext &&
this.match(tt.comma) && this.match(tt.comma) &&
this.lookaheadCharCode() === close this.lookaheadCharCode() === close
) { ) {
@ -3081,13 +3081,13 @@ export default (superClass: Class<Parser>): Class<Parser> =>
return param; return param;
} }
tsInDeclareContext<T>(cb: () => T): T { tsInAmbientContext<T>(cb: () => T): T {
const oldIsDeclareContext = this.state.isDeclareContext; const oldIsAmbientContext = this.state.isAmbientContext;
this.state.isDeclareContext = true; this.state.isAmbientContext = true;
try { try {
return cb(); return cb();
} finally { } finally {
this.state.isDeclareContext = oldIsDeclareContext; this.state.isAmbientContext = oldIsAmbientContext;
} }
} }
@ -3152,4 +3152,22 @@ export default (superClass: Class<Parser>): Class<Parser> =>
} }
return method; return method;
} }
shouldParseAsAmbientContext(): boolean {
return !!this.getPluginOption("typescript", "dts");
}
parse() {
if (this.shouldParseAsAmbientContext()) {
this.state.isAmbientContext = true;
}
return super.parse();
}
getExpression() {
if (this.shouldParseAsAmbientContext()) {
this.state.isAmbientContext = true;
}
return super.getExpression();
}
}; };

View File

@ -65,7 +65,7 @@ export default class State {
inPropertyName: boolean = false; inPropertyName: boolean = false;
hasFlowComment: boolean = false; hasFlowComment: boolean = false;
isIterator: boolean = false; isIterator: boolean = false;
isDeclareContext: boolean = false; isAmbientContext: boolean = false;
inAbstractClass: boolean = false; inAbstractClass: boolean = false;
// For the smartPipelines plugin: // For the smartPipelines plugin:

View File

@ -0,0 +1 @@
function foo(): any {}

View File

@ -0,0 +1,42 @@
{
"type": "File",
"start":0,"end":22,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":22}},
"errors": [
"SyntaxError: An implementation cannot be declared in ambient contexts. (1:0)"
],
"program": {
"type": "Program",
"start":0,"end":22,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":22}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "FunctionDeclaration",
"start":0,"end":22,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":22}},
"id": {
"type": "Identifier",
"start":9,"end":12,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":12},"identifierName":"foo"},
"name": "foo"
},
"generator": false,
"async": false,
"params": [],
"returnType": {
"type": "TSTypeAnnotation",
"start":14,"end":19,"loc":{"start":{"line":1,"column":14},"end":{"line":1,"column":19}},
"typeAnnotation": {
"type": "TSAnyKeyword",
"start":16,"end":19,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":19}}
}
},
"body": {
"type": "BlockStatement",
"start":20,"end":22,"loc":{"start":{"line":1,"column":20},"end":{"line":1,"column":22}},
"body": [],
"directives": []
}
}
],
"directives": []
}
}

View File

@ -0,0 +1,3 @@
class Foo {
foo = 3;
}

View File

@ -0,0 +1,52 @@
{
"type": "File",
"start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [
"SyntaxError: Initializers are not allowed in ambient contexts. (2:6)"
],
"program": {
"type": "Program",
"start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "ClassDeclaration",
"start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"id": {
"type": "Identifier",
"start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"},
"name": "Foo"
},
"superClass": null,
"body": {
"type": "ClassBody",
"start":10,"end":24,"loc":{"start":{"line":1,"column":10},"end":{"line":3,"column":1}},
"body": [
{
"type": "ClassProperty",
"start":14,"end":22,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":10}},
"static": false,
"key": {
"type": "Identifier",
"start":14,"end":17,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":5},"identifierName":"foo"},
"name": "foo"
},
"computed": false,
"value": {
"type": "NumericLiteral",
"start":20,"end":21,"loc":{"start":{"line":2,"column":8},"end":{"line":2,"column":9}},
"extra": {
"rawValue": 3,
"raw": "3"
},
"value": 3
}
}
]
}
}
],
"directives": []
}
}

View File

@ -0,0 +1,3 @@
{
"plugins": [["typescript", { "dts": true }], "classProperties"]
}

View File

@ -0,0 +1 @@
function f([]?): any;

View File

@ -0,0 +1,40 @@
{
"type": "File",
"start":0,"end":21,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":21}},
"program": {
"type": "Program",
"start":0,"end":21,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":21}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "TSDeclareFunction",
"start":0,"end":21,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":21}},
"id": {
"type": "Identifier",
"start":9,"end":10,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":10},"identifierName":"f"},
"name": "f"
},
"generator": false,
"async": false,
"params": [
{
"type": "ArrayPattern",
"start":11,"end":14,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":14}},
"elements": [],
"optional": true
}
],
"returnType": {
"type": "TSTypeAnnotation",
"start":15,"end":20,"loc":{"start":{"line":1,"column":15},"end":{"line":1,"column":20}},
"typeAnnotation": {
"type": "TSAnyKeyword",
"start":17,"end":20,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":20}}
}
}
}
],
"directives": []
}
}

View File

@ -0,0 +1 @@
function foo(...args: any[], );

View File

@ -0,0 +1,47 @@
{
"type": "File",
"start":0,"end":31,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":31}},
"program": {
"type": "Program",
"start":0,"end":31,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":31}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "TSDeclareFunction",
"start":0,"end":31,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":31}},
"id": {
"type": "Identifier",
"start":9,"end":12,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":12},"identifierName":"foo"},
"name": "foo"
},
"generator": false,
"async": false,
"params": [
{
"type": "RestElement",
"start":13,"end":27,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":27}},
"argument": {
"type": "Identifier",
"start":16,"end":20,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":20},"identifierName":"args"},
"name": "args"
},
"typeAnnotation": {
"type": "TSTypeAnnotation",
"start":20,"end":27,"loc":{"start":{"line":1,"column":20},"end":{"line":1,"column":27}},
"typeAnnotation": {
"type": "TSArrayType",
"start":22,"end":27,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":27}},
"elementType": {
"type": "TSAnyKeyword",
"start":22,"end":25,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":25}}
}
}
}
}
]
}
],
"directives": []
}
}