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
11 changed files with 219 additions and 11 deletions

View File

@@ -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;
@@ -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
@@ -2342,7 +2342,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
);
};
if (member.declare) {
this.tsInDeclareContext(callParseClassMember);
this.tsInAmbientContext(callParseClassMember);
} else {
callParseClassMember();
}
@@ -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);
}
@@ -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);
@@ -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
) {
@@ -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;
}
}
@@ -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();
}
};

View File

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