From e723c071162d7ac6da2465db607580ffc73e767e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 23 May 2024 15:43:00 -0400 Subject: [PATCH] simplify code --- .../compiler/phases/2-analyze/validation.js | 70 +++++++++---------- packages/svelte/src/compiler/utils/ast.js | 10 --- 2 files changed, 35 insertions(+), 45 deletions(-) diff --git a/packages/svelte/src/compiler/phases/2-analyze/validation.js b/packages/svelte/src/compiler/phases/2-analyze/validation.js index d05fbcb4fa..2dd1c1458c 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/validation.js +++ b/packages/svelte/src/compiler/phases/2-analyze/validation.js @@ -9,7 +9,6 @@ import { extract_identifiers, get_parent, is_expression_attribute, - is_quoted_attribute, is_text_attribute, object, unwrap_optional @@ -34,6 +33,17 @@ import { Scope, get_rune } from '../scope.js'; import { merge } from '../visitors.js'; import { a11y_validators } from './a11y.js'; +/** @param {import('#compiler').Attribute} attribute */ +function validate_attribute(attribute) { + if (attribute.value === true || attribute.value.length === 1) return; + + const is_quoted = attribute.value.at(-1)?.end !== attribute.end; + + if (!is_quoted) { + e.attribute_invalid_expression(attribute); + } +} + /** * @param {import('#compiler').Component | import('#compiler').SvelteComponent | import('#compiler').SvelteSelf} node * @param {import('zimmerframe').Context} context @@ -58,23 +68,18 @@ function validate_component(node, context) { } if (attribute.type === 'Attribute') { - if ( - context.state.analysis.runes && - !is_quoted_attribute(attribute) && - Array.isArray(attribute.value) && - attribute.value.length > 1 - ) { - e.attribute_invalid_expression(attribute); - } - - if (context.state.analysis.runes && is_expression_attribute(attribute)) { - const expression = attribute.value[0].expression; - if (expression.type === 'SequenceExpression') { - let i = /** @type {number} */ (expression.start); - while (--i > 0) { - const char = context.state.analysis.source[i]; - if (char === '(') break; // parenthesized sequence expressions are ok - if (char === '{') e.attribute_invalid_sequence_expression(expression); + if (context.state.analysis.runes) { + validate_attribute(attribute); + + if (is_expression_attribute(attribute)) { + const expression = attribute.value[0].expression; + if (expression.type === 'SequenceExpression') { + let i = /** @type {number} */ (expression.start); + while (--i > 0) { + const char = context.state.analysis.source[i]; + if (char === '(') break; // parenthesized sequence expressions are ok + if (char === '{') e.attribute_invalid_sequence_expression(expression); + } } } } @@ -116,23 +121,18 @@ function validate_element(node, context) { if (attribute.type === 'Attribute') { const is_expression = is_expression_attribute(attribute); - if ( - context.state.analysis.runes && - !is_quoted_attribute(attribute) && - Array.isArray(attribute.value) && - attribute.value.length > 1 - ) { - e.attribute_invalid_expression(attribute); - } - - if (context.state.analysis.runes && is_expression) { - const expression = attribute.value[0].expression; - if (expression.type === 'SequenceExpression') { - let i = /** @type {number} */ (expression.start); - while (--i > 0) { - const char = context.state.analysis.source[i]; - if (char === '(') break; // parenthesized sequence expressions are ok - if (char === '{') e.attribute_invalid_sequence_expression(expression); + if (context.state.analysis.runes) { + validate_attribute(attribute); + + if (is_expression) { + const expression = attribute.value[0].expression; + if (expression.type === 'SequenceExpression') { + let i = /** @type {number} */ (expression.start); + while (--i > 0) { + const char = context.state.analysis.source[i]; + if (char === '(') break; // parenthesized sequence expressions are ok + if (char === '{') e.attribute_invalid_sequence_expression(expression); + } } } } diff --git a/packages/svelte/src/compiler/utils/ast.js b/packages/svelte/src/compiler/utils/ast.js index 747956ab86..7a5062382f 100644 --- a/packages/svelte/src/compiler/utils/ast.js +++ b/packages/svelte/src/compiler/utils/ast.js @@ -44,16 +44,6 @@ export function is_expression_attribute(attribute) { ); } -/** - * Returns true if the attribute is quoted. - * @param {import('#compiler').Attribute} attribute - * @returns {attribute is import('#compiler').Attribute & { value: [import('#compiler').ExpressionTag] }} - */ -export function is_quoted_attribute(attribute) { - if (attribute.value === true) return false; - return attribute.value.at(-1)?.end !== attribute.end; -} - /** * Returns true if the attribute starts with `on` and contains a single expression node. * @param {import('#compiler').Attribute} attribute