From 65ee0692184b603a260a1ef14aef9859c9fd7751 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 13 Nov 2023 16:21:16 -0500 Subject: [PATCH] move stuff around --- .../src/compiler/phases/2-analyze/index.js | 3 +- .../src/compiler/phases/2-analyze/utils.js | 41 ++ .../visitors/validate-javascript-runes.js | 73 ++ .../2-analyze/visitors/validate-legacy.js | 5 +- .../2-analyze/visitors/validate-runes.js | 94 +++ .../2-analyze/visitors/validate-template.js | 437 ++++++++++++ .../phases/2-analyze/visitors/validate.js | 638 +----------------- 7 files changed, 655 insertions(+), 636 deletions(-) create mode 100644 packages/svelte/src/compiler/phases/2-analyze/visitors/validate-javascript-runes.js create mode 100644 packages/svelte/src/compiler/phases/2-analyze/visitors/validate-runes.js create mode 100644 packages/svelte/src/compiler/phases/2-analyze/visitors/validate-template.js diff --git a/packages/svelte/src/compiler/phases/2-analyze/index.js b/packages/svelte/src/compiler/phases/2-analyze/index.js index 6abe163582..979a2d878b 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/index.js +++ b/packages/svelte/src/compiler/phases/2-analyze/index.js @@ -15,7 +15,8 @@ import { DelegatedEvents, ReservedKeywords, Runes, SVGElements } from '../consta import { Scope, ScopeRoot, create_scopes, get_rune, set_scope } from '../scope.js'; import { merge } from '../visitors.js'; import Stylesheet from './css/Stylesheet.js'; -import { validation_legacy, validation_runes, validation_runes_js } from './visitors/validate.js'; +import { validation_legacy, validation_runes } from './visitors/validate.js'; +import { validate_javascript_runes } from './visitors/validate-javascript-runes.js'; import { warn } from '../../warnings.js'; import check_graph_for_cycles from './utils/check_graph_for_cycles.js'; import { regex_starts_with_newline } from '../patterns.js'; diff --git a/packages/svelte/src/compiler/phases/2-analyze/utils.js b/packages/svelte/src/compiler/phases/2-analyze/utils.js index 5c68a9b453..902a61660e 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/utils.js +++ b/packages/svelte/src/compiler/phases/2-analyze/utils.js @@ -1,4 +1,5 @@ import { error } from '../../errors.js'; +import { get_rune } from '../scope'; /** * @param {import('../../errors.js').NodeLike} node @@ -53,3 +54,43 @@ export function validate_assignment(node, argument, state) { } } } + +/** + * + * @param {import('estree').Node} node + * @param {import('../scope.js').Scope} scope + * @param {string} name + */ +export function validate_export(node, scope, name) { + const binding = scope.get(name); + if (binding && (binding.kind === 'derived' || binding.kind === 'state')) { + error(node, 'invalid-rune-export', `$${binding.kind}`); + } +} + +/** + * @param {import('estree').CallExpression} node + * @param {import('../scope').Scope} scope + * @param {import('#compiler').SvelteNode[]} path + * @returns + */ +export function validate_call_expression(node, scope, path) { + const rune = get_rune(node, scope); + if (rune === null) return; + + if (rune === '$props' && path.at(-1)?.type !== 'VariableDeclarator') { + error(node, 'invalid-props-location'); + } else if ( + (rune === '$state' || rune === '$derived') && + path.at(-1)?.type !== 'VariableDeclarator' && + path.at(-1)?.type !== 'PropertyDefinition' + ) { + error(node, rune === '$derived' ? 'invalid-derived-location' : 'invalid-state-location'); + } else if (rune === '$effect') { + if (path.at(-1)?.type !== 'ExpressionStatement') { + error(node, 'invalid-effect-location'); + } else if (node.arguments.length !== 1) { + error(node, 'invalid-rune-args-length', '$effect', [1]); + } + } +} diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/validate-javascript-runes.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/validate-javascript-runes.js new file mode 100644 index 0000000000..def87eb46c --- /dev/null +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/validate-javascript-runes.js @@ -0,0 +1,73 @@ +import { error } from '../../../errors.js'; +import { extract_identifiers } from '../../../utils/ast.js'; +import { get_rune } from '../../scope.js'; +import { validate_assignment, validate_call_expression, validate_export } from '../utils.js'; + +/** + * Validation that applies to .svelte.js files (TODO and