From 75680a9a5eec4f243dc95b4c317e067b1484ccf3 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 15 May 2025 17:44:05 -0400 Subject: [PATCH] get rid of the class --- .../src/compiler/phases/2-analyze/index.js | 6 +++--- .../src/compiler/phases/2-analyze/types.d.ts | 7 +++---- .../phases/2-analyze/visitors/ClassBody.js | 17 +++++------------ packages/svelte/src/compiler/phases/types.d.ts | 3 ++- packages/svelte/src/compiler/types/index.d.ts | 9 +++++++++ 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/packages/svelte/src/compiler/phases/2-analyze/index.js b/packages/svelte/src/compiler/phases/2-analyze/index.js index 511bc50646..c29ddd9146 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/index.js +++ b/packages/svelte/src/compiler/phases/2-analyze/index.js @@ -266,7 +266,7 @@ export function analyze_module(ast, options) { scopes, analysis: /** @type {ComponentAnalysis} */ (analysis), classes: new Map(), - class: null, + 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 ast_type: /** @type {any} */ (null), @@ -626,7 +626,7 @@ export function analyze_component(root, source, options) { component_slots: new Set(), expression: null, classes: new Map(), - class: null, + state_fields: null, function_depth: scope.function_depth, reactive_statement: null }; @@ -694,7 +694,7 @@ export function analyze_component(root, source, options) { component_slots: new Set(), expression: null, classes: new Map(), - class: null, + 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 c01a6fceb2..97b6029f79 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/types.d.ts +++ b/packages/svelte/src/compiler/phases/2-analyze/types.d.ts @@ -1,7 +1,6 @@ import type { Scope } from '../scope.js'; import type { ComponentAnalysis, ReactiveStatement } from '../types.js'; -import type { AST, ExpressionMetadata, ValidatedCompileOptions } from '#compiler'; -import type { ClassAnalysis } from './visitors/shared/class-analysis.js'; +import type { AST, ExpressionMetadata, StateFields, ValidatedCompileOptions } from '#compiler'; import type { ClassBody } from 'estree'; export interface AnalysisState { @@ -22,8 +21,8 @@ export interface AnalysisState { expression: ExpressionMetadata | null; /** Used to analyze class state. */ - classes: Map; - class: ClassAnalysis | null; + classes: Map; + state_fields: StateFields | 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 9392c298d8..6c5055bc17 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/ClassBody.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/ClassBody.js @@ -1,6 +1,6 @@ /** @import { AssignmentExpression, ClassBody, PropertyDefinition, Expression, PrivateIdentifier, MethodDefinition } from 'estree' */ +/** @import { StateFields } from '#compiler' */ /** @import { Context } from '../types' */ -/** @import { StateCreationRuneName } from '../../../../utils.js' */ import { get_rune } from '../../scope.js'; import * as e from '../../../errors.js'; import { is_state_creation_rune } from '../../../../utils.js'; @@ -15,7 +15,8 @@ export function ClassBody(node, context) { return; } - const analyzed = new ClassAnalysis(); + /** @type {StateFields} */ + const state_fields = {}; /** @type {string[]} */ const seen = []; @@ -39,7 +40,7 @@ export function ClassBody(node, context) { e.constructor_state_reassignment(node); // TODO the same thing applies to duplicate fields, so the code/message needs to change } - analyzed.fields[name] = { + state_fields[name] = { node, type: rune }; @@ -81,7 +82,7 @@ export function ClassBody(node, context) { context.next({ ...context.state, - class: analyzed + state_fields }); } @@ -93,11 +94,3 @@ function get_name(node) { return null; } - -/** @typedef { StateCreationRuneName | 'regular'} PropertyAssignmentType */ -/** @typedef {{ type: PropertyAssignmentType; node: AssignmentExpression | PropertyDefinition; }} PropertyAssignmentDetails */ - -class ClassAnalysis { - /** @type {Record} */ - fields = {}; -} diff --git a/packages/svelte/src/compiler/phases/types.d.ts b/packages/svelte/src/compiler/phases/types.d.ts index f98cbe1415..22e749c97b 100644 --- a/packages/svelte/src/compiler/phases/types.d.ts +++ b/packages/svelte/src/compiler/phases/types.d.ts @@ -1,6 +1,7 @@ import type { AST, Binding } from '#compiler'; -import type { Identifier, LabeledStatement, Node, Program } from 'estree'; +import type { AssignmentExpression, Identifier, LabeledStatement, Node, Program } from 'estree'; import type { Scope, ScopeRoot } from './scope.js'; +import type { StateCreationRuneName } from '../../utils.js'; export interface Js { ast: Program; diff --git a/packages/svelte/src/compiler/types/index.d.ts b/packages/svelte/src/compiler/types/index.d.ts index 616c346ad3..20fe2c5eec 100644 --- a/packages/svelte/src/compiler/types/index.d.ts +++ b/packages/svelte/src/compiler/types/index.d.ts @@ -2,6 +2,8 @@ import type { SourceMap } from 'magic-string'; import type { Binding } from '../phases/scope.js'; import type { AST, Namespace } from './template.js'; import type { ICompileDiagnostic } from '../utils/compile_diagnostic.js'; +import type { StateCreationRuneName } from '../../utils.js'; +import type { AssignmentExpression, PropertyDefinition } from 'estree'; /** The return value of `compile` from `svelte/compiler` */ export interface CompileResult { @@ -269,6 +271,13 @@ export interface ExpressionMetadata { has_call: boolean; } +export interface StateFields { + [name: string]: { + type: StateCreationRuneName; + node: PropertyDefinition | AssignmentExpression; + }; +} + export * from './template.js'; export { Binding, Scope } from '../phases/scope.js';