From 8ad678e5bc682adb2f2a5c8eda6f947006381e1f Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sat, 7 Mar 2015 01:32:03 +1100 Subject: [PATCH] make it illegal to have a rest on a setter --- src/babel/messages.js | 1 + src/babel/transformation/transformers/index.js | 1 + .../transformers/internal/validation.js | 11 +++++++++-- .../validation-setters/no-rest/actual.js | 5 +++++ .../validation-setters/no-rest/options.json | 3 +++ 5 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/transformation/validation-setters/no-rest/actual.js create mode 100644 test/fixtures/transformation/validation-setters/no-rest/options.json diff --git a/src/babel/messages.js b/src/babel/messages.js index 50d7e0d0f5..cf00085320 100644 --- a/src/babel/messages.js +++ b/src/babel/messages.js @@ -10,6 +10,7 @@ export var messages = { undeclaredVariable: "Reference to undeclared variable $1", undeclaredVariableSuggestion: "Reference to undeclared variable $1 - did you mean $2?", settersInvalidParamLength: "Setters must have exactly one parameter", + settersNoRest: "Setters aren't allowed to have a rest", noAssignmentsInForHead: "No assignments allowed in for-in/of head", expectedMemberExpressionOrIdentifier: "Expected type MemeberExpression or Identifier", invalidParentForThisNode: "We don't know how to handle this node within the current parent - please open an issue", diff --git a/src/babel/transformation/transformers/index.js b/src/babel/transformation/transformers/index.js index 67dd56f30c..e8924d0576 100644 --- a/src/babel/transformation/transformers/index.js +++ b/src/babel/transformation/transformers/index.js @@ -3,6 +3,7 @@ export default { _validation: require("./internal/validation"), + "validation.undeclaredVariableCheck": require("./validation/undeclared-variable-check"), "validation.react": require("./validation/react"), // this goes at the start so we only transform the original user code diff --git a/src/babel/transformation/transformers/internal/validation.js b/src/babel/transformation/transformers/internal/validation.js index 9dff3a64f4..b380e53e03 100644 --- a/src/babel/transformation/transformers/internal/validation.js +++ b/src/babel/transformation/transformers/internal/validation.js @@ -12,8 +12,15 @@ export function ForOfStatement(node, parent, scope, file) { export { ForOfStatement as ForInStatement }; export function Property(node, parent, scope, file) { - if (node.kind === "set" && node.value.params.length !== 1) { - throw file.errorWithNode(node.value, messages.get("settersInvalidParamLength")); + if (node.kind === "set") { + if (node.value.params.length !== 1) { + throw file.errorWithNode(node.value, messages.get("settersInvalidParamLength")); + } + + var first = node.value.params[0]; + if (t.isRestElement(first)) { + throw file.errorWithNode(first, messages.get("settersNoRest")); + } } } diff --git a/test/fixtures/transformation/validation-setters/no-rest/actual.js b/test/fixtures/transformation/validation-setters/no-rest/actual.js new file mode 100644 index 0000000000..1ce31f6119 --- /dev/null +++ b/test/fixtures/transformation/validation-setters/no-rest/actual.js @@ -0,0 +1,5 @@ +var obj = { + set foo(...args) { + + } +}; diff --git a/test/fixtures/transformation/validation-setters/no-rest/options.json b/test/fixtures/transformation/validation-setters/no-rest/options.json new file mode 100644 index 0000000000..3dd0398186 --- /dev/null +++ b/test/fixtures/transformation/validation-setters/no-rest/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Setters aren't allowed to have a rest" +}