From 99d6502bfd2397b58c55c4e99034efec955b4e8e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 10 Apr 2017 14:20:50 -0400 Subject: [PATCH] better error for attempts to use getters/setters for methods. closes #425 --- src/validate/js/propValidators/methods.js | 2 ++ src/validate/js/utils/checkForAccessors.js | 7 +++++++ test/validator/index.js | 5 +++-- .../properties-methods-getters-setters/errors.json | 8 ++++++++ .../properties-methods-getters-setters/input.html | 9 +++++++++ 5 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/validate/js/utils/checkForAccessors.js create mode 100644 test/validator/samples/properties-methods-getters-setters/errors.json create mode 100644 test/validator/samples/properties-methods-getters-setters/input.html diff --git a/src/validate/js/propValidators/methods.js b/src/validate/js/propValidators/methods.js index 23b10f03a5..0bddc3d184 100644 --- a/src/validate/js/propValidators/methods.js +++ b/src/validate/js/propValidators/methods.js @@ -1,3 +1,4 @@ +import checkForAccessors from '../utils/checkForAccessors.js'; import checkForDupes from '../utils/checkForDupes.js'; import checkForComputedKeys from '../utils/checkForComputedKeys.js'; import usesThisOrArguments from '../utils/usesThisOrArguments.js'; @@ -10,6 +11,7 @@ export default function methods ( validator, prop ) { return; } + checkForAccessors( validator, prop.value.properties, 'Methods' ); checkForDupes( validator, prop.value.properties ); checkForComputedKeys( validator, prop.value.properties ); diff --git a/src/validate/js/utils/checkForAccessors.js b/src/validate/js/utils/checkForAccessors.js new file mode 100644 index 0000000000..c6fad53dc8 --- /dev/null +++ b/src/validate/js/utils/checkForAccessors.js @@ -0,0 +1,7 @@ +export default function checkForAccessors ( validator, properties, label ) { + properties.forEach( prop => { + if ( prop.kind !== 'init' ) { + validator.error( `${label} cannot use getters and setters`, prop.start ); + } + }); +} diff --git a/test/validator/index.js b/test/validator/index.js index b3de9046a9..9b88441f34 100644 --- a/test/validator/index.js +++ b/test/validator/index.js @@ -1,12 +1,13 @@ import * as fs from 'fs'; import assert from 'assert'; -import { svelte, exists, tryToLoadJson } from '../helpers.js'; +import { svelte, tryToLoadJson } from '../helpers.js'; describe( 'validate', () => { fs.readdirSync( 'test/validator/samples' ).forEach( dir => { if ( dir[0] === '.' ) return; - const solo = exists( `test/validator/samples/${dir}/solo` ); + // add .solo to a sample directory name to only run that test + const solo = /\.solo/.test( dir ); if ( solo && process.env.CI ) { throw new Error( 'Forgot to remove `solo: true` from test' ); diff --git a/test/validator/samples/properties-methods-getters-setters/errors.json b/test/validator/samples/properties-methods-getters-setters/errors.json new file mode 100644 index 0000000000..40481f12e0 --- /dev/null +++ b/test/validator/samples/properties-methods-getters-setters/errors.json @@ -0,0 +1,8 @@ +[{ + "message": "Methods cannot use getters and setters", + "loc": { + "line": 4, + "column": 3 + }, + "pos": 43 +}] diff --git a/test/validator/samples/properties-methods-getters-setters/input.html b/test/validator/samples/properties-methods-getters-setters/input.html new file mode 100644 index 0000000000..1282aff074 --- /dev/null +++ b/test/validator/samples/properties-methods-getters-setters/input.html @@ -0,0 +1,9 @@ + \ No newline at end of file