Skip to content

Commit

Permalink
fix: Exclude catch clause from let identifier error (#10559)
Browse files Browse the repository at this point in the history
* Exclude catch clause from let identifier error

* Disallow let binding based on parameter

* Add test

* Remove unused getter

* Update packages/babel-parser/src/parser/statement.js

Co-Authored-By: Nicol貌 Ribaudo <nicolo.ribaudo@gmail.com>
  • Loading branch information
zant and nicolo-ribaudo committed Oct 17, 2019
1 parent 487f10f commit 095f28a
Show file tree
Hide file tree
Showing 7 changed files with 139 additions and 3 deletions.
7 changes: 5 additions & 2 deletions packages/babel-parser/src/parser/lval.js
Expand Up @@ -17,7 +17,7 @@ import type {
import type { Pos, Position } from "../util/location";
import { isStrictBindReservedWord } from "../util/identifier";
import { NodeUtils } from "./node";
import { type BindingTypes, BIND_NONE, BIND_LEXICAL } from "../util/scopeflags";
import { type BindingTypes, BIND_NONE } from "../util/scopeflags";

export default class LValParser extends NodeUtils {
// Forward-declaration: defined in expression.js
Expand Down Expand Up @@ -348,6 +348,7 @@ export default class LValParser extends NodeUtils {
bindingType: BindingTypes = BIND_NONE,
checkClashes: ?{ [key: string]: boolean },
contextDescription: string,
disallowLetBinding?: boolean,
): void {
switch (expr.type) {
case "Identifier":
Expand Down Expand Up @@ -383,7 +384,7 @@ export default class LValParser extends NodeUtils {
checkClashes[key] = true;
}
}
if (bindingType === BIND_LEXICAL && expr.name === "let") {
if (disallowLetBinding && expr.name === "let") {
this.raise(
expr.start,
"'let' is not allowed to be used as a name in 'let' or 'const' declarations.",
Expand All @@ -408,6 +409,7 @@ export default class LValParser extends NodeUtils {
bindingType,
checkClashes,
"object destructuring pattern",
disallowLetBinding,
);
}
break;
Expand All @@ -420,6 +422,7 @@ export default class LValParser extends NodeUtils {
bindingType,
checkClashes,
"array destructuring pattern",
disallowLetBinding,
);
}
}
Expand Down
1 change: 1 addition & 0 deletions packages/babel-parser/src/parser/statement.js
Expand Up @@ -1021,6 +1021,7 @@ export default class StatementParser extends ExpressionParser {
kind === "var" ? BIND_VAR : BIND_LEXICAL,
undefined,
"variable declaration",
kind !== "var",
);
}
Expand Down
10 changes: 9 additions & 1 deletion packages/babel-parser/src/plugins/estree.js
Expand Up @@ -108,6 +108,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
bindingType: BindingTypes = BIND_NONE,
checkClashes: ?{ [key: string]: boolean },
contextDescription: string,
disallowLetBinding?: boolean,
): void {
switch (expr.type) {
case "ObjectPattern":
Expand All @@ -117,11 +118,18 @@ export default (superClass: Class<Parser>): Class<Parser> =>
bindingType,
checkClashes,
"object destructuring pattern",
disallowLetBinding,
);
});
break;
default:
super.checkLVal(expr, bindingType, checkClashes, contextDescription);
super.checkLVal(
expr,
bindingType,
checkClashes,
contextDescription,
disallowLetBinding,
);
}
}

Expand Down
@@ -0,0 +1,3 @@
try {} catch (err) {
let let;
}
@@ -0,0 +1,3 @@
{
"throws": "'let' is not allowed to be used as a name in 'let' or 'const' declarations. (2:6)"
}
@@ -0,0 +1 @@
try {} catch (let) {}
@@ -0,0 +1,117 @@
{
"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": "TryStatement",
"start": 0,
"end": 21,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 21
}
},
"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": 21,
"loc": {
"start": {
"line": 1,
"column": 7
},
"end": {
"line": 1,
"column": 21
}
},
"param": {
"type": "Identifier",
"start": 14,
"end": 17,
"loc": {
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 17
},
"identifierName": "let"
},
"name": "let"
},
"body": {
"type": "BlockStatement",
"start": 19,
"end": 21,
"loc": {
"start": {
"line": 1,
"column": 19
},
"end": {
"line": 1,
"column": 21
}
},
"body": [],
"directives": []
}
},
"finalizer": null
}
],
"directives": []
}
}

0 comments on commit 095f28a

Please sign in to comment.