From c407dc09de51174c1ac18ff839f91228f3938cc2 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 15 May 2025 18:14:27 -0400 Subject: [PATCH] make analysis available at transform time --- .../svelte/src/compiler/phases/2-analyze/index.js | 7 +++---- .../src/compiler/phases/2-analyze/types.d.ts | 1 - .../phases/2-analyze/visitors/ClassBody.js | 2 ++ packages/svelte/src/compiler/phases/types.d.ts | 14 ++++++++++++-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/svelte/src/compiler/phases/2-analyze/index.js b/packages/svelte/src/compiler/phases/2-analyze/index.js index c29ddd9146..51180ca7cc 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/index.js +++ b/packages/svelte/src/compiler/phases/2-analyze/index.js @@ -256,7 +256,8 @@ export function analyze_module(ast, options) { accessors: false, runes: true, immutable: true, - tracing: false + tracing: false, + classes: new Map() }; walk( @@ -265,7 +266,6 @@ export function analyze_module(ast, options) { scope, scopes, analysis: /** @type {ComponentAnalysis} */ (analysis), - classes: new Map(), state_fields: null, // TODO the following are not needed for modules, but we have to pass them in order to avoid type error, // and reducing the type would result in a lot of tedious type casts elsewhere - find a good solution one day @@ -430,6 +430,7 @@ export function analyze_component(root, source, options) { elements: [], runes, tracing: false, + classes: new Map(), immutable: runes || options.immutable, exports: [], uses_props: false, @@ -625,7 +626,6 @@ export function analyze_component(root, source, options) { has_props_rune: false, component_slots: new Set(), expression: null, - classes: new Map(), state_fields: null, function_depth: scope.function_depth, reactive_statement: null @@ -693,7 +693,6 @@ export function analyze_component(root, source, options) { reactive_statement: null, component_slots: new Set(), expression: null, - classes: new Map(), state_fields: null, function_depth: scope.function_depth }; diff --git a/packages/svelte/src/compiler/phases/2-analyze/types.d.ts b/packages/svelte/src/compiler/phases/2-analyze/types.d.ts index 3bbab7d067..328dc4deb1 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/types.d.ts +++ b/packages/svelte/src/compiler/phases/2-analyze/types.d.ts @@ -21,7 +21,6 @@ export interface AnalysisState { expression: ExpressionMetadata | null; /** Used to analyze class state. */ - classes: Map>; state_fields: Record | null; function_depth: number; diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/ClassBody.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/ClassBody.js index 829a9293b7..46e1fc1a17 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/ClassBody.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/ClassBody.js @@ -18,6 +18,8 @@ export function ClassBody(node, context) { /** @type {Record} */ const state_fields = {}; + context.state.analysis.classes.set(node, state_fields); + /** @type {string[]} */ const seen = []; diff --git a/packages/svelte/src/compiler/phases/types.d.ts b/packages/svelte/src/compiler/phases/types.d.ts index 22e749c97b..6e3aa9e026 100644 --- a/packages/svelte/src/compiler/phases/types.d.ts +++ b/packages/svelte/src/compiler/phases/types.d.ts @@ -1,7 +1,15 @@ -import type { AST, Binding } from '#compiler'; -import type { AssignmentExpression, Identifier, LabeledStatement, Node, Program } from 'estree'; +import type { AST, Binding, StateField } from '#compiler'; +import type { + AssignmentExpression, + ClassBody, + Identifier, + LabeledStatement, + Node, + Program +} from 'estree'; import type { Scope, ScopeRoot } from './scope.js'; import type { StateCreationRuneName } from '../../utils.js'; +import type { AnalysisState } from './2-analyze/types.js'; export interface Js { ast: Program; @@ -30,6 +38,8 @@ export interface Analysis { immutable: boolean; tracing: boolean; + classes: Map>; + // TODO figure out if we can move this to ComponentAnalysis accessors: boolean; }