Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow unknown/any in TS catch clause param #11755

Merged
merged 1 commit into from Jun 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
@@ -1,6 +1,6 @@
FLOW_COMMIT = a1f9a4c709dcebb27a5084acf47755fbae699c25
TEST262_COMMIT = 058adfed86b1d4129996faaf50a85ea55379a66a
TYPESCRIPT_COMMIT = 5fc917be2e4dd64c8e9504d36615cd7fbfdd4cd3
TYPESCRIPT_COMMIT = ffa35d3272647fe48ddf173e1f0928f772c18630

FORCE_PUBLISH = "@babel/runtime,@babel/runtime-corejs2,@babel/runtime-corejs3,@babel/standalone"

Expand Down
15 changes: 11 additions & 4 deletions packages/babel-parser/src/parser/statement.js
Expand Up @@ -636,6 +636,16 @@ export default class StatementParser extends ExpressionParser {
return this.finishNode(node, "ThrowStatement");
}

parseCatchClauseParam(): N.Identifier {
const param = this.parseBindingAtom();

const simple = param.type === "Identifier";
this.scope.enter(simple ? SCOPE_SIMPLE_CATCH : 0);
this.checkLVal(param, BIND_LEXICAL, null, "catch clause");

return param;
}

parseTryStatement(node: N.TryStatement): N.TryStatement {
this.next();

Expand All @@ -647,10 +657,7 @@ export default class StatementParser extends ExpressionParser {
this.next();
if (this.match(tt.parenL)) {
this.expect(tt.parenL);
clause.param = this.parseBindingAtom();
const simple = clause.param.type === "Identifier";
this.scope.enter(simple ? SCOPE_SIMPLE_CATCH : 0);
this.checkLVal(clause.param, BIND_LEXICAL, null, "catch clause");
clause.param = this.parseCatchClauseParam();
this.expect(tt.parenR);
} else {
clause.param = null;
Expand Down
11 changes: 11 additions & 0 deletions packages/babel-parser/src/plugins/typescript/index.js
Expand Up @@ -2667,4 +2667,15 @@ export default (superClass: Class<Parser>): Class<Parser> =>

return hasContextParam ? baseCount + 1 : baseCount;
}

parseCatchClauseParam(): N.Identifier {
const param = super.parseCatchClauseParam();
const type = this.tsTryParseTypeAnnotation();

if (type) {
param.type = type;
}

return param;
}
};
@@ -0,0 +1,9 @@
try {} catch (ex) {}
try {} catch (ex: unknown) {}
try {} catch (ex: any) {}

// The following can't be error'd at parse time
try {} catch (ex: A) {}
try {} catch (ex: Error) {}
try {} catch (ex: string) {}
try {} catch (ex: string | number) {}
@@ -0,0 +1,278 @@
{
"type": "File",
"start":0,"end":244,"loc":{"start":{"line":1,"column":0},"end":{"line":9,"column":37}},
"program": {
"type": "Program",
"start":0,"end":244,"loc":{"start":{"line":1,"column":0},"end":{"line":9,"column":37}},
"sourceType": "module",
"interpreter": null,
"body": [
{
"type": "TryStatement",
"start":0,"end":20,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":20}},
"block": {
"type": "BlockStatement",
"start":4,"end":6,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":6}},
"body": [],
"directives": []
},
"handler": {
"type": "CatchClause",
"start":7,"end":20,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":20}},
"param": {
"type": "Identifier",
"start":14,"end":16,"loc":{"start":{"line":1,"column":14},"end":{"line":1,"column":16},"identifierName":"ex"},
"name": "ex"
},
"body": {
"type": "BlockStatement",
"start":18,"end":20,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":20}},
"body": [],
"directives": []
}
},
"finalizer": null
},
{
"type": "TryStatement",
"start":21,"end":50,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":29}},
"block": {
"type": "BlockStatement",
"start":25,"end":27,"loc":{"start":{"line":2,"column":4},"end":{"line":2,"column":6}},
"body": [],
"directives": []
},
"handler": {
"type": "CatchClause",
"start":28,"end":50,"loc":{"start":{"line":2,"column":7},"end":{"line":2,"column":29}},
"param": {
"type": {
"type": "TSTypeAnnotation",
"start":37,"end":46,"loc":{"start":{"line":2,"column":16},"end":{"line":2,"column":25}},
"typeAnnotation": {
"type": "TSUnknownKeyword",
"start":39,"end":46,"loc":{"start":{"line":2,"column":18},"end":{"line":2,"column":25}}
}
},
"start":35,"end":37,"loc":{"start":{"line":2,"column":14},"end":{"line":2,"column":16},"identifierName":"ex"},
"name": "ex"
},
"body": {
"type": "BlockStatement",
"start":48,"end":50,"loc":{"start":{"line":2,"column":27},"end":{"line":2,"column":29}},
"body": [],
"directives": []
}
},
"finalizer": null
},
{
"type": "TryStatement",
"start":51,"end":76,"loc":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},
"block": {
"type": "BlockStatement",
"start":55,"end":57,"loc":{"start":{"line":3,"column":4},"end":{"line":3,"column":6}},
"body": [],
"directives": []
},
"handler": {
"type": "CatchClause",
"start":58,"end":76,"loc":{"start":{"line":3,"column":7},"end":{"line":3,"column":25}},
"param": {
"type": {
"type": "TSTypeAnnotation",
"start":67,"end":72,"loc":{"start":{"line":3,"column":16},"end":{"line":3,"column":21}},
"typeAnnotation": {
"type": "TSAnyKeyword",
"start":69,"end":72,"loc":{"start":{"line":3,"column":18},"end":{"line":3,"column":21}}
}
},
"start":65,"end":67,"loc":{"start":{"line":3,"column":14},"end":{"line":3,"column":16},"identifierName":"ex"},
"name": "ex"
},
"body": {
"type": "BlockStatement",
"start":74,"end":76,"loc":{"start":{"line":3,"column":23},"end":{"line":3,"column":25}},
"body": [],
"directives": []
}
},
"finalizer": null,
"trailingComments": [
{
"type": "CommentLine",
"value": " The following can't be error'd at parse time",
"start":78,"end":125,"loc":{"start":{"line":5,"column":0},"end":{"line":5,"column":47}}
}
]
},
{
"type": "TryStatement",
"start":126,"end":149,"loc":{"start":{"line":6,"column":0},"end":{"line":6,"column":23}},
"block": {
"type": "BlockStatement",
"start":130,"end":132,"loc":{"start":{"line":6,"column":4},"end":{"line":6,"column":6}},
"body": [],
"directives": []
},
"handler": {
"type": "CatchClause",
"start":133,"end":149,"loc":{"start":{"line":6,"column":7},"end":{"line":6,"column":23}},
"param": {
"type": {
"type": "TSTypeAnnotation",
"start":142,"end":145,"loc":{"start":{"line":6,"column":16},"end":{"line":6,"column":19}},
"typeAnnotation": {
"type": "TSTypeReference",
"start":144,"end":145,"loc":{"start":{"line":6,"column":18},"end":{"line":6,"column":19}},
"typeName": {
"type": "Identifier",
"start":144,"end":145,"loc":{"start":{"line":6,"column":18},"end":{"line":6,"column":19},"identifierName":"A"},
"name": "A"
}
}
},
"start":140,"end":142,"loc":{"start":{"line":6,"column":14},"end":{"line":6,"column":16},"identifierName":"ex"},
"name": "ex"
},
"body": {
"type": "BlockStatement",
"start":147,"end":149,"loc":{"start":{"line":6,"column":21},"end":{"line":6,"column":23}},
"body": [],
"directives": []
}
},
"finalizer": null,
"leadingComments": [
{
"type": "CommentLine",
"value": " The following can't be error'd at parse time",
"start":78,"end":125,"loc":{"start":{"line":5,"column":0},"end":{"line":5,"column":47}}
}
]
},
{
"type": "TryStatement",
"start":150,"end":177,"loc":{"start":{"line":7,"column":0},"end":{"line":7,"column":27}},
"block": {
"type": "BlockStatement",
"start":154,"end":156,"loc":{"start":{"line":7,"column":4},"end":{"line":7,"column":6}},
"body": [],
"directives": []
},
"handler": {
"type": "CatchClause",
"start":157,"end":177,"loc":{"start":{"line":7,"column":7},"end":{"line":7,"column":27}},
"param": {
"type": {
"type": "TSTypeAnnotation",
"start":166,"end":173,"loc":{"start":{"line":7,"column":16},"end":{"line":7,"column":23}},
"typeAnnotation": {
"type": "TSTypeReference",
"start":168,"end":173,"loc":{"start":{"line":7,"column":18},"end":{"line":7,"column":23}},
"typeName": {
"type": "Identifier",
"start":168,"end":173,"loc":{"start":{"line":7,"column":18},"end":{"line":7,"column":23},"identifierName":"Error"},
"name": "Error"
}
}
},
"start":164,"end":166,"loc":{"start":{"line":7,"column":14},"end":{"line":7,"column":16},"identifierName":"ex"},
"name": "ex"
},
"body": {
"type": "BlockStatement",
"start":175,"end":177,"loc":{"start":{"line":7,"column":25},"end":{"line":7,"column":27}},
"body": [],
"directives": []
}
},
"finalizer": null
},
{
"type": "TryStatement",
"start":178,"end":206,"loc":{"start":{"line":8,"column":0},"end":{"line":8,"column":28}},
"block": {
"type": "BlockStatement",
"start":182,"end":184,"loc":{"start":{"line":8,"column":4},"end":{"line":8,"column":6}},
"body": [],
"directives": []
},
"handler": {
"type": "CatchClause",
"start":185,"end":206,"loc":{"start":{"line":8,"column":7},"end":{"line":8,"column":28}},
"param": {
"type": {
"type": "TSTypeAnnotation",
"start":194,"end":202,"loc":{"start":{"line":8,"column":16},"end":{"line":8,"column":24}},
"typeAnnotation": {
"type": "TSStringKeyword",
"start":196,"end":202,"loc":{"start":{"line":8,"column":18},"end":{"line":8,"column":24}}
}
},
"start":192,"end":194,"loc":{"start":{"line":8,"column":14},"end":{"line":8,"column":16},"identifierName":"ex"},
"name": "ex"
},
"body": {
"type": "BlockStatement",
"start":204,"end":206,"loc":{"start":{"line":8,"column":26},"end":{"line":8,"column":28}},
"body": [],
"directives": []
}
},
"finalizer": null
},
{
"type": "TryStatement",
"start":207,"end":244,"loc":{"start":{"line":9,"column":0},"end":{"line":9,"column":37}},
"block": {
"type": "BlockStatement",
"start":211,"end":213,"loc":{"start":{"line":9,"column":4},"end":{"line":9,"column":6}},
"body": [],
"directives": []
},
"handler": {
"type": "CatchClause",
"start":214,"end":244,"loc":{"start":{"line":9,"column":7},"end":{"line":9,"column":37}},
"param": {
"type": {
"type": "TSTypeAnnotation",
"start":223,"end":240,"loc":{"start":{"line":9,"column":16},"end":{"line":9,"column":33}},
"typeAnnotation": {
"type": "TSUnionType",
"start":225,"end":240,"loc":{"start":{"line":9,"column":18},"end":{"line":9,"column":33}},
"types": [
{
"type": "TSStringKeyword",
"start":225,"end":231,"loc":{"start":{"line":9,"column":18},"end":{"line":9,"column":24}}
},
{
"type": "TSNumberKeyword",
"start":234,"end":240,"loc":{"start":{"line":9,"column":27},"end":{"line":9,"column":33}}
}
]
}
},
"start":221,"end":223,"loc":{"start":{"line":9,"column":14},"end":{"line":9,"column":16},"identifierName":"ex"},
"name": "ex"
},
"body": {
"type": "BlockStatement",
"start":242,"end":244,"loc":{"start":{"line":9,"column":35},"end":{"line":9,"column":37}},
"body": [],
"directives": []
}
},
"finalizer": null
}
],
"directives": []
},
"comments": [
{
"type": "CommentLine",
"value": " The following can't be error'd at parse time",
"start":78,"end":125,"loc":{"start":{"line":5,"column":0},"end":{"line":5,"column":47}}
}
]
}