mirror of https://github.com/sveltejs/svelte
Merge pull request #184 from sveltejs/gh-179
error if method is an arrow function expression and uses `this` or `arguments`pull/187/head
commit
161473a918
@ -1,3 +1,9 @@
|
||||
export default function onrender () {
|
||||
import usesThisOrArguments from '../utils/usesThisOrArguments.js';
|
||||
|
||||
export default function onrender ( validator, prop ) {
|
||||
if ( prop.value.type === 'ArrowFunctionExpression' ) {
|
||||
if ( usesThisOrArguments( prop.value.body ) ) {
|
||||
validator.error( `'onrender' should be a function expression, not an arrow function expression`, prop.start );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,9 @@
|
||||
export default function onteardown () {
|
||||
import usesThisOrArguments from '../utils/usesThisOrArguments.js';
|
||||
|
||||
export default function onteardown ( validator, prop ) {
|
||||
if ( prop.value.type === 'ArrowFunctionExpression' ) {
|
||||
if ( usesThisOrArguments( prop.value.body ) ) {
|
||||
validator.error( `'onteardown' should be a function expression, not an arrow function expression`, prop.start );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,24 @@
|
||||
import { walk } from 'estree-walker';
|
||||
import isReference from '../../../utils/isReference.js';
|
||||
|
||||
export default function usesThisOrArguments ( node ) {
|
||||
let result = false;
|
||||
|
||||
walk( node, {
|
||||
enter ( node ) {
|
||||
if ( result || node.type === 'FunctionExpression' || node.type === 'FunctionDeclaration' ) {
|
||||
return this.skip();
|
||||
}
|
||||
|
||||
if ( node.type === 'ThisExpression' ) {
|
||||
result = true;
|
||||
}
|
||||
|
||||
if ( node.type === 'Identifier' && isReference( node ) && node.name === 'arguments' ) {
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
@ -0,0 +1 @@
|
||||
[]
|
@ -0,0 +1,9 @@
|
||||
<button on:click='foo()'></button>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
methods: {
|
||||
foo: () => console.log( 'foo' )
|
||||
}
|
||||
};
|
||||
</script>
|
@ -0,0 +1,8 @@
|
||||
[{
|
||||
"message": "Method 'foo' should be a function expression, not an arrow function expression",
|
||||
"pos": 79,
|
||||
"loc": {
|
||||
"line": 6,
|
||||
"column": 3
|
||||
}
|
||||
}]
|
@ -0,0 +1,11 @@
|
||||
<button on:click='foo()'></button>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
methods: {
|
||||
foo: () => {
|
||||
this.set({ a: 1 });
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
@ -0,0 +1 @@
|
||||
[]
|
@ -0,0 +1,5 @@
|
||||
<script>
|
||||
export default {
|
||||
onrender: () => console.log( 'rendering' )
|
||||
};
|
||||
</script>
|
@ -0,0 +1,8 @@
|
||||
[{
|
||||
"message": "'onrender' should be a function expression, not an arrow function expression",
|
||||
"pos": 29,
|
||||
"loc": {
|
||||
"line": 3,
|
||||
"column": 2
|
||||
}
|
||||
}]
|
@ -0,0 +1,7 @@
|
||||
<script>
|
||||
export default {
|
||||
onrender: () => {
|
||||
this.set({ a: 1 });
|
||||
}
|
||||
};
|
||||
</script>
|
@ -0,0 +1 @@
|
||||
[]
|
@ -0,0 +1,5 @@
|
||||
<script>
|
||||
export default {
|
||||
onteardown: () => console.log( 'tearing down' )
|
||||
};
|
||||
</script>
|
@ -0,0 +1,8 @@
|
||||
[{
|
||||
"message": "'onteardown' should be a function expression, not an arrow function expression",
|
||||
"pos": 29,
|
||||
"loc": {
|
||||
"line": 3,
|
||||
"column": 2
|
||||
}
|
||||
}]
|
@ -0,0 +1,7 @@
|
||||
<script>
|
||||
export default {
|
||||
onteardown: () => {
|
||||
this.set({ a: 1 });
|
||||
}
|
||||
};
|
||||
</script>
|
Loading…
Reference in new issue