Implement ES2016 check for simple parameter list in strict mode (#106)
* Slightly simplify logic * Implement ES2016 check for simple parameter list in strict mode See e.g. ECMA-262 7.0 14.1.2: > It is a Syntax Error if ContainsUseStrict of FunctionBody is true and > IsSimpleParameterList of FormalParameters is false. Similar clauses cover arrow functions, generator functions, methods, and generator methods, as well as async functions and async arrow functions.
This commit is contained in:
parent
64145b07e3
commit
643d3f37a4
@ -885,7 +885,6 @@ pp.parseFunctionBody = function (node, allowExpression) {
|
||||
// are not repeated, and it does not try to bind the words `eval`
|
||||
// or `arguments`.
|
||||
let checkLVal = this.state.strict;
|
||||
let checkLValStrict = false;
|
||||
let isStrict = false;
|
||||
|
||||
// arrow function
|
||||
@ -897,7 +896,6 @@ pp.parseFunctionBody = function (node, allowExpression) {
|
||||
if (directive.value.value === "use strict") {
|
||||
isStrict = true;
|
||||
checkLVal = true;
|
||||
checkLValStrict = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -911,11 +909,14 @@ pp.parseFunctionBody = function (node, allowExpression) {
|
||||
if (checkLVal) {
|
||||
let nameHash = Object.create(null);
|
||||
let oldStrict = this.state.strict;
|
||||
if (checkLValStrict) this.state.strict = true;
|
||||
if (isStrict) this.state.strict = true;
|
||||
if (node.id) {
|
||||
this.checkLVal(node.id, true);
|
||||
}
|
||||
for (let param of (node.params: Array<Object>)) {
|
||||
if (isStrict && param.type !== "Identifier") {
|
||||
this.raise(param.start, "Non-simple parameter in strict mode");
|
||||
}
|
||||
this.checkLVal(param, true, nameHash);
|
||||
}
|
||||
this.state.strict = oldStrict;
|
||||
|
||||
3
test/fixtures/es2016/simple-parameter-list/array-pattern-default/actual.js
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/array-pattern-default/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
function a([ option1, option2 ] = []) {
|
||||
"use strict";
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/array-pattern-default/options.json
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/array-pattern-default/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Non-simple parameter in strict mode (1:11)"
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/array-pattern/actual.js
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/array-pattern/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
function a([ option1, option2 ]) {
|
||||
"use strict";
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/array-pattern/options.json
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/array-pattern/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Non-simple parameter in strict mode (1:11)"
|
||||
}
|
||||
1
test/fixtures/es2016/simple-parameter-list/arrow-function-concise-body/actual.js
vendored
Normal file
1
test/fixtures/es2016/simple-parameter-list/arrow-function-concise-body/actual.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
var a = (options = {}) => options;
|
||||
170
test/fixtures/es2016/simple-parameter-list/arrow-function-concise-body/expected.json
vendored
Normal file
170
test/fixtures/es2016/simple-parameter-list/arrow-function-concise-body/expected.json
vendored
Normal file
@ -0,0 +1,170 @@
|
||||
{
|
||||
"type": "File",
|
||||
"start": 0,
|
||||
"end": 34,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 34
|
||||
}
|
||||
},
|
||||
"program": {
|
||||
"type": "Program",
|
||||
"start": 0,
|
||||
"end": 34,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 34
|
||||
}
|
||||
},
|
||||
"sourceType": "script",
|
||||
"body": [
|
||||
{
|
||||
"type": "VariableDeclaration",
|
||||
"start": 0,
|
||||
"end": 34,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 34
|
||||
}
|
||||
},
|
||||
"declarations": [
|
||||
{
|
||||
"type": "VariableDeclarator",
|
||||
"start": 4,
|
||||
"end": 33,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 4
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 33
|
||||
}
|
||||
},
|
||||
"id": {
|
||||
"type": "Identifier",
|
||||
"start": 4,
|
||||
"end": 5,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 4
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 5
|
||||
},
|
||||
"identifierName": "a"
|
||||
},
|
||||
"name": "a"
|
||||
},
|
||||
"init": {
|
||||
"type": "ArrowFunctionExpression",
|
||||
"start": 8,
|
||||
"end": 33,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 8
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 33
|
||||
}
|
||||
},
|
||||
"id": null,
|
||||
"generator": false,
|
||||
"expression": true,
|
||||
"async": false,
|
||||
"params": [
|
||||
{
|
||||
"type": "AssignmentPattern",
|
||||
"start": 9,
|
||||
"end": 21,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 9
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 21
|
||||
}
|
||||
},
|
||||
"left": {
|
||||
"type": "Identifier",
|
||||
"start": 9,
|
||||
"end": 16,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 9
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 16
|
||||
},
|
||||
"identifierName": "options"
|
||||
},
|
||||
"name": "options"
|
||||
},
|
||||
"right": {
|
||||
"type": "ObjectExpression",
|
||||
"start": 19,
|
||||
"end": 21,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 19
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 21
|
||||
}
|
||||
},
|
||||
"properties": []
|
||||
}
|
||||
}
|
||||
],
|
||||
"body": {
|
||||
"type": "Identifier",
|
||||
"start": 26,
|
||||
"end": 33,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 26
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 33
|
||||
},
|
||||
"identifierName": "options"
|
||||
},
|
||||
"name": "options"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "var"
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/arrow-function/actual.js
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/arrow-function/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
var a = (options = {}) => {
|
||||
"use strict";
|
||||
};
|
||||
3
test/fixtures/es2016/simple-parameter-list/arrow-function/options.json
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/arrow-function/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Non-simple parameter in strict mode (1:9)"
|
||||
}
|
||||
1
test/fixtures/es2016/simple-parameter-list/async-arrow-function-concise-body/actual.js
vendored
Normal file
1
test/fixtures/es2016/simple-parameter-list/async-arrow-function-concise-body/actual.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
var a = async (options = {}) => options;
|
||||
170
test/fixtures/es2016/simple-parameter-list/async-arrow-function-concise-body/expected.json
vendored
Normal file
170
test/fixtures/es2016/simple-parameter-list/async-arrow-function-concise-body/expected.json
vendored
Normal file
@ -0,0 +1,170 @@
|
||||
{
|
||||
"type": "File",
|
||||
"start": 0,
|
||||
"end": 40,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 40
|
||||
}
|
||||
},
|
||||
"program": {
|
||||
"type": "Program",
|
||||
"start": 0,
|
||||
"end": 40,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 40
|
||||
}
|
||||
},
|
||||
"sourceType": "script",
|
||||
"body": [
|
||||
{
|
||||
"type": "VariableDeclaration",
|
||||
"start": 0,
|
||||
"end": 40,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 40
|
||||
}
|
||||
},
|
||||
"declarations": [
|
||||
{
|
||||
"type": "VariableDeclarator",
|
||||
"start": 4,
|
||||
"end": 39,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 4
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 39
|
||||
}
|
||||
},
|
||||
"id": {
|
||||
"type": "Identifier",
|
||||
"start": 4,
|
||||
"end": 5,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 4
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 5
|
||||
},
|
||||
"identifierName": "a"
|
||||
},
|
||||
"name": "a"
|
||||
},
|
||||
"init": {
|
||||
"type": "ArrowFunctionExpression",
|
||||
"start": 8,
|
||||
"end": 39,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 8
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 39
|
||||
}
|
||||
},
|
||||
"id": null,
|
||||
"generator": false,
|
||||
"expression": true,
|
||||
"async": true,
|
||||
"params": [
|
||||
{
|
||||
"type": "AssignmentPattern",
|
||||
"start": 15,
|
||||
"end": 27,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 15
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 27
|
||||
}
|
||||
},
|
||||
"left": {
|
||||
"type": "Identifier",
|
||||
"start": 15,
|
||||
"end": 22,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 15
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 22
|
||||
},
|
||||
"identifierName": "options"
|
||||
},
|
||||
"name": "options"
|
||||
},
|
||||
"right": {
|
||||
"type": "ObjectExpression",
|
||||
"start": 25,
|
||||
"end": 27,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 25
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 27
|
||||
}
|
||||
},
|
||||
"properties": []
|
||||
}
|
||||
}
|
||||
],
|
||||
"body": {
|
||||
"type": "Identifier",
|
||||
"start": 32,
|
||||
"end": 39,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 32
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 39
|
||||
},
|
||||
"identifierName": "options"
|
||||
},
|
||||
"name": "options"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "var"
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/async-arrow-function/actual.js
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/async-arrow-function/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
var a = async (options = {}) => {
|
||||
"use strict";
|
||||
};
|
||||
3
test/fixtures/es2016/simple-parameter-list/async-arrow-function/options.json
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/async-arrow-function/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Non-simple parameter in strict mode (1:15)"
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/async-function/actual.js
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/async-function/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
async function a(options = {}) {
|
||||
"use strict";
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/async-function/options.json
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/async-function/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Non-simple parameter in strict mode (1:17)"
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/default/actual.js
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/default/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
function a(options = {}) {
|
||||
"use strict";
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/default/options.json
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/default/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Non-simple parameter in strict mode (1:11)"
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/generator-function/actual.js
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/generator-function/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
function* a(options = {}) {
|
||||
"use strict";
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/generator-function/options.json
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/generator-function/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Non-simple parameter in strict mode (1:12)"
|
||||
}
|
||||
5
test/fixtures/es2016/simple-parameter-list/generator-method/actual.js
vendored
Normal file
5
test/fixtures/es2016/simple-parameter-list/generator-method/actual.js
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
var obj = {
|
||||
* a(options = {}) {
|
||||
"use strict";
|
||||
}
|
||||
};
|
||||
3
test/fixtures/es2016/simple-parameter-list/generator-method/options.json
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/generator-method/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Non-simple parameter in strict mode (2:6)"
|
||||
}
|
||||
5
test/fixtures/es2016/simple-parameter-list/method/actual.js
vendored
Normal file
5
test/fixtures/es2016/simple-parameter-list/method/actual.js
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
var obj = {
|
||||
a(options = {}) {
|
||||
"use strict";
|
||||
}
|
||||
};
|
||||
3
test/fixtures/es2016/simple-parameter-list/method/options.json
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/method/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Non-simple parameter in strict mode (2:4)"
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/object-pattern-default/actual.js
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/object-pattern-default/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
function a({ option1, option2 } = {}) {
|
||||
"use strict";
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/object-pattern-default/options.json
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/object-pattern-default/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Non-simple parameter in strict mode (1:11)"
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/object-pattern/actual.js
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/object-pattern/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
function a({ option1, option2 }) {
|
||||
"use strict";
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/object-pattern/options.json
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/object-pattern/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Non-simple parameter in strict mode (1:11)"
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/rest/actual.js
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/rest/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
function a(...options) {
|
||||
"use strict";
|
||||
}
|
||||
3
test/fixtures/es2016/simple-parameter-list/rest/options.json
vendored
Normal file
3
test/fixtures/es2016/simple-parameter-list/rest/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Non-simple parameter in strict mode (1:11)"
|
||||
}
|
||||
@ -1 +0,0 @@
|
||||
function a([], []) {'use strict';}
|
||||
@ -1,154 +0,0 @@
|
||||
{
|
||||
"type": "File",
|
||||
"start": 0,
|
||||
"end": 34,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 34
|
||||
}
|
||||
},
|
||||
"program": {
|
||||
"type": "Program",
|
||||
"start": 0,
|
||||
"end": 34,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 34
|
||||
}
|
||||
},
|
||||
"sourceType": "script",
|
||||
"body": [
|
||||
{
|
||||
"type": "FunctionDeclaration",
|
||||
"start": 0,
|
||||
"end": 34,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 34
|
||||
}
|
||||
},
|
||||
"id": {
|
||||
"type": "Identifier",
|
||||
"start": 9,
|
||||
"end": 10,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 9
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 10
|
||||
}
|
||||
},
|
||||
"name": "a"
|
||||
},
|
||||
"generator": false,
|
||||
"expression": false,
|
||||
"params": [
|
||||
{
|
||||
"type": "ArrayPattern",
|
||||
"start": 11,
|
||||
"end": 13,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 11
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 13
|
||||
}
|
||||
},
|
||||
"elements": []
|
||||
},
|
||||
{
|
||||
"type": "ArrayPattern",
|
||||
"start": 15,
|
||||
"end": 17,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 15
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 17
|
||||
}
|
||||
},
|
||||
"elements": []
|
||||
}
|
||||
],
|
||||
"body": {
|
||||
"type": "BlockStatement",
|
||||
"start": 19,
|
||||
"end": 34,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 19
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 34
|
||||
}
|
||||
},
|
||||
"body": [],
|
||||
"directives": [
|
||||
{
|
||||
"type": "Directive",
|
||||
"start": 20,
|
||||
"end": 33,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 20
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 33
|
||||
}
|
||||
},
|
||||
"value": {
|
||||
"type": "DirectiveLiteral",
|
||||
"start": 20,
|
||||
"end": 32,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 20
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 32
|
||||
}
|
||||
},
|
||||
"value": "use strict",
|
||||
"extra": {
|
||||
"raw": "'use strict'",
|
||||
"rawValue": "use strict"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user