svelte/compiler/parse/read/directives.js

44 lines
935 B

import { tokenizer, tokTypes, parseExpressionAt } from 'acorn';
export function readEventHandlerDirective ( parser, start, name ) {
const quoteMark = (
parser.eat( `'` ) ? `'` :
parser.eat( `"` ) ? `"` :
null
);
const expressionStart = parser.index;
let end = null;
let depth = 0;
for ( const token of tokenizer( parser.remaining() ) ) {
if ( token.type === tokTypes.parenL ) depth += 1;
if ( token.type === tokTypes.parenR ) {
depth -= 1;
if ( depth === 0 ) {
end = expressionStart + token.end;
break;
}
}
}
const expression = parseExpressionAt( parser.template.slice( 0, end ), expressionStart );
parser.index = expression.end;
if ( expression.type !== 'CallExpression' ) {
parser.error( `Expected call expression`, expressionStart );
}
if ( quoteMark ) {
parser.eat( quoteMark, true );
}
return {
start,
end: parser.index,
type: 'EventHandler',
name,
expression
};
}