diff --git a/src/parse/read/directives.ts b/src/parse/read/directives.ts index 4c8bcd3ea7..c9c79a85c3 100644 --- a/src/parse/read/directives.ts +++ b/src/parse/read/directives.ts @@ -1,6 +1,5 @@ import { parseExpressionAt } from 'acorn'; import repeat from '../../utils/repeat'; -import list from '../../utils/list'; import { Parser } from '../index'; const DIRECTIVES = { @@ -8,20 +7,22 @@ const DIRECTIVES = { names: ['ref'], attribute(start, end, type, name) { return { start, end, type, name }; - } + }, + allowedExpressionTypes: [], + error: 'ref directives cannot have a value' }, EventHandler: { names: ['on'], - allowedExpressionTypes: ['CallExpression'], attribute(start, end, type, name, expression) { return { start, end, type, name, expression }; - } + }, + allowedExpressionTypes: ['CallExpression'], + error: 'Expected a method call' }, Binding: { names: ['bind'], - allowedExpressionTypes: ['Identifier', 'MemberExpression'], attribute(start, end, type, name, expression) { return { start, end, type, name, @@ -32,19 +33,22 @@ const DIRECTIVES = { name, } }; - } + }, + allowedExpressionTypes: ['Identifier', 'MemberExpression'], + error: 'Can only bind to an identifier (e.g. `foo`) or a member expression (e.g. `foo.bar` or `foo[baz]`)' }, Transition: { names: ['in', 'out', 'transition'], - allowedExpressionTypes: ['ObjectExpression'], attribute(start, end, type, name, expression, directiveName) { return { start, end, type, name, expression, intro: directiveName === 'in' || directiveName === 'transition', outro: directiveName === 'out' || directiveName === 'transition', }; - } + }, + allowedExpressionTypes: ['ObjectExpression'], + error: 'Transition argument must be an object literal, e.g. `{ duration: 400 }`' } }; @@ -138,12 +142,8 @@ export function readDirective( } expression = readExpression(parser, expressionStart, quoteMark); - if (directive.allowedExpressionTypes) { - if (directive.allowedExpressionTypes.indexOf(expression.type) === -1) { - parser.error(`Expected ${list(directive.allowedExpressionTypes)}`, expressionStart); - } - } else { - parser.error(`${directiveName} directives cannot have a value`, expressionStart); + if (directive.allowedExpressionTypes.indexOf(expression.type) === -1) { + parser.error(directive.error, expressionStart); } } diff --git a/test/parser/samples/error-binding-rvalue/error.json b/test/parser/samples/error-binding-rvalue/error.json index 2f25dbef0d..63f6711cd1 100644 --- a/test/parser/samples/error-binding-rvalue/error.json +++ b/test/parser/samples/error-binding-rvalue/error.json @@ -1,5 +1,5 @@ { - "message": "Expected Identifier or MemberExpression", + "message": "Can only bind to an identifier (e.g. `foo`) or a member expression (e.g. `foo.bar` or `foo[baz]`)", "pos": 19, "loc": { "line": 1, diff --git a/test/parser/samples/error-event-handler/error.json b/test/parser/samples/error-event-handler/error.json index 45032c2707..f5e603b06a 100644 --- a/test/parser/samples/error-event-handler/error.json +++ b/test/parser/samples/error-event-handler/error.json @@ -1,5 +1,5 @@ { - "message": "Expected CallExpression", + "message": "Expected a method call", "loc": { "line": 1, "column": 15