Fix parsing typescript function types with destructuring (#9035)
* Fix parsing typescript function types with destructuring * Use integer instead of actual stack
This commit is contained in:
parent
c11cdcb6d8
commit
a2afb974be
@ -314,13 +314,19 @@ export default (superClass: Class<Parser>): Class<Parser> =>
|
|||||||
}
|
}
|
||||||
|
|
||||||
tsParseBindingListForSignature(): $ReadOnlyArray<
|
tsParseBindingListForSignature(): $ReadOnlyArray<
|
||||||
N.Identifier | N.RestElement,
|
N.Identifier | N.RestElement | N.ObjectPattern,
|
||||||
> {
|
> {
|
||||||
return this.parseBindingList(tt.parenR).map(pattern => {
|
return this.parseBindingList(tt.parenR).map(pattern => {
|
||||||
if (pattern.type !== "Identifier" && pattern.type !== "RestElement") {
|
if (
|
||||||
|
pattern.type !== "Identifier" &&
|
||||||
|
pattern.type !== "RestElement" &&
|
||||||
|
pattern.type !== "ObjectPattern"
|
||||||
|
) {
|
||||||
throw this.unexpected(
|
throw this.unexpected(
|
||||||
pattern.start,
|
pattern.start,
|
||||||
"Name in a signature must be an Identifier.",
|
`Name in a signature must be an Identifier or ObjectPattern, instead got ${
|
||||||
|
pattern.type
|
||||||
|
}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return pattern;
|
return pattern;
|
||||||
@ -747,6 +753,22 @@ export default (superClass: Class<Parser>): Class<Parser> =>
|
|||||||
this.next();
|
this.next();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.match(tt.braceL)) {
|
||||||
|
let braceStackCounter = 1;
|
||||||
|
this.next();
|
||||||
|
|
||||||
|
while (braceStackCounter > 0) {
|
||||||
|
if (this.match(tt.braceL)) {
|
||||||
|
++braceStackCounter;
|
||||||
|
} else if (this.match(tt.braceR)) {
|
||||||
|
--braceStackCounter;
|
||||||
|
}
|
||||||
|
this.next();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1037,7 +1037,7 @@ export type TsSignatureDeclaration =
|
|||||||
|
|
||||||
export type TsSignatureDeclarationOrIndexSignatureBase = NodeBase & {
|
export type TsSignatureDeclarationOrIndexSignatureBase = NodeBase & {
|
||||||
// Not using TypeScript's "ParameterDeclaration" here, since it's inconsistent with regular functions.
|
// Not using TypeScript's "ParameterDeclaration" here, since it's inconsistent with regular functions.
|
||||||
parameters: $ReadOnlyArray<Identifier | RestElement>,
|
parameters: $ReadOnlyArray<Identifier | RestElement | ObjectPattern>,
|
||||||
typeAnnotation: ?TsTypeAnnotation,
|
typeAnnotation: ?TsTypeAnnotation,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1 @@
|
|||||||
|
type MyType = ({ theme }: any) => any
|
||||||
216
packages/babel-parser/test/fixtures/typescript/regression/destructuring-in-function-type/output.json
vendored
Normal file
216
packages/babel-parser/test/fixtures/typescript/regression/destructuring-in-function-type/output.json
vendored
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
{
|
||||||
|
"type": "File",
|
||||||
|
"start": 0,
|
||||||
|
"end": 37,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 0
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 37
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"program": {
|
||||||
|
"type": "Program",
|
||||||
|
"start": 0,
|
||||||
|
"end": 37,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 0
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 37
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sourceType": "module",
|
||||||
|
"interpreter": null,
|
||||||
|
"body": [
|
||||||
|
{
|
||||||
|
"type": "TSTypeAliasDeclaration",
|
||||||
|
"start": 0,
|
||||||
|
"end": 37,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 0
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 37
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"id": {
|
||||||
|
"type": "Identifier",
|
||||||
|
"start": 5,
|
||||||
|
"end": 11,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 5
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 11
|
||||||
|
},
|
||||||
|
"identifierName": "MyType"
|
||||||
|
},
|
||||||
|
"name": "MyType"
|
||||||
|
},
|
||||||
|
"typeAnnotation": {
|
||||||
|
"type": "TSFunctionType",
|
||||||
|
"start": 14,
|
||||||
|
"end": 37,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 14
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 37
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "ObjectPattern",
|
||||||
|
"start": 15,
|
||||||
|
"end": 29,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 15
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 29
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"type": "ObjectProperty",
|
||||||
|
"start": 17,
|
||||||
|
"end": 22,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 17
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 22
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"method": false,
|
||||||
|
"key": {
|
||||||
|
"type": "Identifier",
|
||||||
|
"start": 17,
|
||||||
|
"end": 22,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 17
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 22
|
||||||
|
},
|
||||||
|
"identifierName": "theme"
|
||||||
|
},
|
||||||
|
"name": "theme"
|
||||||
|
},
|
||||||
|
"computed": false,
|
||||||
|
"shorthand": true,
|
||||||
|
"value": {
|
||||||
|
"type": "Identifier",
|
||||||
|
"start": 17,
|
||||||
|
"end": 22,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 17
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 22
|
||||||
|
},
|
||||||
|
"identifierName": "theme"
|
||||||
|
},
|
||||||
|
"name": "theme"
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"shorthand": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"typeAnnotation": {
|
||||||
|
"type": "TSTypeAnnotation",
|
||||||
|
"start": 24,
|
||||||
|
"end": 29,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 24
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 29
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"typeAnnotation": {
|
||||||
|
"type": "TSAnyKeyword",
|
||||||
|
"start": 26,
|
||||||
|
"end": 29,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 26
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 29
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"typeAnnotation": {
|
||||||
|
"type": "TSTypeAnnotation",
|
||||||
|
"start": 31,
|
||||||
|
"end": 37,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 31
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 37
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"typeAnnotation": {
|
||||||
|
"type": "TSAnyKeyword",
|
||||||
|
"start": 34,
|
||||||
|
"end": 37,
|
||||||
|
"loc": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 34
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 1,
|
||||||
|
"column": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"directives": []
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user