mirror of https://github.com/sveltejs/svelte
43 lines
1.1 KiB
43 lines
1.1 KiB
import flattenReference from '../../utils/flattenReference';
|
|
import list from '../utils/list';
|
|
import { Validator } from '../index';
|
|
import { Node } from '../../interfaces';
|
|
|
|
const validBuiltins = new Set(['set', 'fire', 'destroy']);
|
|
|
|
export default function validateEventHandlerCallee(
|
|
validator: Validator,
|
|
attribute: Node
|
|
) {
|
|
const { callee, start, type } = attribute.expression;
|
|
|
|
if (type !== 'CallExpression') {
|
|
validator.error(`Expected a call expression`, start);
|
|
}
|
|
|
|
const { name } = flattenReference(callee);
|
|
|
|
if (name === 'this' || name === 'event') return;
|
|
if (
|
|
(callee.type === 'Identifier' && validBuiltins.has(callee.name)) ||
|
|
validator.methods.has(callee.name)
|
|
)
|
|
return;
|
|
|
|
const validCallees = ['this.*', 'event.*'].concat(
|
|
Array.from(validBuiltins),
|
|
Array.from(validator.methods.keys())
|
|
);
|
|
|
|
let message = `'${validator.source.slice(
|
|
callee.start,
|
|
callee.end
|
|
)}' is an invalid callee (should be one of ${list(validCallees)})`;
|
|
|
|
if (callee.type === 'Identifier' && validator.helpers.has(callee.name)) {
|
|
message += `. '${callee.name}' exists on 'helpers', did you put it in the wrong place?`;
|
|
}
|
|
|
|
validator.warn(message, start);
|
|
}
|