From 39694c31c3efe3db36d7ac9ce241ca897d4d8394 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 15 Mar 2018 17:03:44 -0400 Subject: [PATCH] nicer error messages --- src/parse/read/directives.ts | 28 +++++++++---------- .../samples/error-binding-rvalue/error.json | 2 +- .../samples/error-event-handler/error.json | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) 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