Skip to content

Commit

Permalink
babel-parser: Add new typescript plugin option dts: boolean (#13113)
Browse files Browse the repository at this point in the history
  • Loading branch information
sosukesuzuki committed Apr 28, 2021
1 parent be03be1 commit 7f5b212
Show file tree
Hide file tree
Showing 11 changed files with 219 additions and 11 deletions.
38 changes: 28 additions & 10 deletions packages/babel-parser/src/plugins/typescript/index.js
Expand Up @@ -1689,7 +1689,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
kind = "let";
}

return this.tsInDeclareContext(() => {
return this.tsInAmbientContext(() => {
switch (starttype) {
case tt._function:
nany.declare = true;
Expand Down Expand Up @@ -1979,7 +1979,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
this.finishNode(node, bodilessType);
return;
}
if (bodilessType === "TSDeclareFunction" && this.state.isDeclareContext) {
if (bodilessType === "TSDeclareFunction" && this.state.isAmbientContext) {
this.raise(node.start, TSErrors.DeclareFunctionHasImplementation);
if (
// $FlowIgnore
Expand Down Expand Up @@ -2342,7 +2342,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
);
};
if (member.declare) {
this.tsInDeclareContext(callParseClassMember);
this.tsInAmbientContext(callParseClassMember);
} else {
callParseClassMember();
}
Expand Down Expand Up @@ -2569,7 +2569,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
parseClassProperty(node: N.ClassProperty): N.ClassProperty {
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);
}

Expand Down Expand Up @@ -2824,7 +2824,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
if (this.eat(tt.question)) {
if (
param.type !== "Identifier" &&
!this.state.isDeclareContext &&
!this.state.isAmbientContext &&
!this.state.inType
) {
this.raise(param.start, TSErrors.PatternIsOptional);
Expand Down Expand Up @@ -2935,7 +2935,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>

checkCommaAfterRest(close) {
if (
this.state.isDeclareContext &&
this.state.isAmbientContext &&
this.match(tt.comma) &&
this.lookaheadCharCode() === close
) {
Expand Down Expand Up @@ -3081,13 +3081,13 @@ export default (superClass: Class<Parser>): Class<Parser> =>
return param;
}

tsInDeclareContext<T>(cb: () => T): T {
const oldIsDeclareContext = this.state.isDeclareContext;
this.state.isDeclareContext = true;
tsInAmbientContext<T>(cb: () => T): T {
const oldIsAmbientContext = this.state.isAmbientContext;
this.state.isAmbientContext = true;
try {
return cb();
} finally {
this.state.isDeclareContext = oldIsDeclareContext;
this.state.isAmbientContext = oldIsAmbientContext;
}
}

Expand Down Expand Up @@ -3152,4 +3152,22 @@ export default (superClass: Class<Parser>): Class<Parser> =>
}
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();
}
};
2 changes: 1 addition & 1 deletion packages/babel-parser/src/tokenizer/state.js
Expand Up @@ -65,7 +65,7 @@ export default class State {
inPropertyName: boolean = false;
hasFlowComment: boolean = false;
isIterator: boolean = false;
isDeclareContext: boolean = false;
isAmbientContext: boolean = false;
inAbstractClass: boolean = false;

// For the smartPipelines plugin:
Expand Down
@@ -0,0 +1 @@
function foo(): any {}
@@ -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": []
}
}
@@ -0,0 +1,3 @@
class Foo {
foo = 3;
}
@@ -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": []
}
}
@@ -0,0 +1,3 @@
{
"plugins": [["typescript", { "dts": true }], "classProperties"]
}
@@ -0,0 +1 @@
function f([]?): any;
@@ -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": []
}
}
@@ -0,0 +1 @@
function foo(...args: any[], );
@@ -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": []
}
}

0 comments on commit 7f5b212

Please sign in to comment.