@compelem/compiler 0.30.0-beta.3 → 0.30.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +2 -2
- package/dist/index.d.ts +33 -21
- package/dist/index.js +2 -2
- package/dist/{vite-DwMiG3VM.js → vite-CY_6E-Ut.js} +2602 -2165
- package/dist/vite-CY_6E-Ut.js.map +1 -0
- package/dist/{vite-BAl4p1jA.d.ts → vite-D178A0gy.d.ts} +4 -12
- package/dist/vite.d.ts +1 -1
- package/dist/vite.js +1 -1
- package/package.json +60 -56
- package/dist/vite-DwMiG3VM.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-CY_6E-Ut.js","names":["babelParse","parse","out: any[]","chain: string[]","cur: any","render: { body: any; start: number; end: number } | null","cssVars: any[] | null","decs: string[]","kind: ReactiveKind | null","out: any[]","out: ComponentAnalysis[]","worklist: Array<{ className: string; cls: any; isMixin: boolean }>","tagName: string | undefined","staticReason: string | null","cur: any","KNOWN_GLOBALS: ReadonlySet<string>","IMPURE_GLOBALS: ReadonlySet<string>","TEMPLATE_ARG_INDEX: Record<string, number[] | 'rest-after-0'>","record","c: any","added: string[]","scanNode","ctx: ScanCtx","name: string | null","fnNode: any","params: string[]","stmts: any[]","lifts: Array<{ name: string; initSrc: string; init: any }>","c: any","args: any[]","lines: string[]","edits: Edit[]","existing: string[]","callNode: any","ctx: ImportCtx","classes: any[]","applied: Edit[]","reasons: string[]","parts: string[]","injected: string[]","additions: string[]","strOf","obj: Record<string, any>","inner: Record<string, any>","walk","parts: string[]","v: any","usage: ThisUsage","out: OptionEntry[]","init: any","node: any","BUILTIN_TYPE_NAMES: ReadonlySet<string>","out: string[]","COMPELEM_MEMBERS: ReadonlySet<string>","errs: ConventionError[]","decs: string[]","walk","inner","BASE_SIGNAL_ROOTS: ReadonlySet<string>","node: any","c: any","cur: any","ctx: ExtractCtx","out: Record<string, string[]>","EMPTY: InitMeta","unwrapTsExpr","factories: string[]","out: string[]","parts: string[]","cur: any","result: WatchExtractResult","chain: Array<{ node: any; fields: Set<string> }>","complete","chain","lineComments: Array<{ start: number; end: number }>","stack: Ctx[]","m: RegExpExecArray | null","FAM_CODE: Record<Family, string>","PROP_OPTION_KEYS: ReadonlySet<string>","STATE_OPTION_KEYS: ReadonlySet<string>","out: string[]","cur: any","empty: FieldExtractResult","cands: Cand[]","errors: ConventionError[]","decs: any[]","selector: string | undefined","cacheStrs: string[] | null | undefined","accs: Record<Family, Acc>","unwrapTsExpr","removals: Array<{ start: number; end: number }>","propsCode: string | undefined","statesCode: string | undefined","computedCode: string | undefined","familyLabel: Record<Family, string>","parts: string[]","fieldInits: Array<{ name: string; initText: string; computed?: boolean }>","runtimeHelpers: string[]","result: MethodDecoResult","unwrapTsExpr","args: any[]","SKIPS_RETURN_STMTS: ReadonlySet<string>","out: TemplateVarInfo[]","html: string","out: string[]","walk","hits: any[]","quasi: any","strings: string[]","vars: TemplateVarInfo[]","isDirectiveCall","directiveName: string | undefined","moduleBindingName: string | undefined","directiveVarChain: string[] | undefined","EMPTY_TAG_SET: ReadonlySet<string>","DIRECTIVE_SCOPES: Record<string, string[]>","EVENT_PLAIN_MODS: ReadonlySet<string>","KEY_EVENTS: ReadonlySet<string>","NATIVE_EVENTS: ReadonlySet<string>","COMP_EVENT_MODS: ReadonlySet<string>","MODEL_NON_TARGET_TYPES: ReadonlySet<string>","tag: string | undefined","emits: Set<string> | undefined","errs: TemplateRuleError[]","args: any[]","unwrapTsExpr","elements: TElement[]","out: string[]","__source: string","hits: any[]","walk","hit: any","retHits: any[]","quasi: any","strings: string[]","vars: TemplateVarInfo[]","directiveName: string | undefined","moduleBindingName: string | undefined","directiveVarChain: string[] | undefined","ctx: CollectCtx","pos: number","parts: TPart[]","m: RegExpExecArray | null","WS_SENSITIVE_TAGS: ReadonlySet<string>","root: TNode[]","stack: OpenTag[]","err","end","lower","el: TElement","attrValue: string | null","kept: TNode[]","i","walk","IMPURE_GLOBALS","IMPURE_GLOBAL_SET","chain: string[]","cur: any","fnBody: any","scopes: Set<string>[]","collectParams","walk","args: any[]","out: string[]","exprs: string[]","biMap: Record<string, number[]>","alwaysDirty: number[]","chainOut: ChainOut | null","exprsOut: string[]","fast: string[]","fx: string[]","writers: WriterSet","ictx: InlineCtx | undefined","n","src: string | null","prelude: string | null","stmts: string[]","ctx: Ctx","rootPath: number[]","WALK_LINES: string[]","errors: string[]","out: TNode[]","sn","up: UpOut","body: any","entries: VarMapEntry[]","updates: VarMapEntry['updates']","kind: VarMapEntry['kind']","deps: DepSummary","KIND_LABEL: Record<string, string>","parse","inlineEdits: InlineEdit[]","edits: Array<{\n comp: ComponentAnalysis\n literal: string\n removals?: Array<{ start: number; end: number }>\n /** prop/state 初始值 → 构造体写入(字段已整体删除) */\n fieldInits?: Array<{ name: string; initText: string; computed?: boolean }>\n /** 构造体插入点计划(无初始值时缺省) */\n ctor?: CtorInsertPlan\n /** 方法装饰器(@debounced/@throttled/@onced)构造体注入语句 */\n methodDecoCtor?: string\n /** 方法装饰器 destroy 注入语句 */\n methodDecoDestroy?: string\n /** 本组件访问器所需的运行时函数(已定名)——文件级 import 注入取并集 */\n helpers?: string[]\n /** 本组件方法装饰器所需的 myfx 函数(debounce/throttle/once)——走 myfx 通道注入 */\n myfxHelpers?: string[]\n }>","diagnostics: CompileResult['diagnostics']","renderStrips: Array<{ edit: (typeof edits)[number]; start: number; end: number }>","helperBindings: Record<string, string>","carrierDecls: string[]","watchEffectsCode: string | undefined","watchRemovals: Array<{ start: number; end: number }>","allRemovals: Array<{ start: number; end: number }>","mainHits: any[]","cssEffectCode: string | undefined","subViewDepsRec: Record<number, string[]> | undefined","buildTemplateCode: string | undefined","subsCode: string | undefined","pointEffectsCode: string | undefined","fxCode: string | undefined","tmplErrors: string[]","mainTmpl: ReturnType<typeof extractMainTemplate>","mainUps: UpOut[] | undefined","mainNodeNames: string[] | undefined","updateMeta: UpdateMeta","subCandidates: ReturnType<typeof collectSubCandidates>","c1SubBvMap: Map<number, ReturnType<typeof generateSubBuildVars>> | undefined","c1Extras: Map<number, string> | undefined","c1Carriers: Map<number, string> | undefined","c1BvOpts: BuildVarsOptions | undefined","freeCache: Map<string, Set<string> | null>","liftPlan: Array<{\n cand: (typeof subCandidates)[number]\n allowed: Set<string>\n r: ReturnType<typeof generateSubBuildVars>\n }>","out","id","liftGen: ReturnType<typeof generateBuildTemplate> | undefined","bvOpts: BuildVarsOptions","entries: string[]","rec: Record<number, string[]>","edit: (typeof edits)[number]","helperImport: { decl: any; source: string } | undefined","myfxImport: { decl: any; source: string } | undefined","helpersAnchor: number | undefined","topLevelAnchor: number | undefined","lastImportEnd: number | undefined","inter: string[]","arr: number[]","lastNl","errs: string[]","warns: string[]","nl: Int32Array | undefined","err"],"sources":["../src/utils/ast.ts","../src/analyze/component.ts","../src/utils/globals.ts","../src/analyze/template.ts","../src/analyze/render-body.ts","../src/analyze/inline-template-methods.ts","../src/analyze/static-gate.ts","../src/types.ts","../src/codegen/inject.ts","../src/analyze/conventions.ts","../src/analyze/deps-extract.ts","../src/analyze/literal-meta.ts","../src/analyze/watch-extract.ts","../src/utils/js-text.ts","../src/analyze/field-extract.ts","../src/analyze/method-deco-extract.ts","../src/analyze/strip-ts.ts","../src/analyze/template-extract.ts","../src/analyze/template-rules.ts","../src/analyze/template-subs.ts","../src/analyze/template-tree.ts","../src/codegen/build-vars.ts","../src/codegen/render-effect.ts","../src/codegen/attr-name.ts","../src/codegen/template-html.ts","../src/codegen/template-dom.ts","../src/compile.ts","../src/vite.ts"],"sourcesContent":["/**\n * AST 访问工具。\n *\n * 依赖 `@babel/parser`(纯 JS 解析器):零原生依赖,安装无需平台二进制\n * (rolldown/parseAst 虽是 oxc 原生解析,但原生 AST → JS 对象的全量物化成本\n * 反超 babel;compelem-ui 语料实测 babel 快 ~1.6x,且免去 @rolldown/binding-*\n * 的安装问题)。\n *\n * babel 对类成员不做 estree 转换(尤其有 decorators 时),故 parse 后统一做\n * 类成员归一化(见 `normalizeAst`),下游仍按 estree 词汇表\n * (PropertyDefinition / MethodDefinition / PrivateIdentifier)消费。\n * `decorators-legacy` 对应 TS experimentalDecorators 语义。\n */\nimport { parse as babelParse } from '@babel/parser'\n\nexport interface ParsedFile {\n program: any\n /** 源码中所有 import 声明:本地名 → { source, imported } */\n imports: Map<string, { source: string, imported: string }>\n}\n\n/**\n * 合法 JS 标识符全匹配(成员名/路径段的统一判据)。\n * 产物用 `rc.<name>` / `this.<name>` 点访问前移,非标识符名会拼出非法 JS,\n * 校验(E 码上报)与 `?.[JSON.stringify]` 降级分派都以此处为唯一定义。\n */\nexport const IDENT_RE = /^[A-Za-z_$][\\w$]*$/\n\n/**\n * 源码字面量序列化(JSON.stringify 绑定固定 receiver)。\n * codegen/analyze 各产物拼接统一引用此处,勿再就地 `const J = JSON.stringify`。\n */\nexport const stringify = (v: unknown): string => JSON.stringify(v)\n\n/**\n * 把一条依赖路径写入依赖集合:完整路径 + (长度 >1 时)根对象名。\n * 根对象一并记录,是因为 Proxy get 会把中间层路径推入,失效判定需按根收敛。\n * deps-extract 与 render-body 两处扫描共用此内核。\n */\nexport function addDepPath(target: Set<string>, path: string[]): void {\n target.add(path.join('.'))\n if (path.length > 1) target.add(path[0])\n}\n\n/**\n * `this.<成员名>` 整体匹配(group1 = 成员名)。\n * E-EVENT-FN / E-REF-TYPE 的处理器与 ref 表达式解析共用此判定。\n */\nexport const THIS_MEMBER_RE = new RegExp(`^this\\\\.(${IDENT_RE.source.slice(1, -1)})$`)\n\n/** parse 缓存 LRU 上限(dev 长会话防内存增长;驱逐仅失 memo,重 parse 结果等价)。 */\nconst CACHE_MAX = 512\nconst CACHE = new Map<string, ParsedFile>()\n\n/**\n * FNV-1a 32 位字符串哈希(导出供 vite transform 缓存 key 用,U4)。\n *\n * ⚠️ 缓存 key 不能只用 `id + '::' + code.length`:同一路径下若源码变了但长度\n * 恰好相同(不同写法替换、测试用例复用同一 id),会命中旧 AST 返回错误结果。\n * 实测踩过:两个仅模板内容不同的 fixture 长度都是 39,V4 用例因此少报了违规。\n * 这里补一个轻量哈希(不引依赖),保证「同 id 不同源码」一定 miss。\n */\nexport function hash32(s: string): string {\n let h = 0x811c9dc5\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i)\n h = Math.imul(h, 0x01000193)\n }\n return (h >>> 0).toString(36)\n}\n\n/** 解析 TS 源码为 AST 的核心(babel → normalizeAst → imports 收集),不查/不写缓存。 */\nfunction doParse(code: string): ParsedFile {\n const ast: any = babelParse(code, {\n sourceType: 'module',\n plugins: ['typescript', 'decorators-legacy', 'estree'],\n errorRecovery: false,\n })\n const program = ast.program\n // babel 对类成员不做 estree 转换(尤其带 decorators 时整个类体保持 babel\n // 形态:ClassProperty / ClassMethod / PrivateName),而下游 10+ 个消费文件\n // 全按 estree 词汇表(PropertyDefinition / MethodDefinition / value 包装 /\n // PrivateIdentifier)编写。在此统一归一化,差异收口于本文件一处。\n normalizeAst(program)\n const imports = new Map<string, { source: string, imported: string }>()\n\n for (const node of program.body ?? []) {\n if (node.type !== 'ImportDeclaration') continue\n const source = node.source?.value\n if (typeof source !== 'string') continue\n for (const spec of node.specifiers ?? []) {\n const local = spec.local?.name\n if (!local) continue\n // ImportSpecifier 有 imported;ImportDefaultSpecifier / NamespaceSpecifier 没有\n const imported =\n spec.imported?.name ?? spec.imported?.value ?? (spec.type === 'ImportDefaultSpecifier' ? 'default' : '*')\n imports.set(local, { source, imported })\n }\n }\n\n return { program, imports }\n}\n\n/** 解析 TS 源码为 AST(带缓存,LRU:命中回尾、超限逐出最老)。 */\nexport function parse(code: string, id = '<anon>'): ParsedFile {\n const key = id + '::' + code.length + '::' + hash32(code)\n const hit = CACHE.get(key)\n if (hit) {\n //LRU touch:移回尾部(驱逐从头部取最久未用)\n CACHE.delete(key)\n CACHE.set(key, hit)\n return hit\n }\n\n const parsed = doParse(code)\n if (CACHE.size >= CACHE_MAX) {\n const oldest = CACHE.keys().next().value\n if (oldest !== undefined) CACHE.delete(oldest)\n }\n CACHE.set(key, parsed)\n return parsed\n}\n\nexport function parseUncached(code: string): ParsedFile {\n return doParse(code)\n}\n\n/**\n * 旧式尖括号类型断言 `<T>x`(Babel TS 插件解析成 `TSTypeAssertion`)与显式泛型实例化\n * 调用 `f<T>(x)`(`TSInstantiationExpression`)——**都不允许进产物文本**。\n *\n * 文本判据抓不到它们:`TS_SYNTAX_RE` 里没有 `<T>` 形态,因为任何能抓住它的正则都会\n * 同时误伤 `a < b ? c : d` 这类合法比较 —— 只能按 AST 判。而 `f<T>()` 与 `<T>x` 原样\n * 进入 codegen 产物(产物按纯 JS 契约生成,且在 build-vars 里被 `(expr)` 包裹后重解析)\n * 是**语法错误**。故所有把插值/形参/prelude 文本复制进产物的出口都要过这道门(C-G6)。\n */\nexport function containsBlockedTsNode(node: any): boolean {\n if (!node || typeof node.type !== 'string') return false\n if (node.type === 'TSTypeAssertion' || node.type === 'TSInstantiationExpression') return true\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'loc' || key === 'parent') continue\n const c = (node as any)[key]\n if (Array.isArray(c)) {\n for (const x of c) if (containsBlockedTsNode(x)) return true\n } else if (c && typeof c === 'object' && typeof c.type === 'string' && containsBlockedTsNode(c)) {\n return true\n }\n }\n return false\n}\n\n/** blocked 节点的统一诊断文案(各出口共用,措辞一致)。 */\nexport function blockedTsText(label: string, exprText: string): string {\n return (\n `${label} 含旧式尖括号断言 <T>x / 显式实例化 f<T>(x),不被支持,` +\n `请改用 as / 去掉显式类型参数:\\`${exprText}\\`;codegen 产物为纯 JS,请在模板外完成类型操作`\n )\n}\n\n/**\n * 跨包组件降级(连字符)的统一判据:登记过 / 标签名含 `-`(customElements.define 硬约束)/\n * `<slot>` 都算「自定义/组件标签」。knownTags 只需传入 `has` 能力(Set 或等价对象)。\n */\nexport function isCustomTag(tagLower: string, knownTags: { has(name: string): boolean }): boolean {\n return knownTags.has(tagLower) || tagLower.includes('-') || tagLower === 'slot'\n}\n\n/**\n * babel → estree 类成员归一化(就地改写)。\n *\n * 背景:babel 的 `estree` 插件遇到 decorators(legacy 与 TC39 皆然)时**不转换\n * 类成员**,即使无装饰器的字段也保持 babel 形态;而编译器下游全按 estree\n * 词汇表编写。三处结构差异:\n * 1. `ClassProperty` / `ClassPrivateProperty` → `PropertyDefinition`(字段形状\n * 本就同构:key / value / static,直接改 type)。\n * 2. `ClassMethod` / `ClassPrivateMethod` → `MethodDefinition`:babel 把\n * params / body 直接放在成员上,estree 则包装在 `.value`(FunctionExpression)\n * 里,下游有 `member.value.body` 与按 `value` 的遍历。包装节点的 start 取\n * 参数区起点(value 整体不会被切片,方法体切片走 `value.body`,位置精确)。\n * 3. `PrivateName` → `PrivateIdentifier`:estree 名字在 `key.name`,babel 在\n * `key.id.name`(类字段 key 与 `#x in obj`、成员访问统一处理)。\n *\n * 改写幂等,同一节点被重复访问(如包装后 params 被两处引用)安全。\n */\nfunction normalizeAst(node: any): void {\n if (!node || typeof node !== 'object') return\n if (Array.isArray(node)) {\n for (const item of node) normalizeAst(item)\n return\n }\n if (typeof node.type !== 'string') return\n\n switch (node.type) {\n case 'ClassProperty':\n node.type = 'PropertyDefinition'\n break\n case 'ClassPrivateProperty':\n node.type = 'PropertyDefinition'\n break\n case 'ClassMethod':\n case 'ClassPrivateMethod': {\n node.value = {\n type: 'FunctionExpression',\n id: null,\n params: node.params,\n body: node.body,\n generator: node.generator,\n async: node.async,\n start: node.params?.[0]?.start ?? node.body?.start ?? node.start,\n end: node.body?.end ?? node.end,\n }\n node.computed = node.computed ?? false\n node.type = 'MethodDefinition'\n break\n }\n case 'PrivateName':\n node.type = 'PrivateIdentifier'\n node.name = node.id?.name\n // 必须删除遗留的 id 子节点:名字已折叠进 node.name,若保留,下游\n // render-body 的 D3 扫描会递归进入这个幽灵 Identifier,其 parent 是\n // PrivateIdentifier(isFreeIdentifierRef 无此 case → default 放行),\n // 私有字段/方法访问(this.#x)被误判为「未知自由标识符」。\n delete node.id\n break\n }\n\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'loc') continue\n const child = node[key]\n if (Array.isArray(child)) {\n for (const item of child) if (item && typeof item === 'object') normalizeAst(item)\n } else if (child && typeof child === 'object') {\n normalizeAst(child)\n }\n }\n}\n\n/** 收集函数体顶层的 return 语句(不下钻嵌套函数,避免误计回调内 return)。 */\nexport function topLevelReturns(body: any): any[] {\n const out: any[] = []\n const nodes: any[] = Array.isArray(body) ? [...body] : body ? [body] : []\n // 用显式栈做「顶层」遍历:遇到块语句下钻,遇到函数停止\n const stack = [...nodes]\n while (stack.length) {\n const n = stack.pop()!\n if (!n || typeof n.type !== 'string') continue\n if (n.type === 'ReturnStatement') {\n out.push(n)\n continue\n }\n if (\n n.type === 'FunctionDeclaration' ||\n n.type === 'FunctionExpression' ||\n n.type === 'ArrowFunctionExpression'\n ) {\n continue\n }\n for (const key of Object.keys(n)) {\n if (key === 'type' || key === 'start' || key === 'end') continue\n const child = n[key]\n if (Array.isArray(child)) {\n for (const c of child) if (c && typeof c.type === 'string') stack.push(c)\n } else if (child && typeof child === 'object' && typeof child.type === 'string') {\n stack.push(child)\n }\n }\n }\n return out\n}\n\n/** 判断节点是否为一个「自由标识符引用」(非成员访问的属性位、非声明、非标签)。 */\nexport function isFreeIdentifierRef(node: any, parent: any | null): boolean {\n if (!node || node.type !== 'Identifier') return false\n if (!parent) return true\n switch (parent.type) {\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n // `a.b` 里的 `b` 不是自由引用;`a` 是\n return parent.object === node\n case 'Property':\n case 'PropertyDefinition':\n case 'MethodDefinition':\n return parent.key !== node || parent.computed\n // 私有名节点(normalizeAst 后 key.name 形如 '#x')不是自由标识符;\n // 防御 case:即使其子树残留 Identifier 也不应按自由引用判定。\n case 'PrivateIdentifier':\n return false\n case 'VariableDeclarator':\n return parent.id !== node\n case 'FunctionDeclaration':\n case 'FunctionExpression':\n case 'ArrowFunctionExpression':\n return !(parent.params ?? []).includes(node) && parent.id !== node\n case 'LabeledStatement':\n case 'BreakStatement':\n case 'ContinueStatement':\n return false\n case 'ImportSpecifier':\n case 'ImportDefaultSpecifier':\n case 'ImportNamespaceSpecifier':\n return false\n case 'CallExpression':\n case 'NewExpression':\n return parent.callee === node || (parent.arguments ?? []).includes(node)\n case 'TSAsExpression':\n case 'TSTypeAssertion':\n case 'TSNonNullExpression':\n case 'TSSatisfiesExpression':\n case 'ParenthesizedExpression':\n return true\n default:\n return true\n }\n}\n\n/**\n * 收集绑定模式(形参 / 解构 / `const` 声明左侧)里的**全部标识符名**。\n *\n * 单一实现:历史上 compile.ts / component.ts / render-body.ts 各抄一份,\n * 抄的过程已经开始漂移 —— 只有 render-body 那份处理 `TSParameterProperty`\n * (`constructor(private readonly x)`),其余两份会漏掉这类绑定名,\n * 漏掉的绑定在 D3 自由标识符判定里被当成「未知自由标识符」。\n * `TSParameterProperty` 分支对纯 JS 模式无害(该节点类型只可能来自 TS 形参)。\n */\nexport function collectPatternNames(pat: any, into: Set<string>): void {\n if (!pat) return\n switch (pat.type) {\n case 'Identifier':\n into.add(pat.name)\n break\n case 'ObjectPattern':\n for (const p of pat.properties ?? []) {\n if (p.type === 'RestElement') collectPatternNames(p.argument, into)\n else collectPatternNames(p.value ?? p.key, into)\n }\n break\n case 'ArrayPattern':\n for (const el of pat.elements ?? []) collectPatternNames(el, into)\n break\n case 'AssignmentPattern':\n collectPatternNames(pat.left, into)\n break\n case 'RestElement':\n collectPatternNames(pat.argument, into)\n break\n case 'TSParameterProperty':\n collectPatternNames(pat.parameter, into)\n break\n }\n}\n\n/** 静态成员/属性 key 取名字符串。 */\nexport function keyName(key: any): string | null {\n if (!key) return null\n if (key.type === 'Identifier') return key.name\n if (key.type === 'PrivateIdentifier') return '#' + key.name\n if (key.type === 'Literal' || key.type === 'StringLiteral') return String(key.value)\n return null\n}\n\n/* ══════════════════ 统一 AST 语义助手 ══════════════════\n *\n * 以下助手此前在多个 analyze 模块里各抄一份,抄的过程中已经开始漂移\n * (`unwrapExpr` 四份的包装类型集合各不相同、`thisChain` 两份对 PrivateIdentifier\n * 的处理不同)。因为编译器全程不跑 TS 类型检查,漂移不会报错,只会安静地给出\n * 不同的分析结果 —— 故统一到本文件,各模块改 import。\n */\n\n/** TS 包装/透明节点类型:解包后语义与内层表达式相同。 */\nconst TS_WRAPPER_TYPES = new Set([\n 'TSAsExpression', // x as T\n 'TSSatisfiesExpression', // x satisfies T\n 'TSNonNullExpression', // x!\n 'TSTypeAssertion', // <T>x(老式尖括号断言)\n 'TSInstantiationExpression', // f<T>() 的调用侧泛型\n 'ParenthesizedExpression', // (x)\n])\n\n/** 是否为 TS 包装/透明节点(`unwrapExpr` 会剥掉的那一类)。 */\nexport function isTsWrapper(node: any): boolean {\n return !!node && typeof node.type === 'string' && TS_WRAPPER_TYPES.has(node.type)\n}\n\n/**\n * 剥掉 TS 包装与括号节点,取可静态分析的本体。\n *\n * 类型集合取上述 6 种的**并集** —— 早期各副本只认其中一部分,导致\n * `f<T>()` / `<T>x` 这类写法在某些模块里解包失败、被误判为未知自由标识符。\n *\n * 循环守卫:只有当 `.expression` 确实是个节点时才前进,否则返回原节点。\n * (旧实现在 template-subs / template-extract 里写的是 `cur.expression ?? cur`,\n * 一旦遇到没有 `.expression` 的包装节点就会**死循环**。)\n */\nexport function unwrapExpr(node: any): any {\n let cur = node\n while (cur && typeof cur.type === 'string' && TS_WRAPPER_TYPES.has(cur.type)) {\n const inner = cur.expression\n if (!inner || typeof inner.type !== 'string') break\n cur = inner\n }\n return cur\n}\n\n/**\n * 装饰器的本地名:`@tag(\"x\")` / `@prop({...})` / `@computed` → `'tag'` / `'prop'` / `'computed'`。\n * 支持 `@ns.dec(...)` 形式(取属性名)。\n */\nexport function decoratorName(dec: any): string | null {\n const expr = dec?.expression ?? dec\n if (!expr) return null\n if (expr.type === 'CallExpression') {\n const callee = expr.callee\n if (callee?.type === 'Identifier') return callee.name\n if (callee?.type === 'MemberExpression' && callee.property?.type === 'Identifier') return callee.property.name\n return null\n }\n if (expr.type === 'Identifier') return expr.name\n return null\n}\n\n/** 类声明的基类名:`class A extends B` → `'B'`,`extends ns.B` → `'B'`;无基类返回 null。 */\nexport function superClassName(node: any): string | null {\n const sc = node?.superClass\n if (!sc) return null\n if (sc.type === 'Identifier') return sc.name\n if (sc.type === 'MemberExpression' && sc.property?.type === 'Identifier') return sc.property.name\n return null\n}\n\n/**\n * `this.a.b.c` → `['a','b','c']`;不是 this 链 / 含计算属性(`this[a]`)/ 属性名取不到\n * 时返回 null。空的 `this` 也返回 null(无字段可记)。\n *\n * 属性名走 `keyName`,因此 `#private` 字段带 `#` 前缀 —— 与模板侧\n * `template-extract` 的依赖键保持一致(旧实现有一份漏了前缀,会把\n * `this.#x` 与 `this.x` 混成同一个键)。\n */\nexport function thisChain(node: any): string[] | null {\n const chain: string[] = []\n let cur: any = node\n while (cur && (cur.type === 'MemberExpression' || cur.type === 'OptionalMemberExpression')) {\n if (cur.computed) return null // this[x] / a[x] → 动态访问\n const name = keyName(cur.property)\n if (!name) return null\n chain.unshift(name)\n cur = cur.object\n }\n if (!cur || cur.type !== 'ThisExpression') return null\n return chain.length ? chain : null\n}\n","/**\n * 组件识别与响应式字段提取。\n */\nimport type { ComponentAnalysis, ReactiveField, ReactiveKind } from '../types'\nimport type { ParsedFile } from '../utils/ast'\nimport { collectPatternNames, keyName, topLevelReturns } from '../utils/ast'\n\n/** 判断某个 import source 是否指向 compelem 本体。 */\nexport function isCompelemSource(source: string): boolean {\n // 1) `@compelem/*` 是独立子包,先排除——否则会被下面「路径含 compelem」的规则误判为本体\n if (/^@compelem\\//.test(source)) return false // @compelem/* 子包不算本体\n // 2) 包名 / 路径里含 `compelem`\n if (/(^|[/@])compelem([/@]|$)|compelem\\//.test(source)) return true\n // 3) 相对路径指向 src 入口(本仓库 dev 形态):**精确匹配**整串——\n // `../src/store`、`./srcfoo` 之类**不得**误判为本体(曾把相邻子目录当 compelem,\n // 触发 helper import 选错源)。\n if (\n source === './src' || source === '../src' ||\n source === './src/index' || source === '../src/index'\n ) return true\n // 4) 裸相对路径也可能重导出 compelem(如 '../common'),此处不放行,交由调用方二次确认\n return false\n}\n\n/**\n * 判断某个 import source 是否指向 **myfx**。\n */\nexport function isMyfxSource(source: string): boolean {\n return /(^|[/@])myfx([/@]|$)|myfx\\//.test(source)\n}\n\n/** 从 import 表里挑出 compelem 相关绑定:本地名 → 原始导入名。 */\nexport function collectCompelemImports(imports: ParsedFile['imports']): Map<string, string> {\n const out = new Map<string, string>()\n for (const [local, info] of imports) {\n if (!isCompelemSource(info.source)) continue\n out.set(local, info.imported)\n }\n return out\n}\n\n/** 收集模块级绑定名(含全部 import 本地名与顶层声明名)。 */\nexport function collectModuleBindings(parsed: ParsedFile): Set<string> {\n const out = new Set<string>()\n for (const local of parsed.imports.keys()) out.add(local)\n for (const stmt of parsed.program.body ?? []) {\n collectDeclNames(stmt, out)\n }\n return out\n}\n\n/** 从一条顶层语句里收集声明的名字(不进入函数体/类体)。 */\nfunction collectDeclNames(stmt: any, into: Set<string>) {\n if (!stmt || typeof stmt.type !== 'string') return\n const decl = stmt.type === 'ExportNamedDeclaration' || stmt.type === 'ExportDefaultDeclaration'\n ? stmt.declaration\n : stmt\n if (!decl) return\n switch (decl.type) {\n case 'VariableDeclaration':\n for (const d of decl.declarations ?? []) collectPatternNames(d.id, into)\n break\n case 'FunctionDeclaration':\n case 'ClassDeclaration':\n if (decl.id?.name) into.add(decl.id.name)\n break\n case 'TSEnumDeclaration':\n case 'TSInterfaceDeclaration':\n case 'TSTypeAliasDeclaration':\n if (decl.id?.name) into.add(decl.id.name)\n break\n }\n}\n\n/**\n * 收集**模块级 `const`** 的初始化器 AST:名字 → VariableDeclarator。\n *\n * 与 {@link collectModuleBindings} 的区别:后者只收名字(用于自由标识符放行),\n * 这里收**初始化器**,供模板静态片段折叠(`${CONST}`)判定「该标识符是不是一个\n * 模块级 `h` 标签模板常量」。\n *\n * 收窄到 `const` 是刻意的:`let`/`var` 可被重新赋值,折叠会把某次运行的值固化进\n * 产物,语义与源码不符。跨文件 import 不收 —— compileFile 是单文件纯函数。\n */\nexport function collectModuleConstInits(parsed: ParsedFile): Map<string, any> {\n const out = new Map<string, any>()\n for (const stmt of parsed.program.body ?? []) {\n const decl = stmt.type === 'ExportNamedDeclaration' || stmt.type === 'ExportDefaultDeclaration'\n ? stmt.declaration\n : stmt\n if (decl?.type !== 'VariableDeclaration' || decl.kind !== 'const') continue\n for (const d of decl.declarations ?? []) {\n if (d.id?.type === 'Identifier' && d.id.name && d.init) out.set(d.id.name, d)\n }\n }\n return out\n}\n\n/** 装饰器本地名与基类名的统一实现见 utils/ast(此前本文件与 conventions /\n * template-rules 各抄了一份,已漂移)。这里转出以维持既有 import 路径。 */\nimport { decoratorName, superClassName } from '../utils/ast'\nexport { decoratorName, superClassName }\n\n/** 提取 render() 方法的函数体与偏移。 */\nfunction extractRenderBody(node: any): { body: any; start: number; end: number } | null {\n for (const member of node.body?.body ?? []) {\n if (member.type !== 'MethodDefinition' && member.type !== 'PropertyDefinition') continue\n if (keyName(member.key) !== 'render') continue\n const fn = member.value\n if (!fn || (fn.type !== 'FunctionExpression' && fn.type !== 'ArrowFunctionExpression')) continue\n const body = fn.body\n if (!body || body.type !== 'BlockStatement') continue\n return { body: body.body, start: body.start + 1, end: body.end - 1 }\n }\n return null\n}\n\n/**\n * U5:单 member 遍历提取类信息——原 extractReactiveFields / extractMembers /\n * extractDepBodies / extractRenderBody 各自一遍类体,现合并为一趟循环。\n * 各块语义与原独立函数逐字一致(首个合法 render 胜出、@computed 字段不看 kind 等)。\n */\nexport interface ClassInfo {\n fields: Map<string, ReactiveField>\n /** `@query` / `@queryAll` 字段名(非响应式 DOM 查询属性,依赖提取按死条目记录) */\n queryFields: Set<string>\n methods: Set<string>\n getters: Set<string>\n /** 方法 / getter / 箭头字段的函数体(name → BlockStatement 节点或表达式体),供依赖提取内联扫描 */\n bodies: Map<string, any>\n render: { body: any; start: number; end: number } | null\n /** render 是表达式体(`render = () => h…`)—— 当前静态路径无法剥离/编译,显式 D0。 */\n renderInvalid: boolean\n cssVarsBody: any[] | null\n computedBodies: Map<string, any[]>\n}\n\n/**\n * compelem 导入名解析器:**本地名 → 导入原名**(`import { prop as p }` ⇒ `p` ⇒ `'prop'`)。\n *\n * ⚠️ 不得再用「导入名集合 + 本地名比对」的写法(`aliases.has(localName)`):\n * 本地名与导入原名只在**未取别名**时相等。`import { prop as p }` 下\n * `aliases.has('p')` 为假 ⇒ `@prop` 不被识别、类不被判为组件 ⇒ prop 静默退化成\n * 普通实例字段(运行时装饰器是 no-op,全程无任何报错兜底)。\n * 一律用解析器判「这个装饰器/基类名是不是 compelem 的 X」。\n */\nexport type ImportResolver = (local: string) => string | undefined\n\n/** 由 `collectCompelemImports` 的结果(本地名 → 导入原名)造解析器。 */\nexport function compelemResolver(imports: ReadonlyMap<string, string>): ImportResolver {\n return (local: string) => imports.get(local)\n}\n\nfunction extractClassInfo(node: any, resolve: ImportResolver): ClassInfo {\n const fields = new Map<string, ReactiveField>()\n const queryFields = new Set<string>()\n const methods = new Set<string>()\n const getters = new Set<string>()\n const bodies = new Map<string, any>()\n let render: { body: any; start: number; end: number } | null = null\n let renderInvalid = false\n let cssVars: any[] | null = null\n const computedBodies = new Map<string, any[]>()\n\n for (const member of node.body?.body ?? []) {\n const name = keyName(member.key)\n\n if (name) {\n // ---- 响应式字段(原 extractReactiveFields) ----\n const decs: string[] = (member.decorators ?? []).map(decoratorName).filter(Boolean) as string[]\n let kind: ReactiveKind | null = null\n for (const d of decs) {\n const imported = resolve(d)\n if (imported === 'prop') { kind = 'prop'; break }\n if (imported === 'state') { kind = 'state'; break }\n if (imported === 'computed') { kind = 'computed'; break }\n }\n if (kind) {\n fields.set(name, { name, kind })\n } else if (decs.some((d) => {\n const imported = resolve(d)\n return imported === 'query' || imported === 'queryAll'\n })) {\n // @query / @queryAll:非响应式 DOM 查询属性(依赖提取中按死条目记录,不参与根分级)\n // 必须走 resolve,别名导入(query as q)也要能识别。\n queryFields.add(name)\n }\n\n // ---- 方法/getter 名(原 extractMembers) ----\n if (member.type === 'MethodDefinition') {\n if (member.kind === 'get') getters.add(name)\n else methods.add(name)\n const fn = member.value\n if (fn?.body) bodies.set(name, fn.body)\n } else if (member.type === 'PropertyDefinition') {\n // 箭头函数字段也算方法\n const init = member.value\n if (init && (init.type === 'ArrowFunctionExpression' || init.type === 'FunctionExpression')) {\n methods.add(name)\n if (init.body) bodies.set(name, init.body)\n }\n }\n }\n\n // ---- render()(原 extractRenderBody;首个合法 render 胜出) ----\n if (\n !render &&\n (member.type === 'MethodDefinition' || member.type === 'PropertyDefinition') &&\n keyName(member.key) === 'render'\n ) {\n const fn = member.value\n if (fn && (fn.type === 'FunctionExpression' || fn.type === 'ArrowFunctionExpression')) {\n const body = fn.body\n if (body && body.type === 'BlockStatement') {\n render = { body: body.body, start: body.start + 1, end: body.end - 1 }\n renderInvalid = false\n } else if (!renderInvalid) {\n // 表达式体 render 运行期不会被 setup 消费;静默判 noView 会白屏,\n // 这里记录后由 analyzeFile 报 D0。\n renderInvalid = true\n }\n }\n }\n\n // ---- cssVars / @computed getter 体(原 extractDepBodies) ----\n if (member.type === 'MethodDefinition' && name) {\n const fn = member.value\n if (fn && (fn.type === 'FunctionExpression' || fn.type === 'ArrowFunctionExpression')) {\n const body = fn.body\n if (body && body.type === 'BlockStatement') {\n if (name === 'cssVars' && member.kind === 'get') {\n cssVars = body.body\n } else if (member.kind === 'get') {\n const gdecs: string[] = (member.decorators ?? []).map(decoratorName).filter(Boolean) as string[]\n if (gdecs.some((d) => resolve(d) === 'computed')) {\n computedBodies.set(name, body.body)\n }\n }\n }\n }\n }\n }\n return { fields, queryFields, methods, getters, bodies, render, renderInvalid, cssVarsBody: cssVars, computedBodies }\n}\n\n/** U5:extractClassInfo 按 class 节点记忆(同文件祖先在依赖提取中被多组件复用)。 */\nconst INFO_CACHE = new WeakMap<object, ClassInfo>()\n\n/** 取某 class 节点的 ClassInfo(WeakMap 记忆;resolve 为文件级常量,同文件命中安全)。 */\nexport function classInfoOf(node: any, resolve: ImportResolver): ClassInfo {\n const hit = INFO_CACHE.get(node)\n if (hit) return hit\n const info = extractClassInfo(node, resolve)\n INFO_CACHE.set(node, info)\n return info\n}\n\n/** U5:collectLocalClasses 结果按 ParsedFile 记忆(analyzeFile 与 compile.ts 各调一次,共享同一遍结果)。 */\nconst LOCAL_CLASSES_CACHE = new WeakMap<object, Map<string, any>>()\n\n/** 收集文件内全部 class 声明(本地名 → AST 节点),含 export 形态。继承链与约定检查共用。 */\nexport function collectLocalClasses(parsed: ParsedFile): Map<string, any> {\n const cached = LOCAL_CLASSES_CACHE.get(parsed as object)\n if (cached) return cached\n const localClasses = new Map<string, any>()\n for (const stmt of parsed.program.body ?? []) {\n if (stmt.type === 'ClassDeclaration' && stmt.id?.name) {\n localClasses.set(stmt.id.name, stmt)\n }\n if (stmt.type === 'ExportNamedDeclaration' && stmt.declaration?.type === 'ClassDeclaration') {\n localClasses.set(stmt.declaration.id.name, stmt.declaration)\n }\n if (stmt.type === 'ExportDefaultDeclaration' && stmt.declaration?.type === 'ClassDeclaration') {\n const n = stmt.declaration.id?.name ?? 'default'\n localClasses.set(n, stmt.declaration)\n }\n }\n LOCAL_CLASSES_CACHE.set(parsed as object, localClasses)\n return localClasses\n}\n\n/**\n * 类体是否带 compelem 家族装饰器(`@prop/@state/@computed/@query/@queryAll`)。\n *\n * 这是「该类是不是组件」的**精确判别器**:这些装饰器在运行时全是 no-op,\n * 只在编译期有意义 ⇒ 带它们的类必然意图是组件;反之不带它们的类\n * (`class LiveFieldMap extends Map` 之类)不可能是组件。\n */\nexport function hasCompelemFamilyDecorator(cls: any, resolve: ImportResolver): boolean {\n return (cls?.body?.body ?? []).some((m: any) =>\n (m.decorators ?? []).some((d: any) => resolve(decoratorName(d) ?? '') !== undefined),\n )\n}\n\n/** U5:collectMixinClasses 结果按 ParsedFile 记忆。 */\nconst MIXIN_CLASSES_CACHE = new WeakMap<object, any[]>()\n\n/**\n * 收集「mixin 工厂内」的 class 声明 —— **单独成列表,绝不混入 `localClasses`**。\n *\n * ## 为什么需要单独一套\n * `localClasses` 是**按类名**索引的,被 `deps-extract` / `conventions` / `component.ts`\n * 的 D0 拆分用于解析**同文件 super 继承链**。mixin 里的类既不与外部按名关联、\n * 也不在模块作用域,混进去会污染这些按名查找(同名遮蔽、深度计算偏移)。\n *\n * ## 收录条件(三者全满足,缺一不可)\n * 1. 位于**模块顶层函数**的函数体直接语句里(`export function mix(B) { class M extends B {} }`);\n * 不递归进任意嵌套(避免把方法体内的局部类、`if`/`for` 块内的类也收进来)\n * 2. 是 `ClassDeclaration`(**不是** `ClassExpression` —— TS 禁止在 class 表达式上写\n * 装饰器 TS1206,能带 `@prop` 的形态只有 class 声明,见 DESIGN「mixin 装饰器」)\n * 3. 类体带**至少一个 compelem 家族装饰器**(`@prop/@state/@computed/@query/@queryAll`)——\n * 这是精确判别器:`class LiveFieldMap extends Map` 之类无 compelem 装饰器,自动排除\n */\nexport function collectMixinClasses(parsed: ParsedFile, resolve: ImportResolver): any[] {\n const cached = MIXIN_CLASSES_CACHE.get(parsed as object)\n if (cached) return cached\n const out: any[] = []\n for (const stmt of parsed.program.body ?? []) {\n const decl =\n stmt.type === 'ExportNamedDeclaration' || stmt.type === 'ExportDefaultDeclaration'\n ? stmt.declaration\n : stmt\n if (decl?.type !== 'FunctionDeclaration' && decl?.type !== 'FunctionExpression') continue\n for (const inner of decl.body?.body ?? []) {\n const cls = inner?.type === 'ClassDeclaration' ? inner : undefined\n if (cls && cls.id?.name && hasCompelemFamilyDecorator(cls, resolve)) out.push(cls)\n }\n }\n MIXIN_CLASSES_CACHE.set(parsed as object, out)\n return out\n}\n\n// `classNodeOf` / `componentClassNode` 已于 2026-10-05 删除:它们是「取组件自身 class\n// AST 节点」的兼容包装(优先 `comp.cls`,回退 `localClasses.get(className)`),\n// 但 8 个调用点早已各自内联同一表达式(`conventions.ts:367`、`deps-extract.ts:287`、\n// `field-extract.ts:141/178`、`template-rules.ts:79/111`、`watch-extract.ts:270`、\n// `compile.ts:322`),全仓零调用。\n//\n// ⚠️ 内联时必须保留 `comp.cls ?? localClasses.get(comp.className)` 这个**双通道**:\n// 只按名查 `localClasses` 只收模块顶层的 `ClassDeclaration`,mixin 工厂内的函数作用域类\n// 按名查不到 → `field-extract` 等会拿到 undefined 而**静默不提取**。\n\n/**\n * 分析单个源文件,返回所有 compelem 组件类的信息。\n *\n * `extraFields` 用于合并基类字段(编译器单文件分析,跨文件继承由调用方\n * 通过 `componentIndex` 提供;本版本仅处理同文件继承 + 无继承两种)。\n */\nexport function analyzeFile(code: string, id: string, parsed: ParsedFile): ComponentAnalysis[] {\n const compelemImports = collectCompelemImports(parsed.imports)\n const resolve = compelemResolver(compelemImports)\n // 1) 先收集同文件里的 class 声明,建立「本地类名 → 是否 CompElem 子类」映射\n const localClasses = collectLocalClasses(parsed)\n // 1b) mixin 工厂内的 class 声明(单独列表,不进 localClasses —— 见 collectMixinClasses 注释)\n const mixinClasses = collectMixinClasses(parsed, resolve)\n\n const isSub = (cls: any, depth = 0): boolean => {\n if (depth > 8) return false\n const sup = superClassName(cls)\n if (!sup) return false\n // `superClassName` 给的是**本地名**,别名导入(`CompElem as CE`)须经导入表还原\n if (resolve(sup) === 'CompElem') return true\n const parent = localClasses.get(sup)\n if (parent) return isSub(parent, depth + 1)\n return false\n }\n\n const out: ComponentAnalysis[] = []\n const moduleBindings = collectModuleBindings(parsed)\n const moduleConstInits = collectModuleConstInits(parsed)\n // 顶层 class(按名索引)+ mixin class(函数作用域,按数组)统一成一份工作表处理\n const worklist: Array<{ className: string; cls: any; isMixin: boolean }> = [\n ...[...localClasses].map(([className, cls]) => ({ className, cls, isMixin: false })),\n ...mixinClasses.map((cls) => ({ className: cls.id.name, cls, isMixin: true })),\n ]\n for (const { className, cls, isMixin } of worklist) {\n // 装饰器本地名 → 导入原名(`@tag` 取别名时本地名不是 'tag')\n const decs: string[] = (cls.decorators ?? []).map(decoratorName).filter(Boolean) as string[]\n const importedDecs = new Set(decs.map((d) => resolve(d)))\n // 组件准入三选一:\n // 1) `isSub` —— super 链能在**本文件**内解析到 CompElem(最常见)\n // 2) `@tag` —— 显式声明要注册自定义元素\n // 3) **类体带 compelem 家族装饰器** —— 覆盖前两者都判不出的两类:\n // · mixin 工厂内的类(super 是形参)\n // · **跨文件基类**(super 在别的文件,如 `class FormControl extends AppearanceElem`)\n // 这类 super 解析不出 + 无 @tag ⇒ 不被识别为组件 ⇒ 其 @prop 装饰器\n // 从不剥离,而运行时 @prop 是 no-op ⇒ prop 静默退化成普通实例字段。\n // 判别器是精确的:家族装饰器运行时全 no-op,只在编译期有意义。\n const byDecorator = hasCompelemFamilyDecorator(cls, resolve)\n const sub = isSub(cls)\n if (!sub && !importedDecs.has('tag') && !byDecorator) continue\n /**\n * super 链不可知(mixin 形参 / 跨文件基类)⇒ 无 own render() 时走 skipInjection。\n *\n * 判据分两种:\n * - 家族装饰器(prop/state/computed/...):一定准入;\n * - @tag + super 在文件外:裸包装子类(如 `@tag(\"ce-editable\") class Editable extends Table`)\n * 也必须能继承基类视图;本地 super 链仍走 D0/D6/noView 规则。\n * 失败形态可诊断:基类无视图时 spread 为空,运行时按“未编译”报错,不会静默白屏。\n */\n // 家族装饰器始终可准入;@tag 只在“super 在文件外、无法判断基类是否有视图”时\n // 才允许走 skipInjection(裸 @tag 包装子类),本地链仍按 D0/D6/noView 规则处理。\n const tagSuper = superClassName(cls)\n const unknownSuperAdmitted =\n !sub && (byDecorator || (!!tagSuper && !localClasses.has(tagSuper) && importedDecs.has('tag')))\n\n const { fields, queryFields, methods, getters, bodies, render, renderInvalid, cssVarsBody, computedBodies } = classInfoOf(cls, resolve)\n const tagDec = (cls.decorators ?? []).find((d: any) => resolve(decoratorName(d) ?? '') === 'tag')\n let tagName: string | undefined\n if (tagDec) {\n const e = tagDec.expression\n if (e?.type === 'CallExpression' && e.arguments?.[0]) {\n const a = e.arguments[0]\n if (a.type === 'Literal' || a.type === 'StringLiteral') tagName = String(a.value)\n }\n }\n\n let staticReason: string | null = null\n let noView = false\n let skipInjection = false\n\n if (!render) {\n // D0 拆分:无 own render() 时,沿同文件继承链向上找;\n // - 链上有 render → skipInjection(不注入,继承父类 __ce_static__,静态字段经构造器原型链继承)\n // - 链终于 CompElem(其 render() 返回 null)→ noView: true 注入(无视图组件)\n // - 链终于未知跨文件基类 → D6 阻断(报错)\n // - **super 链不可知者(mixin 形参 / 家族装饰器或 @tag 准入的跨文件基类)\n // → 一律 skipInjection**(见下)\n const sup = superClassName(cls)\n if (isMixin || unknownSuperAdmitted) {\n // super 不可知 ⇒ 无法判断基类有没有 render:\n // · 判 skipInjection:字面量 spread 继承基类视图字段。基类有视图 → 继承到(正确);\n // 基类无视图 → spread 得到空,退化为「无静态视图」,DEV 报错,与未编译组件同路径。\n // · **绝不能判 noView**:noView 会跳过 Shadow DOM 创建;若基类其实有 render,\n // 组件将静默白屏(无报错)——这是最坏的失败形态。\n // · 也**不能**沿用 D6/D0 报错:跨文件基类与 mixin 在真实项目里是常态\n // (compelem-ui 的 FormControl/BaseInput/ControlBox 即是),阻断构建等于不可用。\n skipInjection = true\n } else if (!sup) {\n staticReason = 'D0: 无 render() 或 render 体不是 BlockStatement'\n } else if (resolve(sup) === 'CompElem') {\n noView = true\n } else if (localClasses.has(sup)) {\n // 同文件继承链:向上找首个有 render 的祖先\n let cur: any = cls\n let found = false\n let unknownCrossFile = false\n const seen = new Set<any>()\n while (cur && !seen.has(cur)) {\n seen.add(cur)\n const curSup = superClassName(cur)\n if (!curSup) break\n if (resolve(curSup) === 'CompElem') {\n // 链终于 CompElem:整条链上都没有 render(当前类无,祖先已在循环里逐个检查)\n found = false\n break\n }\n if (localClasses.has(curSup)) {\n const parent = localClasses.get(curSup)\n if (extractRenderBody(parent)) {\n found = true\n break\n }\n cur = parent\n continue\n }\n // 跨文件基类:无法判断是否有 render\n unknownCrossFile = true\n break\n }\n if (found) {\n skipInjection = true\n } else if (unknownCrossFile) {\n staticReason = `D6: 跨文件继承 render(基类 ${sup} 不在本文件)`\n } else {\n // 链终于 CompElem 且整条链无 render → 无视图组件\n noView = true\n }\n } else {\n staticReason = `D0: 无 render() 且非 CompElem 子类(基类 ${sup} 不在本文件)`\n }\n } else {\n const rets = topLevelReturns(render.body)\n if (rets.length === 0) staticReason = 'D4: render() 内没有顶层 return'\n else if (rets.length > 1) staticReason = `D5: render() 有 ${rets.length} 个顶层 return`\n }\n // 表达式体 render 没有可剥离的块体,setup 也不会调用它;静默判 noView 会白屏。\n if (renderInvalid) {\n staticReason = 'D0: render 必须是带块体的方法(表达式体 render 暂不支持)'\n noView = false\n skipInjection = false\n }\n\n out.push({\n className,\n cls,\n start: cls.start,\n end: cls.end,\n bodyStart: cls.body?.start ?? -1,\n tagName,\n fields,\n queryFields,\n ownMethods: methods,\n ownGetters: getters,\n bodies,\n hasRender: !!render,\n renderBody: render?.body ?? null,\n renderBodyStart: render?.start ?? -1,\n renderBodyEnd: render?.end ?? -1,\n cssVarsBody,\n computedBodies,\n staticReason,\n noView,\n skipInjection,\n isMixin: isMixin || unknownSuperAdmitted,\n compelemImports,\n moduleBindings,\n moduleConstInits,\n })\n }\n void code\n void id\n return out\n}\n","/**\r\n * 模板插值里允许出现的**全局白名单**\r\n *\r\n * 判据:**浏览器/JS 平台真实存在的全局** 一律收录;不收的只有「不存在的名字」(拼错的\r\n * 本地变量、未 import 的模块成员)。D3 的目的是抓「自由标识符拼错 / 忘记 import」,\r\n * 不是抓「用了平台 API」—— 后者运行期完全合法,收窄白名单只会制造硬失败。\r\n */\r\nexport const KNOWN_GLOBALS: ReadonlySet<string> = new Set([\r\n // 值类型与构造\r\n 'Object', 'Array', 'String', 'Number', 'Boolean', 'Symbol', 'BigInt', 'RegExp', 'Date',\r\n 'Map', 'Set', 'WeakMap', 'WeakSet', 'WeakRef', 'FinalizationRegistry', 'Promise',\r\n 'ArrayBuffer', 'SharedArrayBuffer', 'DataView', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray',\r\n 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array',\r\n 'BigInt64Array', 'BigUint64Array',\r\n 'Error', 'TypeError', 'RangeError', 'SyntaxError', 'ReferenceError', 'EvalError', 'URIError',\r\n 'AggregateError', 'Proxy', 'Reflect', 'Intl',\r\n // 字面量与纯函数\r\n 'undefined', 'null', 'true', 'false', 'NaN', 'Infinity',\r\n 'Math', 'JSON', 'isNaN', 'isFinite', 'parseInt', 'parseFloat',\r\n 'encodeURI', 'decodeURI', 'encodeURIComponent', 'decodeURIComponent',\r\n 'escape', 'unescape', 'structuredClone',\r\n // 平台 / DOM\r\n 'console', 'window', 'document', 'globalThis', 'navigator', 'location', 'history',\r\n 'localStorage', 'sessionStorage', 'performance', 'crypto', 'devicePixelRatio',\r\n 'fetch', 'Headers', 'Request', 'Response', 'FormData', 'Blob', 'File', 'FileReader',\r\n 'URL', 'URLSearchParams', 'WebSocket', 'Worker', 'EventSource', 'Notification', 'indexedDB',\r\n 'AbortController', 'AbortSignal', 'Event', 'CustomEvent', 'EventTarget', 'MessageChannel',\r\n 'MessagePort', 'BroadcastChannel',\r\n // DOM 节点 / 元素\r\n 'Node', 'NodeList', 'NamedNodeMap', 'HTMLCollection', 'DocumentFragment', 'ShadowRoot',\r\n 'Element', 'HTMLElement', 'SVGElement', 'MathMLElement', 'Text', 'Comment',\r\n 'HTMLInputElement', 'HTMLTextAreaElement', 'HTMLSelectElement', 'HTMLTemplateElement',\r\n 'HTMLSlotElement', 'HTMLAnchorElement', 'HTMLImageElement', 'HTMLButtonElement',\r\n 'HTMLLabelElement', 'HTMLFormElement', 'HTMLOptionElement', 'HTMLCanvasElement',\r\n 'HTMLDialogElement', 'HTMLTableElement', 'HTMLDetailsElement', 'HTMLLIElement',\r\n 'HTMLUListElement', 'HTMLOListElement', 'HTMLDivElement', 'HTMLSpanElement',\r\n 'HTMLStyleElement', 'HTMLScriptElement', 'HTMLVideoElement', 'HTMLAudioElement',\r\n 'HTMLMediaElement', 'HTMLIFrameElement', 'HTMLUnknownElement',\r\n // 平台对象 / 度量\r\n 'customElements', 'ElementInternals', 'CSS', 'CSSStyleSheet', 'CSSStyleDeclaration',\r\n 'CSSRule', 'CSSRuleList', 'CSSMediaRule', 'CSSSupportsRule', 'CSSKeyframesRule',\r\n 'DOMRect', 'DOMRectReadOnly', 'DOMRectList', 'DOMTokenList', 'DOMException',\r\n 'DOMParser', 'XMLSerializer', 'Image', 'Audio', 'Option',\r\n 'Animation', 'KeyframeEffect', 'DocumentTimeline',\r\n 'TextEncoder', 'TextDecoder', 'atob', 'btoa',\r\n 'getComputedStyle', 'matchMedia', 'requestAnimationFrame', 'cancelAnimationFrame',\r\n 'requestIdleCallback', 'cancelIdleCallback',\r\n 'ResizeObserver', 'ResizeObserverEntry', 'ResizeObserverSize',\r\n 'IntersectionObserver', 'IntersectionObserverEntry', 'MutationObserver', 'MutationRecord',\r\n 'PerformanceObserver', 'PerformanceEntry',\r\n 'setTimeout', 'clearTimeout', 'setInterval', 'clearInterval', 'queueMicrotask',\r\n // window 上可直接裸调的方法(不收录 focus/blur/stop/find/moveTo/resizeTo:\r\n // 这些词太容易与本地函数重名,收录反而会吞掉真正的拼写错误)\r\n 'scroll', 'scrollTo', 'scrollBy', 'alert', 'confirm', 'prompt', 'print', 'open', 'close',\r\n])\r\n\r\n/**\r\n * 上述全局中**不纯**的子集:取值依赖外部状态 / 时钟,静态依赖映射无法归因\r\n * → 引用它们的表达式整体归入「常脏」(任一视图更新都重算,与全量求值行为一致)。\r\n */\r\nexport const IMPURE_GLOBALS: ReadonlySet<string> = new Set([\r\n 'Date', 'console', 'window', 'document', 'globalThis', 'navigator', 'location', 'history',\r\n 'localStorage', 'sessionStorage', 'performance', 'crypto', 'fetch', 'Math', 'JSON',\r\n 'Event', 'CustomEvent', 'EventTarget', 'MessageChannel',\r\n // 读取浏览器/注册表等外部可变状态:结果不随本组件信号变化,只能常脏\r\n 'customElements', 'devicePixelRatio', 'indexedDB', 'matchMedia', 'getComputedStyle',\r\n])\r\n","/**\r\n * 模板形态分析。\r\n *\r\n * 本模块做两件事:\r\n * 1. **D7 违规检测**:模板插值位置不得「直接嵌套」另一个模板(禁止写法)。\r\n * 2. (后续 B 步骤)静态解析模板 HTML 结构,产出 html / updatePointMetas / skipVarIdx。\r\n *\r\n * ## D7 为什么必须禁(背景)\r\n *\r\n * 模板解析遇到嵌套在插值里的 Template 会**就地 splice 展开**,\r\n * 使 `varIndex` 编号不再与模板的 quasis 下标线性对应:\r\n *\r\n * ```ts\r\n * // 会 splice → 编号非线性\r\n * h`<div>${h`<span>${a}</span>`} ${b}</div>`\r\n * // 不会 splice → 编号线性\r\n * h`<div>${ifTrue(c, () => h`<span>${a}</span>`)} ${b}</div>`\r\n * ```\r\n *\r\n * 禁止前者后,`varIndex` 变纯线性递增 → 编译器可以「一个 quasis 下标 ↔ 一个更新点」\r\n * 直接生成扁平取值代码(C 步骤的前提)。\r\n *\r\n * ## 判定边界:为什么「指令回调里的模板」不算嵌套\r\n *\r\n * 关键在**求值时机**。模板字面量求值时,`${}` 里的插值表达式会被立刻求值并放进\r\n * `Template.vars`;而指令回调是**未被调用的函数**,其体内的模板要到 executor 运行时\r\n * 才求值,压根进不了 `vars`。因此:\r\n *\r\n * - `${h`...`}` / `${cond ? h`...` : ''}` → 插值一求值就产生 Template 实例 → 命中\r\n * - `${ifTrue(c, () => h`...`)}` → 插值是 DirectiveInstance → 不命中\r\n *\r\n * 判定规则因此是:**从插值位置出发,不穿过任何函数边界就能到达 `h` 模板 → 违规。**\r\n */\r\nimport type { ComponentAnalysis } from '../types'\r\n\r\n/** 插值位置上允许「穿透」继续向内检查的表达式类型。 */\r\nconst PASSTHROUGH = new Set([\r\n 'ConditionalExpression', // cond ? h`` : ''\r\n 'LogicalExpression', // cond || h``\r\n 'SequenceExpression', // (a, h``)\r\n])\r\n\r\n/** 函数边界:越过它就离开了当前模板的插值结构。 */\r\nconst FN_BOUNDARY = new Set([\r\n 'ArrowFunctionExpression',\r\n 'FunctionExpression',\r\n 'FunctionDeclaration',\r\n])\r\n\r\nexport interface TemplateIssue {\r\n /** 违规模板在源码中的起始/结束偏移 */\r\n start: number\r\n end: number\r\n /** 违规插值表达式的偏移 */\r\n exprStart: number\r\n exprEnd: number\r\n message: string\r\n}\r\n\r\n/**\r\n * 从插值表达式出发,判断能否「不穿过函数边界」就到达一个 h 模板。\r\n * @returns 命中的 h 模板节点,无则 null\r\n */\r\nexport function reachesBareTemplate(node: any, hAliases: Set<string>, depth = 0): any | null {\r\n if (!node || typeof node.type !== 'string') return null\r\n if (depth > 32) return null\r\n\r\n // 函数边界:回调体内的模板不属于本模板的插值结构\r\n if (FN_BOUNDARY.has(node.type)) return null\r\n\r\n if (node.type === 'TaggedTemplateExpression') {\r\n const tag = node.tag\r\n if (tag?.type === 'Identifier' && hAliases.has(tag.name)) return node\r\n // 非 h 的标签模板(罕见):其内部插值继续查\r\n for (const e of node.quasi?.expressions ?? []) {\r\n const hit = reachesBareTemplate(e, hAliases, depth + 1)\r\n if (hit) return hit\r\n }\r\n return null\r\n }\r\n\r\n // 裸模板字符串里再嵌 h 模板:`${`x${h``}`}`\r\n if (node.type === 'TemplateLiteral') {\r\n for (const e of node.expressions ?? []) {\r\n const hit = reachesBareTemplate(e, hAliases, depth + 1)\r\n if (hit) return hit\r\n }\r\n return null\r\n }\r\n\r\n // 函数调用:实参里的 h 模板会被立刻求值;\r\n // 指令回调由上面的 FN_BOUNDARY 拦掉,故此处下钻 arguments 不会误报。\r\n if (node.type === 'CallExpression' || node.type === 'NewExpression') {\r\n for (const a of node.arguments ?? []) {\r\n const hit = reachesBareTemplate(a, hAliases, depth + 1)\r\n if (hit) return hit\r\n }\r\n return null\r\n }\r\n\r\n if (PASSTHROUGH.has(node.type)) {\r\n for (const key of Object.keys(node)) {\r\n if (key === 'type' || key === 'start' || key === 'end') continue\r\n const c = node[key]\r\n if (Array.isArray(c)) {\r\n for (const x of c) {\r\n const hit = reachesBareTemplate(x, hAliases, depth + 1)\r\n if (hit) return hit\r\n }\r\n } else if (c && typeof c === 'object' && typeof c.type === 'string') {\r\n const hit = reachesBareTemplate(c, hAliases, depth + 1)\r\n if (hit) return hit\r\n }\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\n/** 找出源码里 h 标签函数的全部别名(通常就是 `h`,import 时可改名)。 */\r\nexport function collectTemplateTagAliases(comp: ComponentAnalysis): Set<string> {\r\n const out = new Set<string>()\r\n for (const [local, imported] of comp.compelemImports) {\r\n if (imported === 'h') out.add(local)\r\n }\r\n return out\r\n}\r\n\r\n/** 判断节点是否是一个 h`` 模板。 */\r\nfunction isHTemplate(node: any, hAliases: Set<string>): boolean {\r\n if (!node || node.type !== 'TaggedTemplateExpression') return false\r\n const tag = node.tag\r\n return !!tag && tag.type === 'Identifier' && hAliases.has(tag.name)\r\n}\r\n\r\n/**\r\n * U5:检查单个 h`` 模板节点的全部插值(D7),把违规追加到 out。\r\n * analyzeRender 内联 D7 检查(renderBody 单 walk)与 param-defaults 子树扫描共用。\r\n */\r\nexport function d7IssuesAt(node: any, hAliases: Set<string>, out: TemplateIssue[]): void {\r\n for (const expr of node.quasi?.expressions ?? []) {\r\n const hit = reachesBareTemplate(expr, hAliases)\r\n if (hit) {\r\n out.push({\r\n start: node.start,\r\n end: node.end,\r\n exprStart: expr.start,\r\n exprEnd: expr.end,\r\n message:\r\n 'D7: 模板插值位置禁止直接嵌套另一个 h`` 模板;' +\r\n '请改用 ifTrue / ifElse / forEach 等指令包裹(回调内的模板不进入 vars)',\r\n })\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * U5:在子树内收集全部 D7 违规(DFS 前序,与 collectTemplateIssues 单遍语义一致)。\r\n * analyzeRender 用它扫描「主 scan 不进入」的函数参数默认值区域,保持覆盖对等。\r\n * ⚠️ 不 return 于 h`` 节点:指令回调里的模板自身插值同样要检查(继续下钻)。\r\n */\r\nexport function collectIssuesInSubtree(\r\n node: any,\r\n hAliases: Set<string>,\r\n out: TemplateIssue[],\r\n seen?: WeakSet<object>,\r\n): void {\r\n const s = seen ?? new WeakSet<object>()\r\n const visit = (n: any): void => {\r\n if (!n || typeof n !== 'object' || typeof n.type !== 'string') return\r\n if (s.has(n)) return\r\n s.add(n)\r\n if (isHTemplate(n, hAliases)) d7IssuesAt(n, hAliases, out)\r\n for (const key of Object.keys(n)) {\r\n if (key === 'type' || key === 'start' || key === 'end') continue\r\n const c = n[key]\r\n if (Array.isArray(c)) for (const x of c) visit(x)\r\n else if (c && typeof c === 'object' && typeof c.type === 'string') visit(c)\r\n }\r\n }\r\n visit(node)\r\n}\n","/**\n * render() 函数体的依赖提取与结构分析。\n *\n * 这是编译器最关键的一层。核心规则(已由 DEPENDENCY-MODEL.md 的 7/7 实测确认):\n *\n * 1. 只有「响应式字段白名单」内的成员访问(`this.x`)才推入依赖收集列表。\n * `this.someMethod` / `this.slots` / `this.inputRef` 普通访问不推入。\n * 2. 深层路径(`this.obj.deep`)推 `obj.deep`;根对象推 `obj`。\n * 3. `@computed` 只推入自身属性名,不展开其内部依赖。\n * 4. 指令实参的作用域归属:\n * - `ifElse(cond, a, b)` 的 `cond` → 调用方作用域(主视图)\n * - `forEach(list, keyFn, tmplFn)` 的 `list`/`keyFn` → 调用方作用域\n * - 指令的**模板回调体**(`a` / `b` / `tmplFn`)→ 子视图(per-UpdatePoint)\n */\nimport type { ComponentAnalysis } from '../types'\nimport { addDepPath, collectPatternNames, isFreeIdentifierRef, keyName } from '../utils/ast'\nimport { KNOWN_GLOBALS } from '../utils/globals'\nimport {\n collectIssuesInSubtree,\n collectTemplateTagAliases,\n d7IssuesAt,\n type TemplateIssue,\n} from './template'\n\n/** compelem 内置指令名集合(用于识别「模板回调实参」的位置)。 */\nexport const COMpelem_DIRECTIVES = new Set([\n 'bind', 'show', 'model', 'classes', 'styles',\n 'forEach', 'ifTrue', 'ifElse', 'when', 'slot', 'html',\n])\n\n/** 指令实参中,哪些下标是「模板回调」(其函数体属于子视图)。导出供 template-subs 分区。 */\nexport const TEMPLATE_ARG_INDEX: Record<string, number[] | 'rest-after-0'> = {\n ifTrue: [1],\n ifElse: [1, 2],\n forEach: [2],\n slot: [0],\n when: 'rest-after-0',\n}\n\ninterface ScanCtx {\n comp: ComponentAnalysis\n /** 当前扫描作用域:main = 主视图,sub = 某个指令的模板回调体 */\n inSub: boolean\n /** 主视图依赖收集 */\n mainDeps: Set<string>\n /** 子视图依赖:指令「节点标识」→ 路径集合。用回调节点的 start 偏移做标识(回调唯一) */\n subDeps: Map<number, Set<string>>\n /** 子视图所属回调节点 start(inSub 时有效) */\n subKey: number\n /** 遇到的阻断原因(D 系列:静态分析无法保证正确性) */\n blockers: string[]\n /** 已访问节点,防止 AST 节点上的意外回指造成无限递归 */\n seen: WeakSet<object>\n /**\n * 当前词法作用域内已绑定的标识符(形参、局部变量、模块级声明)。\n * 出现在此集合里的 Identifier 不是「自由标识符」,不触发 D3。\n */\n bound: Set<string>\n /** U5:h 标签别名(D7 检查 + 主模板命中识别) */\n hAliases: Set<string>\n /** U5:D7 违规收集(原 collectTemplateIssues 独立一遍,现并入本 scan——renderBody 单 walk) */\n issues: TemplateIssue[]\n /** 当前所在函数嵌套深度(0 = render 顶层;主模板 h`` 只在 0 层可命中) */\n fnDepth: number\n /** 可选 sink:主模板 h`` 节点(供 extractMainTemplate 免重扫) */\n sinks?: { mainHits: any[] }\n}\n\n/**\n * 把一条 `this.a.b.c` 链还原为字段路径。\n *\n * 从**最外层** MemberExpression 出发向内回溯;返回 `['a','b','c']`,\n * 非 this 起始或含 computed 访问时返回 null。\n *\n * 统一实现在 utils/ast#thisChain。\n */\nimport { thisChain } from '../utils/ast'\n\n/** 记录一条依赖到当前作用域。 */\nfunction record(ctx: ScanCtx, path: string[]) {\n const target = ctx.inSub ? (ctx.subDeps.get(ctx.subKey) ?? new Set<string>()) : ctx.mainDeps\n addDepPath(target, path)\n if (ctx.inSub) ctx.subDeps.set(ctx.subKey, target)\n}\n\n/**\n * 扫描函数体,递归处理指令。\n *\n * `nodes` 为语句数组(非单个表达式),保证只扫当前函数体的顶层内容。\n */\nfunction scan(ctx: ScanCtx, nodes: any[]) {\n for (const stmt of nodes) scanNode(ctx, stmt, null)\n}\n\n/** 收集一个函数节点的形参名。 */\nfunction collectParams(fn: any, into: Set<string>) {\n for (const p of fn.params ?? []) collectPatternNames(p, into)\n}\n\n/** 解构/简单绑定模式的标识符名收集统一在 utils/ast#collectPatternNames(本文件曾是唯一处理\n * TSParameterProperty 的那份副本,现已收敛)。 */\n\n/**\n * U5:函数参数子树的 D7 扫描。\n *\n * 主 scan 的 isFn 分支只收集形参名(collectParams),不下钻 params——\n * 而原 collectTemplateIssues 是通用全量下钻(含参数默认值)。\n * 为保持 D7 覆盖对等,这里对每个 param 整棵子树跑一遍与原 visit 等价的收集。\n */\nfunction scanParamsD7(ctx: ScanCtx, params: any[]): void {\n for (const p of params ?? []) collectIssuesInSubtree(p, ctx.hAliases, ctx.issues)\n}\n\n/** 收集函数体顶层(不下钻嵌套函数)的所有局部声明名。 */\nexport function collectLocals(bodyNodes: any[], into: Set<string>) {\n const stack = [...bodyNodes]\n while (stack.length) {\n const n = stack.pop()\n if (!n || typeof n.type !== 'string') continue\n if (\n n.type === 'FunctionDeclaration' ||\n n.type === 'FunctionExpression' ||\n n.type === 'ArrowFunctionExpression'\n ) {\n // 嵌套函数自身的名字对当前作用域可见,但其内部声明不可见\n if (n.type === 'FunctionDeclaration' && n.id?.name) into.add(n.id.name)\n continue\n }\n if (n.type === 'VariableDeclaration') {\n for (const d of n.declarations ?? []) collectPatternNames(d.id, into)\n }\n if (n.type === 'ClassDeclaration' && n.id?.name) into.add(n.id.name)\n for (const key of Object.keys(n)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const c: any = n[key]\n if (Array.isArray(c)) {\n for (const x of c) if (x && typeof x.type === 'string') stack.push(x)\n } else if (c && typeof c === 'object' && typeof c.type === 'string') {\n stack.push(c)\n }\n }\n }\n}\n\n/** 在受限的 bound 集合下执行 fn,返回后恢复原集合。 */\nfunction withBound<T>(ctx: ScanCtx, extra: Iterable<string>, fn: () => T): T {\n const added: string[] = []\n for (const n of extra) {\n if (!ctx.bound.has(n)) {\n ctx.bound.add(n)\n added.push(n)\n }\n }\n try {\n return fn()\n } finally {\n for (const n of added) ctx.bound.delete(n)\n }\n}\n\nfunction scanNode(ctx: ScanCtx, node: any, parent: any) {\n if (!node || typeof node !== 'object' || typeof node.type !== 'string') return\n // 防环:AST 节点可能带非枚举回指;同时避免同一子树被重复扫描\n if (!ctx.seen) ctx.seen = new WeakSet<object>()\n if (ctx.seen.has(node)) return\n ctx.seen.add(node)\n\n // --- U5:D7 内联检查 + 主模板节点收集(原 collectTemplateIssues / extractMainTemplate 各自一遍的 walk,现并入本 scan) ---\n if (node.type === 'TaggedTemplateExpression' && node.tag?.type === 'Identifier' && ctx.hAliases.has(node.tag.name)) {\n d7IssuesAt(node, ctx.hAliases, ctx.issues)\n if (ctx.fnDepth === 0 && ctx.sinks) ctx.sinks.mainHits.push(node)\n }\n\n // --- super 表达式:0.31 起 render() 内一律不支持 ---\n // `super` 在 AST 里是独立的 `Super` 节点(不是 ThisExpression)。\n //\n // 为什么不静默放过:取值表达式会被内联进 `function(__comp, __d){…}` —— 那里没有\n // home-object,`super` 是**语法错误**;而模板插值位(如 `${super.render()}`)不报错,\n // 只会渲染出字面量。两种都是「构建通过、运行时坏掉」,必须在构建期拦下。\n if (node.type === 'Super') {\n ctx.blockers.push(\n 'E-SUPER-IN-TEMPLATE: render() 内不支持 super 表达式。' +\n '基类请只保留 prop/state/computed/@watch/样式,视图下沉到叶子组件;' +\n '需要复用的静态视图片段用模块级常量 + `${html(CONST)}`(同文件会折进建树序列)。',\n )\n return\n }\n\n // --- 响应式字段访问:this.x / this.x.y.z ---\n // 只在「链的最外层」处理一次:多层链的内层节点(this.obj、this.obj.deep)由父节点统一记录,\n // 避免重复与路径截断。判定条件不能用 `node.object === ThisExpression`(那只覆盖单层),\n // 必须靠「父节点不是把本节点当 object 的 MemberExpression」+ 链回溯到 this。\n if (node.type === 'MemberExpression' || node.type === 'OptionalMemberExpression') {\n const parentIsMember =\n parent &&\n (parent.type === 'MemberExpression' || parent.type === 'OptionalMemberExpression') &&\n parent.object === node\n if (!parentIsMember) {\n // 整条链的最外层;thisChain 内部会校验链根是否为 ThisExpression\n const chain = thisChain(node)\n if (chain !== null) {\n const root = chain[0]\n const field = ctx.comp.fields.get(root)\n if (field) {\n record(ctx, chain)\n } else if (ctx.comp.ownMethods.has(root)) {\n // 自有方法值不可变 → 不推入依赖,也不报阻断。\n } else {\n // 普通 getter(以及跨文件基类的未知成员)。\n //\n // 普通 getter 的链按依赖记录:getter 内部可能读响应式字段,静态推不出,\n // 但取值表达式内联后每轮 effect 都会重新求值 → 依赖在执行期动态建立\n // (getter 读 `this.__s.a.value` 即建链),由动态订阅兜住正确性。\n // 派生 getter 是生态里最常见的写法,不该因静态推不出而放弃静态管线。\n record(ctx, chain)\n }\n // 自有方法调用(this.goto、this.fmt)不推入依赖,也不报阻断:值不可变、不影响正确性。\n } else if (node.object?.type === 'ThisExpression' && node.computed) {\n // this[expr] 动态访问:静态推不出依赖,但内联产物里表达式按源改写 this→rc\n // 后每轮 effect 求值,取值经注入访问器读 __s.*.value 动态建链(build-vars 侧\n // classifyThisChain 归入 uncertain/常脏)。静态推不出只意味着「无法预过滤」,\n // 正确性由 per-point effect 的动态 track + 求值期建链兜住。\n }\n }\n }\n\n // --- 调用 compelem 指令:区分「实参」与「模板回调」 ---\n if (node.type === 'CallExpression' && node.callee?.type === 'Identifier') {\n const fnName = node.callee.name\n const importedAs = ctx.comp.compelemImports.get(fnName)\n const isDirective = !!importedAs && COMpelem_DIRECTIVES.has(importedAs)\n\n if (isDirective) {\n const tmplIdx = TEMPLATE_ARG_INDEX[importedAs]\n const args: any[] = node.arguments ?? []\n args.forEach((arg: any, i: number) => {\n const isTemplate =\n tmplIdx === 'rest-after-0' ? i >= 1 : Array.isArray(tmplIdx) && tmplIdx.includes(i)\n if (isTemplate && (arg.type === 'ArrowFunctionExpression' || arg.type === 'FunctionExpression')) {\n const key = arg.start\n const prev = ctx.subKey\n ctx.subKey = key\n const wasSub = ctx.inSub\n ctx.inSub = true\n // 回调形参与局部变量属于子视图作用域\n const names = new Set<string>()\n collectParams(arg, names)\n scanParamsD7(ctx, arg.params)\n if (arg.body?.type === 'BlockStatement') collectLocals(arg.body.body, names)\n ctx.fnDepth++\n withBound(ctx, names, () => {\n if (arg.body?.type === 'BlockStatement') scan(ctx, arg.body.body)\n else scanNode(ctx, arg.body, arg)\n })\n ctx.fnDepth--\n ctx.inSub = wasSub\n ctx.subKey = prev\n return\n }\n // 非模板实参:属于调用方作用域\n scanNode(ctx, arg, node)\n })\n // 不继续按通用规则下钻(已手动处理实参)\n return\n }\n\n // 其他函数调用:若 callee 是自由标识符且不在 import/指令白名单 → D3\n if (isFreeIdentifierRef(node.callee, node)) {\n const local = node.callee.name\n if (!ctx.bound.has(local) && !ctx.comp.compelemImports.has(local) && !isKnownGlobal(local)) {\n ctx.blockers.push(`D3: render() 内调用未知自由标识符 ${local}()`)\n }\n }\n }\n\n // --- 自由标识符引用(非调用位)--- D3\n if (node.type === 'Identifier' && isFreeIdentifierRef(node, parent)) {\n const local = node.name\n if (!ctx.bound.has(local) && !ctx.comp.compelemImports.has(local) && !isKnownGlobal(local)) {\n ctx.blockers.push(`D3: render() 内出现未知自由标识符 ${local}`)\n }\n }\n\n // 通用下钻。\n //\n // 嵌套函数(非指令模板回调的那些,如 `list.find(it => it.id === this.x)` 里的箭头函数)\n // 必须继续下钻:其中的 `this.x` 读取同样会被推入依赖。这里只把它们的形参/局部变量\n // 并入 bound 作用域后递归。\n const isFn =\n node.type === 'ArrowFunctionExpression' ||\n node.type === 'FunctionExpression' ||\n node.type === 'FunctionDeclaration'\n if (isFn) {\n const names = new Set<string>()\n collectParams(node, names)\n scanParamsD7(ctx, node.params)\n if (node.body?.type === 'BlockStatement') collectLocals(node.body.body, names)\n ctx.fnDepth++\n withBound(ctx, names, () => {\n if (node.body?.type === 'BlockStatement') scan(ctx, node.body.body)\n else scanNode(ctx, node.body, node)\n })\n ctx.fnDepth--\n return\n }\n\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const child = node[key]\n if (Array.isArray(child)) {\n for (const c of child) scanNode(ctx, c, node)\n } else if (child && typeof child === 'object' && typeof child.type === 'string') {\n scanNode(ctx, child, node)\n }\n }\n}\n\n// 全局白名单见 utils/globals.ts(与 build-vars 共用同一份,避免两处名单分叉)\nfunction isKnownGlobal(name: string): boolean {\n return KNOWN_GLOBALS.has(name)\n}\n\n/** 主视图依赖提取结果。 */\nexport interface RenderAnalysis {\n /** 主视图依赖路径(对应 ViewDepMap) */\n viewDeps: string[]\n /** 子视图依赖:回调节点 start 偏移 → 路径列表 */\n subViewDeps: Map<number, string[]>\n /** 阻断原因列表(空表示通过)。非空 ⇒ `assertStaticAnalysis` 抛 `StaticAnalysisError`。 */\n blockers: string[]\n /**\n * 硬性违规(当前只有 D7:模板内直接嵌套模板)。\n *\n * 与 `blockers` 都是「不可编译」,二者的区别只在**归因**:`blockers` 是\n * 「静态推不出结论」(D0/D3/D4/D5/D6),`errors` 是「写法违反约束,用户可修」\n * (D7)—— 故 errors 带源码区间,供构建期定位到具体位置。\n */\n errors: TemplateIssue[]\n}\n\n/** 对单个组件的 render() 做依赖分析。 */\nexport function analyzeRender(comp: ComponentAnalysis, sinks?: { mainHits: any[] }): RenderAnalysis {\n const bound = new Set<string>(comp.moduleBindings ?? [])\n //render 顶层局部声明(const/let/var/function)不是「未知自由标识符」——与嵌套函数\n //(isFn 分支 collectLocals)和指令回调(collectParams/collectLocals)同规则。\n //D3 只拦真正未声明的标识符;模板插值引用到的局部变量由 filterFree\n //给出准确原因(buildvars-e2e §E 的正则已预留该分类)。\n if (Array.isArray(comp.renderBody)) collectLocals(comp.renderBody, bound)\n const ctx: ScanCtx = {\n comp,\n inSub: false,\n mainDeps: new Set<string>(),\n subDeps: new Map<number, Set<string>>(),\n subKey: -1,\n blockers: [],\n seen: new WeakSet<object>(),\n bound,\n hAliases: collectTemplateTagAliases(comp),\n issues: [],\n fnDepth: 0,\n sinks,\n }\n if (comp.renderBody) scan(ctx, comp.renderBody)\n\n // 去重阻断原因\n const blockers = [...new Set(ctx.blockers)]\n const subViewDeps = new Map<number, string[]>()\n for (const [k, v] of ctx.subDeps) subViewDeps.set(k, [...v])\n\n return {\n viewDeps: [...ctx.mainDeps],\n subViewDeps,\n blockers,\n errors: ctx.issues,\n }\n}\n","import { collectCompelemImports } from './component'\nimport { COMpelem_DIRECTIVES } from './render-body'\nimport { collectPatternNames, unwrapExpr, type ParsedFile } from '../utils/ast'\n\n/**\n * 模板方法内联预变换(source-level pre-pass)\n *\n * 新编译器要求结构指令回调的表达式体/顶层 return **直接**是 h`` 模板——\n * `forEach(rows, r => this.renderRow(r))` 这类「回调间接返回 Template」的写法\n * 无法静态提取子视图(template-subs 需要 DOM 克隆源编译期可见)。\n *\n * 本 pass 在主分析管线之前做纯文本改写,把符合「唯一 h`` 直接返回」形状的\n * 本类方法调用内联为等价回调:\n *\n * r => this.renderRow(r) → (r, row = r, field = row.field) => { ...; return h`...` }\n * ifTrue(c, this.header()) → ifTrue(c, () => { return h`...` })\n *\n * 关键设计——**方法形参与尾随简单 const 一律注入为回调体的前置 const(prelude 注入)**:\n *\n * r => this.renderRow(r) → (r) => { const row = r; const field = row.field; ...; return h`...` }\n * ifTrue(c, this.header()) → ifTrue(c, () => { return h`...` })\n *\n * 运行期子视图工厂按**位置**传参:`(rc, nodes, __ceGet, __ceDep, ov, v, k, i)` ——\n * 第 6~8 位是结构指令的 item 槽位(cond 路径 `valueAry ?? [0]` 灌 `cell.value`)。\n * 曾试过把绑定提升为「带默认值形参」:绑定名恰好落在 item 槽位上,运行期实参\n * 覆盖默认值 ⇒ 实参静默丢失(`data-tab=\"0\"` / 分组标签显示 0,2026-10-14 实锤,\n * 爆炸半径 = 全部调用形态 site)。注入为 prelude const 后,绑定成为子模板工厂体\n * 内的局部量,运行期多余实参无人接收即被忽略,零碰撞。\n *\n * 嵌套子候选(体内 ifTrue/forEach 的模板回调)引用这些绑定时走 **C1 闭包提升**\n * (`__fx` 词法捕获):compile.ts 的祖先白名单 = 祖先形参 ∪ **祖先 prelude 声明名**\n * —— 本设计依赖该白名单扩展,两者必须同批生效。\n *\n * 间接链(A 返回 this.B())递归拉平:各层绑定按「形参 const → 本层 prelude →\n * 尾随 const」的原始声明序拼进同一回调体,内层绑定的初始化器可引用外层绑定。\n *\n * 语义保持论证:\n * - 实参只求值一次(const 初始化 = 原实参源码,求值时机与调用点等价);\n * - this 链不变(回调内 this 与方法调用时的 this 同为组件实例);\n * - 方法体源码原样搬运;方法保留在类上(内联后成死代码,无害)。\n *\n * 不匹配模板形状(0/多个 h``、非直接 return、形参含解构、名字碰撞等)的\n * 方法调用**原样保留**,交由主管线的静态检查给出原有诊断——本 pass 绝不\n * 扩大报错面。\n */\n\nexport interface Edit {\n start: number\n end: number\n text: string\n}\n\ninterface MethodInfo {\n /** 形参名列表(仅支持纯 Identifier 形参);null = 形参模式不支持 */\n params: string[] | null\n /** 方法体节点(BlockStatement 或箭头字段的表达式体) */\n bodyNode: any\n /** async/generator 不能内联(会丢 await/yield 语义) */\n async: boolean\n}\n\ninterface BodyShape {\n /** 不可提升的 prelude 前缀源码(可空) */\n preludeSrc: string\n /** 从 prelude 尾部提升的简单 const(const X = expr;)→ 回调体前置 const */\n lifts: Array<{ name: string; initSrc: string; init: any }>\n /** return 的实参(h`` 节点,或 this 方法调用节点——由调用方递归拉平) */\n retArg: any\n}\n\n/** 单次内联的结果:块体内部语句(绑定 const + prelude + 内层链) */\ninterface InlineResult {\n inner: string\n}\n\nconst MAX_DEPTH = 8\n\n/**\n * import 解析上下文:本文件的两个「识别 compelem 侧符号」判定都必须在**本地名 →\n * 原始导入名**映射后再判断——否则 dev 形态(`from '../src/index'`)与改名导入\n * (`import { h as html }` / `import { ifTrue as t }`)会让本 pass 静默不生效,\n * 把可内联的写法退回主管线的报错。\n */\ninterface ImportCtx {\n /** h 标签函数的本地别名(仅 import 绑定,`const h2 = h` 级别名不做) */\n hLocals: Set<string>\n /** compelem 本体绑定:本地名 → 原始导入名 */\n compelem: Map<string, string>\n}\n\n/** callee 本地名是否解析为 compelem 内置指令(改名导入后同样识别)。 */\nfunction isDirectiveRef(ctx: ImportCtx, calleeName: string): boolean {\n const imported = ctx.compelem.get(calleeName)\n return !!imported && COMpelem_DIRECTIVES.has(imported)\n}\n\n/**\n * 通用 AST 子树遍历(跳过元数据键;不去重——调用方自行控制范围)。\n * visit 返回 true = **不再下钻该节点子树**(site 命中/已入列编辑区间用)。\n */\nfunction walk(node: any, visit: (n: any) => boolean | void): void {\n if (!node || typeof node.type !== 'string') return\n if (visit(node) === true) return\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'loc' || key === 'parent') continue\n const c = node[key]\n if (Array.isArray(c)) for (const x of c) walk(x, visit)\n else if (c && typeof c === 'object' && typeof c.type === 'string') walk(c, visit)\n }\n}\n\n/** `this.name(...)` / `this.#name(...)` → 方法名;否则 null */\nfunction thisMethodCalleeName(node: any): string | null {\n if (!node || node.type !== 'CallExpression') return null\n const callee = node.callee\n if (!callee || callee.type !== 'MemberExpression' || callee.computed) return null\n if (!callee.object || callee.object.type !== 'ThisExpression') return null\n const p = callee.property\n if (p.type === 'Identifier') return p.name\n if (p.type === 'PrivateIdentifier' || p.type === 'PrivateName') return '#' + p.name\n return null\n}\n\n/** 从 class 节点收集本类方法/箭头字段:name → MethodInfo */\nfunction collectMethods(cls: any): Map<string, MethodInfo> {\n const map = new Map<string, MethodInfo>()\n for (const member of cls.body?.body ?? []) {\n let name: string | null = null\n let fnNode: any = null\n if (member.type === 'MethodDefinition') {\n const k = member.key\n if (k?.type === 'Identifier') name = k.name\n else if (k?.type === 'PrivateIdentifier' || k?.type === 'PrivateName') name = '#' + k.name\n fnNode = member.value\n } else if (member.type === 'PropertyDefinition') {\n const k = member.key\n if (k?.type === 'Identifier') name = k.name\n else if (k?.type === 'PrivateIdentifier' || k?.type === 'PrivateName') name = '#' + k.name\n fnNode = member.value\n }\n if (!name || !fnNode) continue\n if (fnNode.type !== 'FunctionExpression' && fnNode.type !== 'ArrowFunctionExpression') continue\n const params: string[] = []\n let ok = true\n for (const p of fnNode.params ?? []) {\n if (p.type === 'Identifier') params.push(p.name)\n else {\n ok = false\n break\n }\n }\n map.set(name, { params: ok ? params : null, bodyNode: fnNode.body, async: !!fnNode.async || !!fnNode.generator })\n }\n return map\n}\n\n/** 尾随可提升 const:`const X = <expr>;`(单声明符、纯 Identifier、有初始值) */\nfunction liftableConst(s: any): { name: string; init: any } | null {\n if (s?.type !== 'VariableDeclaration' || s.kind !== 'const') return null\n if (s.declarations?.length !== 1) return null\n const d = s.declarations[0]\n if (d.id?.type !== 'Identifier' || !d.init) return null\n return { name: d.id.name, init: d.init }\n}\n\n/**\n * 校验方法体是否「唯一 h`` 直接返回」形状(单层,不递归):\n * 块体 = [任意 prelude 语句][若干尾随简单 const][return <模板>];表达式体 = 模板。\n * retArg 为 h`` 节点,或 this 方法调用节点(间接链由 buildChain 递归拉平)。\n */\nfunction bodyShapeOf(code: string, bodyNode: any, ctx: ImportCtx): BodyShape | null {\n if (!bodyNode) return null\n const isH = (n: any): boolean =>\n n?.type === 'TaggedTemplateExpression' && n.tag?.type === 'Identifier' && ctx.hLocals.has(n.tag.name)\n\n if (bodyNode.type !== 'BlockStatement') {\n const expr = unwrapExpr(bodyNode)\n if (isH(expr) || thisMethodCalleeName(expr)) return { preludeSrc: '', lifts: [], retArg: expr }\n return null\n }\n\n const stmts: any[] = bodyNode.body ?? []\n const retIdxs = stmts.map((s, i) => (s.type === 'ReturnStatement' ? i : -1)).filter((i) => i >= 0)\n if (retIdxs.length !== 1) return null\n const retIdx = retIdxs[0]\n if (retIdx !== stmts.length - 1) return null\n const arg = unwrapExpr(stmts[retIdx].argument)\n if (!arg) return null\n if (!isH(arg) && !thisMethodCalleeName(arg)) return null\n\n // 尾随简单 const 提升:从 return 前一条语句向前收集,遇第一条不可提升语句停止\n const lifts: Array<{ name: string; initSrc: string; init: any }> = []\n let cut = retIdx // stmts[cut..retIdx-1] 为可提升段\n for (let i = retIdx - 1; i >= 0; i--) {\n const lc = liftableConst(stmts[i])\n if (!lc) break\n lifts.unshift({ name: lc.name, initSrc: code.slice(lc.init.start, lc.init.end), init: lc.init })\n cut = i\n }\n const preludeSrc = cut > 0 ? code.slice(stmts[0].start, stmts[cut - 1].end) : ''\n return { preludeSrc, lifts, retArg: arg }\n}\n\n/**\n * AST 级引用检查:子树内是否存在指向 `name` 的**真引用**(Identifier)。\n * 非计算成员属性(`row.field` 的 field)、非计算对象键/方法名不是引用;\n * 对象 shorthand(`{ row }`)的 value 是引用。文本级单词匹配会把属性位置\n * 误判为引用(如 `const field = row.field`),故用 AST 判定。\n */\nfunction referencesIdent(node: any, name: string, skipKey = false): boolean {\n if (!node || typeof node.type !== 'string') return false\n if (node.type === 'Identifier' && node.name === name && !skipKey) return true\n const skip = new Set<string>(['type', 'start', 'end', 'loc', 'parent'])\n if (node.type === 'MemberExpression' && !node.computed) skip.add('property')\n if ((node.type === 'Property' || node.type === 'MethodDefinition') && !node.computed) skip.add('key')\n for (const key of Object.keys(node)) {\n if (skip.has(key)) continue\n const c: any = node[key]\n if (Array.isArray(c)) {\n for (const x of c) if (referencesIdent(x, name)) return true\n } else if (c && typeof c === 'object' && typeof (c as any).type === 'string' && referencesIdent(c, name)) {\n return true\n }\n }\n return false\n}\n\n/**\n * 沿间接链拉平 `this.method(args)` 调用,把各层形参/prelude-const 注入为\n * 回调体前置 const(外→内;内层绑定初始化器可引用外层绑定),生成块体内部语句。\n * 不满足形状/参数约束时返回 null(调用方保留原源码)。\n *\n * @param existingNames 外层回调已有形参名(碰撞检测与去重用)\n */\nfunction buildChain(\n code: string,\n methods: Map<string, MethodInfo>,\n callNode: any,\n ctx: ImportCtx,\n visited: Set<string>,\n depth: number,\n existingNames: readonly string[],\n): InlineResult | null {\n const name = thisMethodCalleeName(callNode)\n if (!name || depth > MAX_DEPTH || visited.has(name)) return null\n const m = methods.get(name)\n if (!m || !m.params || m.async) return null\n const args: any[] = callNode.arguments ?? []\n if (args.length !== m.params.length) return null\n if (args.some((a) => a.type === 'SpreadElement')) return null\n const shape = bodyShapeOf(code, m.bodyNode, ctx)\n if (!shape) return null\n\n const visited2 = new Set(visited)\n visited2.add(name)\n const taken = new Set<string>(existingNames)\n const lines: string[] = []\n\n // 本层方法形参 → 前置 const。护栏:\n // - 实参是与形参同名的裸标识符 → 不新增(方法体内对该名的引用自然落到\n // 外层同名变量上,取值一致);否则 `const r = r` 式重声明/TDZ;\n // - 形参名与外层已绑定名重名但实参不是同名标识符 → 值可能不同,放弃;\n // - 实参表达式引用了该形参名(如 r.length)→ const 初始化前引用,放弃。\n for (let i = 0; i < m.params.length; i++) {\n const p = m.params[i]\n const argSrc = code.slice(args[i].start, args[i].end)\n const argId = unwrapExpr(args[i])\n if (argId?.type === 'Identifier' && argId.name === p) continue\n if (taken.has(p)) return null\n if (referencesIdent(args[i], p)) return null\n lines.push(`const ${p} = ${argSrc};`)\n taken.add(p)\n }\n\n lines.push(shape.preludeSrc)\n\n // 本层 prelude 尾随 const → 原位 const(保持原始声明序:形参绑定 → prelude\n // → 尾随 const;初始化器可引用更早绑定与 prelude 局部量)\n for (const lc of shape.lifts) {\n if (taken.has(lc.name)) return null\n if (referencesIdent(lc.init, lc.name)) return null\n lines.push(`const ${lc.name} = ${lc.initSrc};`)\n taken.add(lc.name)\n }\n\n if (shape.retArg.type === 'TaggedTemplateExpression') {\n const tplSrc = inlineRegion(code, methods, shape.retArg, ctx, visited2, depth + 1, taken)\n lines.push(`return ${tplSrc};`)\n } else {\n // 间接链:递归拉平内层调用。绑定按原始声明序拼接(内层初始化器可引用\n // 外层绑定);执行序 = 本层绑定 → 本层 prelude → 本层尾随 const → 内层\n const sub = buildChain(code, methods, shape.retArg, ctx, visited2, depth + 1, [...taken])\n if (!sub) return null\n lines.push(sub.inner)\n }\n\n return { inner: lines.filter((s) => s.trim()).join('\\n') }\n}\n\n/**\n * 在「模板节点」子树内收集并应用嵌套 site 的编辑,返回改写后的模板源码。\n * site 形态:\n * - 回调体:`() => this.fn(x)` → `(x0) => { const x = x0; ...; return h... }`\n * - 指令模板实参:`ifTrue(c, this.fn())` → `ifTrue(c, () => { return h... })`\n */\nfunction inlineRegion(\n code: string,\n methods: Map<string, MethodInfo>,\n regionNode: any,\n ctx: ImportCtx,\n visited: Set<string>,\n depth: number,\n outerNames?: ReadonlySet<string>,\n): string {\n const edits: Edit[] = []\n\n walk(regionNode, (n) => {\n // 已入列编辑的区间内不再下钻:外层编辑文本已整体替换该区间(指令实参\n // buildChain / 回调 site),内层再入列会产生重叠编辑、应用时偏移失效\n if (n !== regionNode && typeof n.start === 'number' && typeof n.end === 'number') {\n if (edits.some((e) => n.start >= e.start && n.end <= e.end)) return true\n }\n // site 仅限箭头函数:FunctionExpression 改写成箭头会静默丢失\n // 自定义 thisArg 调用(fn.call(x))与 arguments 语义\n if (n.type === 'ArrowFunctionExpression' && n !== regionNode) {\n const site = arrowSite(code, methods, n, ctx, visited, depth, outerNames)\n // site 命中后不下钻该子树:嵌套 site 由替换文本内递归 inlineRegion 处理,\n // 这里再入列只会产生与外层编辑重叠的内层编辑\n if (site) {\n edits.push(site)\n return true\n }\n return\n }\n if (n.type === 'CallExpression') {\n const callee = n.callee\n if (callee?.type === 'Identifier' && isDirectiveRef(ctx, callee.name)) {\n for (const arg of n.arguments ?? []) {\n if (thisMethodCalleeName(arg)) {\n const r = buildChain(code, methods, arg, ctx, visited, depth, [])\n if (r) edits.push({ start: arg.start, end: arg.end, text: `() => {\\n${r.inner}\\n}` })\n }\n }\n }\n }\n })\n\n if (!edits.length) return code.slice(regionNode.start, regionNode.end)\n edits.sort((a, b) => b.start - a.start)\n const base = regionNode.start\n let out = code.slice(base, regionNode.end)\n // 重叠保护(与顶层 inlineTemplateMethodsWithEdits 一致):start 降序应用时\n // 跳过与已应用编辑重叠的条目,防止源码被静默拼接损坏\n let lastStart = Number.POSITIVE_INFINITY\n for (const e of edits) {\n if (e.end > lastStart) continue\n out = out.slice(0, e.start - base) + e.text + out.slice(e.end - base)\n lastStart = e.start\n }\n return out\n}\n\n/** 回调体 site:整只箭头替换为「原形参 + prelude 注入块体」形态 */\nfunction arrowSite(\n code: string,\n methods: Map<string, MethodInfo>,\n fn: any,\n ctx: ImportCtx,\n visited: Set<string>,\n depth: number,\n outerNames?: ReadonlySet<string>,\n): Edit | null {\n // 仅限箭头函数 site(见 inlineRegion 注释:FunctionExpression 改写会丢\n // thisArg / arguments 语义)\n if (fn.type !== 'ArrowFunctionExpression') return null\n const body = fn.body\n if (!body || fn.async || fn.generator) return null\n const existing: string[] = (fn.params ?? []).map((p: any) => code.slice(p.start, p.end))\n // 碰撞白名单必须收**全部绑定名**:解构(`({row})`)/默认值/rest 形参的绑定\n // 不在 `p.name` 上,漏收会让 prelude 注入与之重名 → 重复声明 SyntaxError\n const boundNames = new Set<string>()\n for (const p of fn.params ?? []) collectPatternNames(p, boundNames)\n const names = [...(outerNames ?? []), ...boundNames]\n\n let callNode: any = null\n if (body.type !== 'BlockStatement') {\n if (thisMethodCalleeName(body)) callNode = body\n } else {\n const stmts: any[] = body.body ?? []\n if (stmts.length === 1 && stmts[0].type === 'ReturnStatement') {\n const arg = unwrapExpr(stmts[0].argument)\n if (arg && thisMethodCalleeName(arg)) callNode = arg\n }\n }\n if (!callNode) return null\n const r = buildChain(code, methods, callNode, ctx, visited, depth, names)\n if (!r) return null\n const params = existing.join(', ')\n return { start: fn.start, end: fn.end, text: `(${params}) => {\\n${r.inner}\\n}` }\n}\n\n/**\n * 入口:扫描模块内所有含 render() 的 class,把 render 体(含嵌套回调/指令实参)\n * 里的 this 方法调用按形状内联。\n *\n * 返回**改写后的源码**与**原始坐标下的非重叠编辑**(升序)。调用方保留原始\n * 源码坐标,用于诊断/sourcemap 映射,并把编辑交给 MagicString 统一应用。\n */\nexport function inlineTemplateMethodsWithEdits(\n code: string,\n parsed: ParsedFile,\n): { code: string; edits: Edit[] } {\n // compelem 本体绑定表(含 dev 形态 '../src/index' 与改名导入)+ h 的本地别名集合\n // (`const h2 = h` 级别名不做,v1 仅 import 绑定)\n const compelem = collectCompelemImports(parsed.imports)\n const hLocals = new Set<string>()\n for (const [local, imported] of compelem) {\n if (imported === 'h') hLocals.add(local)\n }\n const ctx: ImportCtx = { hLocals, compelem }\n if (!hLocals.size) return { code, edits: [] }\n\n const classes: any[] = []\n walk(parsed.program, (n) => {\n if (n.type === 'ClassDeclaration' || n.type === 'ClassExpression') classes.push(n)\n })\n\n const edits: Edit[] = []\n for (const cls of classes) {\n const methods = collectMethods(cls)\n const render = methods.get('render')\n if (!render || !render.bodyNode || render.bodyNode.type !== 'BlockStatement') continue\n // render 体内:回调体 site + 指令实参 site(直接编辑入列;嵌套 site 由\n // inlineRegion 在方法模板替换文本内递归处理)\n edits.push(...collectRenderEdits(code, methods, render.bodyNode, ctx))\n }\n if (!edits.length) return { code, edits: [] }\n\n edits.sort((a, b) => b.start - a.start)\n const applied: Edit[] = []\n let out = code\n let lastStart = Number.POSITIVE_INFINITY\n for (const e of edits) {\n if (e.end > lastStart) continue // 重叠保护(site 互不嵌套,防御性跳过)\n out = out.slice(0, e.start) + e.text + out.slice(e.end)\n applied.push(e)\n lastStart = e.start\n }\n applied.sort((a, b) => a.start - b.start)\n return { code: out, edits: applied }\n}\n\n/** 兼容旧 API:只返回改写后的源码。compile.ts 用 WithEdits 版本保留坐标映射。 */\nexport function inlineTemplateMethods(code: string, parsed: ParsedFile): string {\n return inlineTemplateMethodsWithEdits(code, parsed).code\n}\n\n/** render 体内的顶层 site 收集 */\nfunction collectRenderEdits(\n code: string,\n methods: Map<string, MethodInfo>,\n renderBody: any,\n ctx: ImportCtx,\n): Edit[] {\n const edits: Edit[] = []\n walk(renderBody, (n) => {\n // 已入列编辑的区间内不再下钻(同 inlineRegion:外层编辑整体替换该区间,\n // 内层再入列会产生重叠编辑)\n if (typeof n.start === 'number' && typeof n.end === 'number') {\n if (edits.some((e) => n.start >= e.start && n.end <= e.end)) return true\n }\n // site 仅限箭头函数(FunctionExpression 改写会丢 thisArg / arguments 语义)\n if (n.type === 'ArrowFunctionExpression') {\n const e = arrowSite(code, methods, n, ctx, new Set(), 0)\n if (e) {\n edits.push(e)\n return true // site 命中后不下钻该子树\n }\n return\n }\n if (n.type === 'CallExpression') {\n const callee = n.callee\n if (callee?.type === 'Identifier' && isDirectiveRef(ctx, callee.name)) {\n for (const arg of n.arguments ?? []) {\n if (thisMethodCalleeName(arg)) {\n const r = buildChain(code, methods, arg, ctx, new Set(), 0, [])\n if (r) edits.push({ start: arg.start, end: arg.end, text: `() => {\\n${r.inner}\\n}` })\n }\n }\n }\n }\n })\n return edits\n}\n","/**\r\n * 静态分析校验闸门(D-rules)—— **不合规即报错,不产出「凑合能跑」的产物**。\r\n *\r\n * ## 架构前提\r\n *\r\n * 基于signal 模型的 compelem **必须依赖编译器编译后执行**:\r\n * 值从哪来、何时更新、依赖怎么建,全部由编译期产物的 `pointEffects` / `fx` /\r\n * `subCells` 决定。运行时**没有**「解析 `render()` + 解释执行」的回退路径。\r\n *\r\n * 因此当静态分析无法保证正确性(D 系列命中)时,唯一正确的做法是\r\n * **编译期报错**。若放行一个「凑合能跑」的产物,运行时的表现只有两种:\r\n * ① `__ce_static__.buildTemplate` 缺失 → 组件静默渲染成空白;\r\n * ② 依赖漏建 → DOM 不更新,且**没有任何报错**。\r\n * 两种都比构建失败难查一个数量级。\r\n *\r\n * 只有两种结果:**通过**,或**抛错**。\r\n *\r\n * | 规则 | 含义 | 处理 |\r\n * |---|---|---|\r\n * | D0 | 无 render() 或 render 体不是 BlockStatement | 报错 |\r\n * | D3 | 自由标识符(不在 import / 模块级声明 / 词法作用域内) | 报错 |\r\n * | D4 | render() 无顶层 return | 报错 |\r\n * | D5 | render() 有多个顶层 return | 报错 |\r\n * | D6 | 跨文件继承 render(基类不在本文件) | 报错 |\r\n * | D7 | 模板插值位置直接嵌套 h`` 模板(可修的写法违规) | 报错 |\r\n * | D8 | render() 顶层 return 不是 h`` 的直接包装(条件/短路/逗号/函数包装会丢条件) | 报错 |\r\n *\r\n * 动态成员访问(D1)与访问非响应式 getter(D2):内联产物每轮求值 + 动态建链兜住,\r\n * 不需要拒绝。\r\n *\r\n * ## 错误如何被消费\r\n *\r\n * 两条路径都是**抛异常**:\r\n * - **API `compileFile`**:`assertStaticAnalysis` / 模板 codegen 命中即抛\r\n * `StaticAnalysisError`,不返回产物。\r\n * - **Vite 插件**(`vite.ts`):`compileFile` 抛出的异常由 Rollup 的 transform\r\n * 钩子直接冒泡为构建错误,同样阻断。因此 `CompileResult.diagnostics` 里\r\n * **不含**任何静态分析失败条目 —— 到达那里的组件必然是通过的。\r\n *\r\n */\r\nimport type { ComponentAnalysis } from '../types'\r\nimport type { RenderAnalysis } from './render-body'\r\n\r\n/**\r\n * 静态分析闸门:汇总单个组件的结论,命中任何一条即抛 `StaticAnalysisError`。\r\n *\r\n * 无返回值 —— 只有「通过」与「抛错」两种结局(见本文件头 §架构前提)。\r\n */\r\nexport function assertStaticAnalysis(comp: ComponentAnalysis, ra: RenderAnalysis): void {\r\n const reasons: string[] = []\r\n if (comp.staticReason) reasons.push(comp.staticReason)\r\n reasons.push(...ra.blockers)\r\n // D7 命中的模板其 vars 编号非线性,编译期无法可靠生成扁平取值代码 → 同样不可编译\r\n for (const e of ra.errors) reasons.push(e.message)\r\n if (reasons.length) {\r\n throw new StaticAnalysisError(comp.className, [...new Set(reasons)], ra.errors)\r\n }\r\n}\r\n\r\n/**\r\n * 静态分析未通过。`name` 让它在堆栈里一眼可辨。 */\r\nexport class StaticAnalysisError extends Error {\r\n readonly className: string\r\n readonly reasons: string[]\r\n readonly errors: RenderAnalysis['errors']\r\n\r\n constructor(className: string, reasons: string[], errors: RenderAnalysis['errors'] = []) {\r\n super(\r\n `[compelem] 组件 ${className} 未通过静态分析,必须修:` +\r\n reasons.map((r) => `\\n · ${r}`).join(''),\r\n )\r\n this.name = 'StaticAnalysisError'\r\n this.className = className\r\n this.reasons = reasons\r\n this.errors = errors\r\n }\r\n}\r\n","/**\r\n * @compelem/compiler — 类型定义\r\n */\r\n\r\n/**\r\n * debug 分块产物的整行注释前缀:`//////// …… <标签>`(纯注释、不改行为)。产物默认按块生成,无开关。\r\n */\r\nexport const DEBUG_DIV = '////////////////////////////////////'\r\n\r\n/** 一次建树的返回结构:主 buildTemplate 与 subViews 元素同形。 */\r\nexport interface BuiltTemplateResult {\r\n fragment: any\r\n ups: any[]\r\n emptyEvents?: Record<number, string[]>\r\n /** 文档序元素+文本节点(与 nodeSn 对齐;运行时免 collectNodes 回扫) */\r\n nodes?: any[]\r\n updateSns?: number[]\r\n /** 从 fragment 根取节点的 childNodes 下标链(运行时 O(1) 定位,免 collectNodes) */\r\n updatePaths?: number[][]\r\n}\r\n\r\n/** 一个结构指令回调的子视图产物(`subViews[subId]`)。 */\r\nexport interface CompiledSubView {\r\n buildTemplate?: (this: any) => BuiltTemplateResult\r\n pointEffects?: any[]\r\n fx?: any[]\r\n}\r\n\r\n/**\r\n * 编译器注入到组件类上的静态成员\r\n */\r\nexport interface CompiledStatic {\r\n /**\r\n * 静态视图产物。与 `noView` 构成**互斥二选一**,两者皆无会被运行时判为\r\n * 「未编译」并抛错(`CompElem.ts` setup 的第三分支)。\r\n *\r\n * ⚠️ 所以**缺席不代表无视图**:缺席是错误态,专留给「插件没跑 / 该有视图却没编出来」。\r\n * 无视图组件必须由编译器显式写 `noView: true`。\r\n */\r\n buildTemplate?: (this: any) => BuiltTemplateResult\r\n /**\r\n * 结构指令模板回调的子视图 codegen:`__subId` → 独立 buildTemplate + fx/pointEffects。\r\n * 运行时结构指令经 provenance / `fn.__subId` 查表消费;缺失按构建期报错处理。\r\n */\r\n subViews?: Record<number, CompiledSubView>\r\n /** prop 定义表(沿构造器原型链浅替换合并后的**完整**表) */\r\n props?: Record<string, any>\r\n /** state 定义表(同上,合并语义) */\r\n states?: Record<string, any>\r\n /** `@computed` getter 函数外提(装饰器与成员被剥离);仅 devtools 元数据消费 */\r\n computedGetters?: Record<string, () => any>\r\n /** `@watch` 产物:每个 watch 一个 effect 工厂,setup 期逐条 `effect(factory(this))` */\r\n watchEffects?: Array<(comp: any) => () => void>\r\n /** `cssVars` 的响应式 effect 工厂:工厂体内直接读 `rc.__s.<k>.value` 建依赖 */\r\n cssEffect?: (comp: any) => () => void\r\n /**\r\n * 值点(属性/文本/指令)per-point effect 工厂表。\r\n * 数值条目 = `fx` 下标(同一工厂源码在产物里只 emit 一份),其余为工厂本体。\r\n */\r\n pointEffects?: Array<number | ((rc: any, nodes: any[], ...params: any[]) => () => void)>\r\n /** 逐实例产物工厂表(指令实例 / 事件 handler / ref 等);下标 = `up.ux` */\r\n fx?: any[]\r\n /**\r\n * 无视图组件标记:render() 不存在 / 返回 null / 继承链终点为 CompElem(其\r\n * `render()` 返回 null)。注入后运行时不创建 Shadow DOM,仅支持 HOST/GLOBAL 样式。\r\n *\r\n * ⚠️ 与 `buildTemplate` 互斥,且**必须有** —— 缺席不等于无视图(见上)。\r\n * 唯一豁免:继承链经 spread 从父类继承而来(`skipInjection`),以及\r\n * `CompElem` 自身声明的本字段(运行时基类兜底,非编译器产物)。\r\n */\r\n noView?: boolean\r\n}\r\n\r\n/**\r\n * `@watch` 的**分析期**条目(`analyze/watch-extract.ts` 产出)。\r\n *\r\n * 注意:它**不是**产物的一部分 —— 编译进产物的是 `watchEffects` 工厂数组,\r\n * 编译完成后本条目即丢弃。保留本类型是因为 generateBuildVars 要读 `extras`。\r\n */\r\nexport interface WatchEntry {\r\n name: string\r\n sources: string[]\r\n deep?: boolean\r\n immediate?: boolean\r\n once?: boolean\r\n /** 宿主成员是否为 static(决定 effect 里取 `rc.constructor` 还是 `rc`) */\r\n isStatic?: boolean\r\n}\r\n\r\n/** 响应式字段类别,用于判定「该成员是否会被推入依赖收集列表」。 */\r\nexport type ReactiveKind = 'prop' | 'state' | 'computed'\r\n\r\n/** 组件内一个响应式成员的信息。 */\r\nexport interface ReactiveField {\r\n name: string\r\n kind: ReactiveKind\r\n}\r\n\r\n/** 一个组件的完整静态分析结果。 */\r\nexport interface ComponentAnalysis {\r\n className: string\r\n /**\r\n * 该组件的 class AST 节点本体。\r\n *\r\n * 直接随分析结果下发节点本身:按名反查 `localClasses` 只覆盖**模块顶层**的\r\n * `ClassDeclaration`,mixin 工厂内的类在函数作用域里按名查不到,会让\r\n * `field-extract` / `watch-extract` / `conventions` 拿到 `undefined` 而静默\r\n * 什么都不做。\r\n */\r\n cls?: any\r\n /** 源文件中该 class 声明的起始/结束偏移(用于 MagicString 注入) */\r\n start: number\r\n end: number\r\n /**\r\n * 类体左花括号 `{` 的源码偏移(`cls.body.start`)。\r\n *\r\n * 注入锚点必须是它,不能用 `code.indexOf('{', start)` —— `extends mixin({ a: 1 })`\r\n * 里第一个 `{` 落在 extends 子句中,扫到那里会把 `static __ce_static__` 插进\r\n * 对象字面量里,产出整模块语法错误。-1 表示无 AST 可用(调用方应回退扫描)。\r\n */\r\n bodyStart: number\r\n /** `@tag` 名称,无则 undefined */\r\n tagName?: string\r\n /** 本类自身声明的响应式字段(按声明顺序;继承链由依赖提取另行上溯) */\r\n fields: Map<string, ReactiveField>\r\n /** 本类自身定义的实例方法名(D2:自有方法值不可变,不推入依赖,无需拒绝) */\r\n ownMethods: Set<string>\r\n /** 本类自身定义的 getter 名(`@computed` 之外的普通 getter,D2 视为方法) */\r\n ownGetters: Set<string>\r\n /** 是否有 render() */\r\n hasRender: boolean\r\n /** render() 函数体 AST(Program 级 node),无则 null */\r\n renderBody: any | null\r\n /** render() 函数体在源码中的偏移区间(不含大括号) */\r\n renderBodyStart: number\r\n renderBodyEnd: number\r\n /** `get cssVars()` 函数体语句数组(无则 null),供 cssDeps 静态提取 */\r\n cssVarsBody: any[] | null\r\n /** `@computed` getter 名 → 函数体语句数组,供 computedDeps 静态提取 */\r\n computedBodies: Map<string, any[]>\r\n /** `@query` / `@queryAll` 字段名(非响应式 DOM 查询属性,依赖提取按死条目记录) */\r\n queryFields?: Set<string>\r\n /** 本类方法 / getter / 箭头字段的函数体(name → BlockStatement 节点或表达式体),供依赖提取内联扫描 */\r\n bodies?: Map<string, any>\r\n /** 静态分析未通过的原因(D0/D4/D5/D6);null 表示通过。非 null 即闸门抛错 */\r\n staticReason: string | null\r\n /** 无视图组件(render() 不存在 / 返回 null / 继承链终点为 CompElem)→ 注入 noView: true */\r\n noView: boolean\r\n /** 跳过注入(同文件继承链上有 render 的祖先,继承其 __ce_static__)→ 不生成注入语句 */\r\n skipInjection: boolean\r\n /**\r\n * **mixin 工厂内的 class 声明**(`export function mix(B) { class M extends B {} ; return M }`)。\r\n *\r\n * super 是调用方传入的形参 ⇒ 静态不可知链:不做 D6 报错、无 own render 时一律\r\n * `skipInjection`(绝不判 `noView`,否则基类有视图时会静默白屏)。\r\n * 家族表(props/states/computedGetters)的合并走 `Reflect.getPrototypeOf(this)`,\r\n * 与本标记无关,mixin 声明的 @prop 会沿链传递到具体组件。\r\n *\r\n * 写法约束:必须是 class **声明**,不能是 class **表达式** —— TS 禁止在 class\r\n * 表达式上写装饰器(TS1206),能带 `@prop` 的形态只有 class 声明。\r\n */\r\n isMixin?: boolean\r\n /** 静态导入绑定:本地名 → 从 compelem 导入的原始名 */\r\n compelemImports: Map<string, string>\r\n /**\r\n * 模块级绑定名(顶层 const/let/var/function/class,以及全部 import 的本地名)。\r\n * 用于 D3 判定:这些名字不是「自由标识符」。\r\n */\r\n moduleBindings: Set<string>\r\n /**\r\n * 模块级 `const` 的初始化器:名字 → VariableDeclarator(见 collectModuleConstInits)。\r\n * 供模板静态片段折叠判定 `${CONST}` 是不是模块级 `h` 标签模板常量。\r\n * 只收同文件声明 —— compileFile 是单文件纯函数,跨文件 import 不解析。\r\n */\r\n moduleConstInits: Map<string, any>\r\n /**\r\n * 外部指令名(options.knownDirectives,compile.ts 注入)。插值位置对这些\r\n * 导入名的调用按指令点分类(isDirectiveCall),同 COMpelem_DIRECTIVES。\r\n */\r\n knownDirectives?: Set<string>\r\n}\r\n\r\n/** 插件选项。 */\r\nexport interface CompilerOptions {\r\n /**\r\n * 参与编译的文件过滤。默认处理 `.ts`,且源码里出现 `extends CompElem`、`@tag(`\r\n * 或家族装饰器(@prop/@state/@computed/@query)之一。\r\n * ⚠️ 不要放宽到 `.js`:IIFE 打包产物里指令名不在 scope,会触发 D3 误报。\r\n */\r\n include?: (id: string, code: string) => boolean\r\n /**\r\n * verbose 日志:依赖清单人类可读打印(vite 插件侧同时打印每文件编译状态行)。\r\n * 也可用环境变量 `CE_DEPS_DEBUG`(非空且非 '0')单独开启清单打印,无需改配置。\r\n * 注:产物的块分隔注释(`//////// …… <标签>`)默认始终生成,与本选项无关。\r\n */\r\n verbose?: boolean\r\n /**\r\n * 跨文件标签注册表:已知组件的 kebab 标签名(大小写不敏感)。\r\n * 用于 SLOT 判定与 `.prop` 目标校验;vite 插件可跨文件累积后注入\r\n * (TEMPLATE-CODEGEN.md §4)。\r\n */\r\n knownTags?: Iterable<string>\r\n /**\r\n * 外部指令注册表:经 `directive()` 包装、遵守 DirectiveInstance 契约的\r\n * 跨包导入函数名(如 compelem-router 的 `outlet`)。插值位置对这些名字的\r\n * 调用按指令点编译(vite 插件选项原样透传,无需跨文件累积)。\r\n * 不提供则模块绑定调用退回值点语义 —— 与 0.28 动态引擎「函数值即指令」\r\n * 的隐式契约断裂,外部指令将渲染成函数源码文本。\r\n */\r\n knownDirectives?: Iterable<string>\r\n}\r\n","/**\r\n * 编译产物注入。\r\n *\r\n * 用 MagicString 做**最小侵入**的源码改写:在 class 体开头插入一个\r\n * `static __ce_static__ = { ... }`(+ 可选合成 constructor),在已有\r\n * constructor 的 super 语句后插入 prop/state 初始值写入,并扩展/新增\r\n * compelem 运行时函数 import;其余源码逐字节不动(保留原始 sourcemap 映射)。\r\n */\r\nimport MagicString from 'magic-string'\r\nimport type { ComponentAnalysis } from '../types'\r\nimport { DEBUG_DIV } from '../types'\r\nimport { IDENT_RE, unwrapExpr } from '../utils/ast'\r\n\r\nexport interface InjectOptions {\r\n /** 无视图组件标记:注入 noView: true(不创建 Shadow DOM)*/\r\n noView?: boolean\r\n}\r\n\r\n/** `buildStaticLiteral` 可选生成物(任一缺失则对应字段不注入)。 */\r\nexport interface StaticLiteralCodes {\r\n /** per-point effect 工厂数组(值/指令点的订阅与写 DOM) */\r\n pointEffects?: string\r\n /**\r\n * `fx`:与 ups 逐项 1:1 的工厂数组。值点返回 effect,指令点返回 DirectiveInstance,\r\n * 事件/ref 点返回 handler / ref 对象。renderTemplate 借它取首屏值,运行时按\r\n * up 上的 `ux` 下标索引(Q2 的前提:ups 与工厂 1:1 后才能互查)。\r\n */\r\n fx?: string\r\n /** watch effect 工厂数组 */\r\n watchEffects?: string\r\n /** `entries` 是否已内联**同文件**基类的 @watch —— 决定 watchEffects 是否还拼父类数组 */\r\n inlinedWatchAncestors?: boolean\r\n /** cssVars effect 工厂(读 CSS 依赖信号 → 更新自定义属性) */\r\n cssEffect?: string\r\n buildTemplate?: string\r\n /** 子视图表(结构指令的子模板元数据):`subViews: { <subId>: { buildTemplate, fx } }` */\r\n subViews?: string\r\n /**\r\n /** `__ce_static__.props` 字面量值(@prop 前移,analyze/field-extract.ts) */\r\n props?: string\r\n /** `__ce_static__.states` 字面量值(@state 前移) */\r\n states?: string\r\n /** `__ce_static__.computedGetters` 字面量值(@computed 前移,原 getter 体外提) */\r\n computedGetters?: string\r\n /** 类体访问器源码(prop/state/computed 的 get/set + `@tag` 类的 observedAttributes),\r\n * 接在 static 字面量之后注入。无 `@tag` 的类不带 observedAttributes —— 它们永不被\r\n * `customElements.define`,浏览器不会读它们的表。 */\r\n accessors?: string\r\n}\r\n\r\n/** prop/state 初始值写入语句的构造体插入点计划。 */\r\nexport interface CtorInsertPlan {\r\n /** 插入点(原始源码偏移) */\r\n pos: number\r\n /** true = 类无构造体 → 合成 `constructor(...__a){ super(...__a); ... }` */\r\n synthesize: boolean\r\n /**\r\n * 警告级诊断(W 通道):super(…) 不在构造体顶层语句位时给出——\r\n * 插入点只能退到构造体末尾,prop/state 初始值写入晚于分支内用户语句,\r\n * 与原生字段初始化时机不严格等价。调用方转成 severity:'warn' 诊断。\r\n */\r\n warn?: string\r\n}\r\n\r\n/**\r\n * 构造体内**非顶层**位置(分支/try/循环/带标签语句)是否存在 super(…) 调用。\r\n * 不下钻嵌套函数/类:其中的 `super()` 要么非法(嵌套函数)、要么属于嵌套类自己的构造器。\r\n */\r\nfunction hasNestedSuperCall(node: any): boolean {\r\n if (!node || typeof node !== 'object') return false\r\n if (Array.isArray(node)) return node.some(hasNestedSuperCall)\r\n if (typeof node.type !== 'string') return false\r\n if (node.type === 'CallExpression' && node.callee?.type === 'Super') return true\r\n if (\r\n node.type === 'FunctionDeclaration' ||\r\n node.type === 'FunctionExpression' ||\r\n node.type === 'ArrowFunctionExpression' ||\r\n node.type === 'ClassDeclaration' ||\r\n node.type === 'ClassExpression'\r\n ) {\r\n return false\r\n }\r\n for (const key of Object.keys(node)) {\r\n if (key === 'type' || key === 'loc' || key === 'parent' || key === 'start' || key === 'end') continue\r\n if (hasNestedSuperCall(node[key])) return true\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * 计算 prop/state 初始值写入的构造体插入点。\r\n * 与原字段初始化时机等价:super() 返回后、构造体其余语句之前;\r\n * super 语句不在顶层(分支/try 内)时退到构造体末尾(闭合 `}` 前,保证执行且在\r\n * super 后),并给出 warn 级诊断说明时序取舍。\r\n */\r\nexport function planCtorInsert(\r\n comp: ComponentAnalysis,\r\n clsNode: any,\r\n code: string,\r\n): CtorInsertPlan | undefined {\r\n // 与 injectInto 同理:定位类体左花括号必须优先用 AST 的 `cls.body.start`。\r\n // 从 class 起始处往后扫第一个 `{` 会扫进 `extends mixin({ a: 1 })` 的对象字面量,\r\n // 把构造体插进那个对象里 —— 模块直接语法错误(mixin 工厂内的组件必中)。\r\n const braceIdx =\r\n comp.bodyStart >= 0 && comp.bodyStart < comp.end\r\n ? comp.bodyStart\r\n : code.indexOf('{', comp.start)\r\n if (braceIdx < 0 || braceIdx > comp.end) return undefined\r\n const ctor = (clsNode?.body?.body ?? []).find(\r\n (m: any) => m.type === 'MethodDefinition' && m.kind === 'constructor',\r\n )\r\n if (!ctor) return { pos: braceIdx + 1, synthesize: true }\r\n const body = ctor.value?.body\r\n const stmts = body?.body ?? []\r\n // 顶层 super(…) 语句按 **AST** 判定:`super (…)` 带空格、`(super(…))` 带括号、\r\n // TS 包装形态都能命中(旧文本判据 `code.startsWith('super(')` 全部漏掉,\r\n // 初始值写入被静默推到构造体末尾、晚于用户语句)\r\n for (const st of stmts) {\r\n if (st.type !== 'ExpressionStatement') continue\r\n const e = unwrapExpr(st.expression)\r\n if (e?.type === 'CallExpression' && e.callee?.type === 'Super') {\r\n return { pos: st.end, synthesize: false }\r\n }\r\n }\r\n if (!body) return undefined\r\n if (hasNestedSuperCall(body)) {\r\n return {\r\n pos: body.end - 1,\r\n synthesize: false,\r\n warn:\r\n `W-CTOR-SUPER: 组件 '${comp.className}' 构造器的 super(…) 位于分支/嵌套结构内,` +\r\n `prop/state 初始值写入已退到构造体末尾(保证在 super 后执行,但晚于构造体内的用户语句,` +\r\n `与原生字段初始化时机不严格等价);如需严格时序请把 super(…) 移回构造体顶层语句位`,\r\n }\r\n }\r\n return { pos: body.end - 1, synthesize: false }\r\n}\r\n\r\n/** 文件级运行时函数 import 注入参数。 */\r\nexport interface ImportInjectOptions {\r\n /** 需要导入的运行时函数名(已定名,含可能的 __ce_ 别名) */\r\n helpers?: string[]\r\n /**\r\n * helper 的本地名 → 原始导出名。仅当本地名与导出名不同(冲突别名)时需要;\r\n * 缺省按同名导入。例如 `{ __ce_signal: 'signal' }` →\r\n * `import { signal as __ce_signal } from 'compelem'`。\r\n */\r\n helperAliases?: Record<string, string>\r\n /** 定位到的 compelem import 声明:有命名 specifier 则原位扩展,否则新增独立行 */\r\n helperImport?: { decl: any; source: string }\r\n /** 新增独立 import 行时的锚点(首个 import 起点或首语句起点) */\r\n helpersAnchor?: number\r\n /** 需要从 **myfx** 注入的运行时函数名(方法装饰器前移的 debounce/throttle/once) */\r\n myfxHelpers?: string[]\r\n /** myfx helper 的本地名 → 原始导出名(同 helperAliases) */\r\n myfxAliases?: Record<string, string>\r\n /** 定位到的 myfx import 声明:有命名 specifier 则原位扩展,否则新增独立行 */\r\n myfxImport?: { decl: any; source: string }\r\n /**\r\n * 顶层语句(模块级常量,如子模板 carrier `const __ce_t0 = Object.assign(...)`),\r\n * 插在 `topLevelAnchor` 之后(通常取最后一个 import 声明的末尾偏移)。\r\n */\r\n topLevel?: string\r\n /** topLevel 的插入锚点(紧跟其后的偏移) */\r\n topLevelAnchor?: number\r\n /** inline 预变换的原始坐标编辑;在 class 注入前统一 overwrite。 */\r\n inlineEdits?: Array<{ start: number; end: number; text: string }>\r\n}\r\n\r\n/**\r\n * 家族字段(props/states/computedGetters)的父类合并表达式。\r\n *\r\n * 用 `Reflect.getPrototypeOf(this)` 而非 `super`:\r\n * - 静态字段初始化器里 `this` 即类本身,`super` 只在有 extends 子句时合法\r\n * (无 extends 的类上写 `super` 是 SyntaxError,整个模块加载失败);\r\n * - `super.__ce_static__` 需要 AST 知道 extends 子句的**源码文本**,而\r\n * `extends FieldContainer(CompElem)` 这类 mixin 形态重放该表达式等于\r\n * **二次调用 mixin 工厂**,拿到的是另一个类;\r\n * - 构造器原型链是 mixin / 跨文件 / node_modules 预构建包的**唯一共同通道**,\r\n * 运行时查找天然穿透这三者,不需要模块图。\r\n */\r\nconst SUPER_STATIC = 'Reflect.getPrototypeOf(this).__ce_static__'\r\n\r\n/** `superProps` 表达式:取父类(可能未编译 → undefined)的家族表。 */\r\nconst superFamily = (name: 'props' | 'states' | 'computedGetters') => `${SUPER_STATIC}?.${name}`\r\n\r\n/**\r\n * 家族字段的 emit 形态 —— **浅替换**语义。\r\n *\r\n * - 有 own 条目:`{ ...super?.<name>, ...<own> }`。own 后置 → 同名 key 整体\r\n * 替换父类选项对象(不做逐字段深合并,见 DESIGN「prop 选项浅替换」)。\r\n * - 无 own 条目:直接别名父类表(不复制)。表对象本身从不被改写,\r\n * 只有条目上的 `_defaultValue`/`_typeAry` 派生缓存会被写,且其值是\r\n * 「本类信号默认值」的纯函数 → 同链同 key 必然一致,共享安全。\r\n *\r\n * 无论哪种都必须 emit:own `__ce_static__` 会**遮蔽**父类的整个静态字段,\r\n * 漏掉就会把祖先的 prop/state 定义一并遮没(这正是连续两层无自有 prop\r\n * 子类丢失整张定义表的根因)。\r\n */\r\nexport function emitFamily(name: 'props' | 'states' | 'computedGetters', ownCode?: string): string {\r\n const sup = superFamily(name)\r\n return ownCode === undefined ? sup : `{ ...${sup}, ...${ownCode} }`\r\n}\r\n\r\n/**\r\n * `watchEffects` 的 emit 形态 —— **数组拼接**语义(props/states 是浅替换,语义相反)。\r\n *\r\n * @watch effect 是**要执行的行为**而非可替换的表:子类 own 数组必须把祖先的执行\r\n * 序列接在**自己前面**,而不是覆盖掉它\r\n *\r\n * @param ownCode 本类 @watch 生成的数组字面量(`[...]`);无则 undefined\r\n * @param inlinedAncestors `entries` 是否已内联**同文件**基类的 @watch。\r\n * 为 true 时原样返回 ownCode:同文件继承由 watch-extract 把祖先条目并入 entries,\r\n * 而父类 `__ce_static__.watchEffects` 与该前缀内容完全相同,拼接会让同一批\r\n * 处理器执行两次(immediate 处理器副作用翻倍)。\r\n */\r\nexport function emitWatchEffects(ownCode?: string, inlinedAncestors?: boolean): string | undefined {\r\n if (inlinedAncestors) return ownCode\r\n const sup = `(${SUPER_STATIC}?.watchEffects ?? [])`\r\n return ownCode === undefined ? `[...${sup}]` : `[...${sup}, ...${ownCode}]`\r\n}\r\n\r\n/** 生成 `static __ce_static__ = {...}` 的源码文本。 */\r\nexport function buildStaticLiteral(\r\n opts: InjectOptions,\r\n codes: StaticLiteralCodes = {},\r\n): string {\r\n /** 字段块分隔注释(`//////// …… <标签>` 整行,纯注释、不改行为)。 */\r\n const mark = (label: string, body: string) => `${DEBUG_DIV} ${label}\\n${body}`\r\n /** `{ … }` 展开逐字段一行(分隔注释须行首)。 */\r\n const wrap = (ps: string[]) => `static __ce_static__ = {\\n${ps.join(',\\n')}\\n};\\n`\r\n const parts: string[] = []\r\n\r\n if (codes.buildTemplate) {\r\n // buildTemplate:编译期生成的直接建 DOM 函数(docs/TEMPLATE-CODEGEN.md §2)\r\n parts.push(mark('buildTemplate', `buildTemplate: ${codes.buildTemplate}`))\r\n }\r\n\r\n if (codes.subViews) {\r\n // subViews:结构指令模板回调的子视图。与主 buildTemplate 同生共死。\r\n parts.push(mark('subViews', `subViews: ${codes.subViews}`))\r\n }\r\n\r\n // ---- 五族访问器前移(field-extract):与视图无关,必须注入 ----\r\n // props/states/computedGetters 一律 emit(own 浅替换叠加父类表,见 emitFamily):\r\n // own 静态字面量会遮蔽父类整张表,漏 emit 即丢祖先定义。\r\n parts.push(mark('props', `props: ${emitFamily('props', codes.props)}`))\r\n parts.push(mark('states', `states: ${emitFamily('states', codes.states)}`))\r\n parts.push(mark('computedGetters', `computedGetters: ${emitFamily('computedGetters', codes.computedGetters)}`))\r\n\r\n // watchEffects 与 props/states 的 emit 形态**不同**:那边是浅替换,这边是拼接\r\n // (effect 是要执行的行为,own 数组必须把祖先的执行序列接在自己前面)。\r\n // 同样「无论哪种都必须 emit」—— own `__ce_static__` 遮蔽父类整个静态对象,\r\n // 漏 emit 即丢祖先全部 @watch。inlinedWatchAncestors 为真时返回 undefined\r\n // (不注入 own 键),让父类数组原样透下来。\r\n const watchCode = emitWatchEffects(codes.watchEffects, codes.inlinedWatchAncestors)\r\n if (watchCode !== undefined) {\r\n // watch effect 工厂数组(祖先在前、自己在后)。\r\n // 每个工厂 (rc) => effectFn:读信号 → 变更时调用处理器。\r\n parts.push(mark('watchEffects', `watchEffects: ${watchCode}`))\r\n }\r\n\r\n if (codes.cssEffect) {\r\n // cssVars effect 工厂(读 CSS 依赖信号 → 更新自定义属性)。\r\n parts.push(mark('cssEffect', `cssEffect: ${codes.cssEffect}`))\r\n }\r\n\r\n if (codes.pointEffects) {\r\n // per-point effect 工厂数组:\r\n // 每个工厂 (rc, nodes) => effectFn,订阅一个信号,取值 → 守卫 → 写 DOM 在微任务里。\r\n parts.push(mark('pointEffects', `pointEffects: ${codes.pointEffects}`))\r\n }\r\n\r\n if (codes.fx) {\r\n // fx:与 ups 1:1。值点的项与 pointEffects 中对应项**是同一份源码**(同一工厂),\r\n // 指令点返回 DirectiveInstance、事件/ref 点返回 handler/ref 对象 —— 后两类\r\n // 不订阅信号,故不出现在 pointEffects 里,却仍需在 fx 占位以维持 1:1。\r\n parts.push(mark('fx', `fx: ${codes.fx}`))\r\n }\r\n\r\n // 静态分析结论**不注入产物**:未通过的组件由 `assertStaticAnalysis` / 模板 codegen\r\n // 直接抛 `StaticAnalysisError`,走不到这里。产物里只留运行时需要的东西。\r\n\r\n if (opts.noView) {\r\n // 无视图组件:只注入 noView,不注入任何视图加速字段\r\n // (访问器/家族元数据与视图无关,仍须随字面量注入)\r\n parts.push(mark('noView', `noView: true`))\r\n return wrap(parts) + (codes.accessors ?? '')\r\n }\r\n\r\n let literal = wrap(parts)\r\n // 访问器(get/set/observedAttributes)\r\n literal += codes.accessors ?? ''\r\n return literal\r\n}\r\n\r\n/**\r\n * 把生成物注入到源文件。\r\n *\r\n * 多个组件在同文件时按 **end 倒序** 插入,避免前一次插入改变后一次偏移。\r\n */\r\nexport function injectInto(\r\n code: string,\r\n edits: Array<{\r\n comp: ComponentAnalysis\r\n literal: string\r\n removals?: Array<{ start: number; end: number }>\r\n fieldInits?: Array<{ name: string; initText: string; computed?: boolean }>\r\n ctor?: CtorInsertPlan\r\n /** 方法装饰器(@debounced/@throttled/@onced)构造体注入语句 */\r\n methodDecoCtor?: string\r\n /** 方法装饰器 destroy 注入语句(插到 destroy() 内) */\r\n methodDecoDestroy?: string\r\n }>,\r\n id: string,\r\n extras: ImportInjectOptions = {},\r\n): { code: string; map: any; injected: string[]; additions: string[] } {\r\n const s = new MagicString(code)\r\n const injected: string[] = []\r\n const additions: string[] = []\r\n const removalSpans = edits.flatMap((e) => e.removals ?? [])\r\n // inline 预变换与 class 注入共用同一个 MagicString(原始源码坐标),这样 map\r\n // 直接指回用户源码;落在 remove 区间里的 inline 编辑是死代码,跳过以免区间重叠。\r\n for (const e of extras.inlineEdits ?? []) {\r\n if (removalSpans.some((r) => e.start < r.end && r.start < e.end)) continue\r\n s.overwrite(e.start, e.end, e.text)\r\n }\r\n\r\n const sorted = [...edits].sort((a, b) => b.comp.start - a.comp.start)\r\n for (const { comp, literal, removals, fieldInits, ctor, methodDecoCtor, methodDecoDestroy } of sorted) {\r\n // 定位 class 体的左花括号。优先用 AST 给出的 `cls.body.start` —— 从 class 起始处\r\n // 往后扫第一个 `{` 会在 `extends mixin({ a: 1 })` 上扫进 extends 子句的对象字面量,\r\n // 把 static 字段插进对象里,产出整模块语法错误。AST 不可用时才回退扫描。\r\n const braceIdx =\r\n comp.bodyStart >= 0 && comp.bodyStart < comp.end\r\n ? comp.bodyStart\r\n : code.indexOf('{', comp.start)\r\n if (braceIdx < 0 || braceIdx > comp.end) continue\r\n s.appendLeft(braceIdx + 1, '\\n' + literal)\r\n // 记入 additions:`literal` 是本次注入的 `static __ce_static__ = {...}` 全文。\r\n // 必须记录,否则「移除 additions + 应用 removals 还原源码」的校验无法把它删掉 ——\r\n // 那个校验(inject-e2e / field-e2e 的「removals 字节恒等」)会因残留字面量而失败。\r\n additions.push('\\n' + literal)\r\n // prop/state 初始值与 computed 信号体写入构造体(字段声明已随 removals 整体删除;\r\n // 插入点在 super() 语句后 / 合成 constructor 内,时机与原字段初始化等价)\r\n // 方法装饰器注入(@debounced/@throttled/@onced)**接在 fieldInits 之后**同一插入点:\r\n // 编译器已算好直线语句(`this.onX = throttle(this.onX, 100)`),运行时零遍历。\r\n // 次序:super() → this.__s ??= {} → fieldInits → methodDecoCtor。\r\n // (方法体在构造期不会被调用,但\"信号先建\"更稳 —— 见 method-deco-extract 头注释)\r\n const hasFieldInits = fieldInits?.length && ctor\r\n if ((hasFieldInits || methodDecoCtor) && ctor) {\r\n const inits = hasFieldInits\r\n ? fieldInits!\r\n .map((i) =>\r\n i.computed\r\n ? `this.__s.${i.name} = signalComputed(function()${i.initText}.bind(this));`\r\n : `this.__s.${i.name} = signal(${i.initText});`,\r\n )\r\n .join(' ')\r\n : ''\r\n const md = methodDecoCtor ? (inits ? ' ' : '') + methodDecoCtor : ''\r\n const stmts = inits + md\r\n // `this.__s ??= {}` 而非 `this.__s = {}`:\r\n // 继承链上 super() 已把**父类**的信号建好(CompElem 构造函数里初始化),\r\n // 子类若直接 `= {}` 会把父类信号整体抹掉 —— 随后父类访问器读\r\n // `this.__s.<父键>.value` 即抛 \"Cannot read properties of undefined\"。\r\n // 实测:skipInjection 子类(无 own render,继承父类视图)必现。\r\n // 前导分号是**必需的**,不是保险:ctor.pos = 顶层 `super(...)` 语句的 st.end,\r\n // 该位置落在其终止分号**之前**,直接 appendLeft 会把 `super(...a)` 的分号顶掉,\r\n // 产出 `super(...a) this.__s ??= {}; …` —— 同一行两个表达式语句,ASI 不生效,\r\n // 整个组件产物语法错误(`';' expected.`),组件直接加载失败。\r\n // 若某些解析器的 st.end 已含分号,多出的 `;` 只是一个空语句,无副作用。\r\n const text = ctor.synthesize\r\n ? `\\nconstructor(...__a) { super(...__a); this.__s ??= {}; ${stmts} }\\n`\r\n : `; this.__s ??= {}; ${stmts}`\r\n s.appendLeft(ctor.pos, text)\r\n additions.push(text)\r\n }\r\n // 方法装饰器 destroy 清理:**不注入到基类 `destroy()`**(那是基类代码,用户源码里没有),\r\n // 而是生成一个 `beforeDestroyed()` 重写 —— 基类 `destroy()`:393 会调用它,且它本身\r\n // 是空钩子(CompElem.ts:376)。必须 `super.beforeDestroyed?.()` 保留用户/祖先实现。\r\n //\r\n // 用户已声明 `beforeDestroyed` 的情形在**分析层**(method-deco-extract)就已拦截:\r\n // 有 own `beforeDestroyed` → 整个方法装饰器前移放弃并报 E 码,故这里不必再判\r\n // (若在此\"跳过清理但保留包装\"会造成包装了却永不清理的泄漏,比不包装更难查)。\r\n if (methodDecoDestroy) {\r\n const text = `\\n beforeDestroyed() { ${methodDecoDestroy} super.beforeDestroyed?.() }\\n`\r\n s.appendLeft(braceIdx + 1, text)\r\n additions.push(text)\r\n }\r\n // @watch 装饰器删除(span 均为原始源码偏移,MagicString 自动组合)。\r\n // 必须与注入同成功/同失败:装饰器被删而 watchers 未注入会丢 watch。\r\n for (const r of removals ?? []) s.remove(r.start, r.end)\r\n injected.push(comp.className)\r\n }\r\n\r\n // 运行时函数 import:优先扩展现有 compelem 命名导入(`}` 处 appendLeft);\r\n // 仅 default/namespace/无 compelem import 时新增独立行(锚点=首 import 或首语句前)\r\n const injectHelperImport = (\r\n namesIn: string[] | undefined,\r\n aliases: Record<string, string> | undefined,\r\n importDecl: { decl: any; source: string } | undefined,\r\n anchor: number | undefined,\r\n fallbackSource: string,\r\n ) => {\r\n // local → imported。local 是生成代码里实际使用的名字;imported 是包的导出名。\r\n const specs = new Map<string, string>()\r\n for (const local of namesIn ?? []) {\r\n const imported = aliases?.[local] ?? local\r\n if (!IDENT_RE.test(local)) continue\r\n if (!IDENT_RE.test(imported)) continue\r\n specs.set(local, imported)\r\n }\r\n if (!specs.size) return\r\n\r\n const decl = importDecl?.decl\r\n // `import type { … }` 是纯类型声明,绝不能把运行时 helper 追加进去。\r\n const isTypeOnly = decl?.importKind === 'type'\r\n const hasNamed =\r\n !isTypeOnly &&\r\n !!decl &&\r\n (decl.specifiers ?? []).some((sp: any) => sp.type === 'ImportSpecifier')\r\n const existing = new Set<string>(\r\n (decl?.specifiers ?? []).map((sp: any) => sp.local?.name).filter(Boolean),\r\n )\r\n const pending = [...specs].filter(([local]) => !existing.has(local))\r\n if (!pending.length) return\r\n const specText = pending\r\n .map(([local, imported]) => (local === imported ? local : `${imported} as ${local}`))\r\n .join(', ')\r\n const braceIdx = decl ? code.lastIndexOf('}', decl.end) : -1\r\n if (decl && hasNamed && braceIdx > decl.start) {\r\n // 源码 `}` 前已是尾逗号(多行命名导入风格)→ 只补空格,否则 `, ,` 双逗号语法错误\r\n const needComma = !/,\\s*$/.test(code.slice(decl.start, braceIdx))\r\n const text = (needComma ? ', ' : ' ') + specText\r\n s.appendLeft(braceIdx, text)\r\n additions.push(text)\r\n } else {\r\n const at = anchor ?? 0\r\n const text = `import { ${specText} } from ${JSON.stringify(importDecl?.source ?? fallbackSource)};\\n`\r\n s.appendLeft(at, text)\r\n additions.push(text)\r\n }\r\n }\r\n injectHelperImport(extras.helpers, extras.helperAliases, extras.helperImport, extras.helpersAnchor, 'compelem')\r\n // 方法装饰器前移注入的 `debounce/throttle/once` 是 **myfx** 的实现,不是 compelem 的\r\n // 出口 —— 走独立的 myfx 通道:优先扩展源码已有的 `from \"myfx\"` 命名导入。\r\n injectHelperImport(extras.myfxHelpers, extras.myfxAliases, extras.myfxImport, extras.helpersAnchor, 'myfx')\r\n\r\n // 模块级常量(子模板 carrier 等):插在最后一个 import 之后。\r\n // 与 class 体内注入同批记入 additions —— 「removals 还原源码」的字节恒等校验\r\n // 要能把它一并删掉。\r\n if (extras.topLevel) {\r\n const anchor = extras.topLevelAnchor ?? 0\r\n const text = `\\n${extras.topLevel}\\n`\r\n s.appendLeft(anchor, text)\r\n additions.push(text)\r\n }\r\n\r\n return {\r\n code: s.toString(),\r\n map: s.generateMap({ source: id, hires: true, includeContent: true }),\r\n injected,\r\n additions,\r\n }\r\n}\r\n","/**\n * 约定错误静态检查(对应运行时 showError/showTagError 中「可静态判定」的调用点)。\n *\n * 设计原则(对齐 docs/TEMPLATE-CODEGEN.md §5「仅静态编译」):\n * 运行时用 DEV 断言兜底的「约定违规」,编译期能证明的直接在构建期报错;\n * 编译期为唯一入口。\n *\n * 检查项 → 运行时调用点映射:\n * E-EMIT-ARG this.emit(实参无法静态解析) ← CompElem.ts emit()\n * E-EMIT-UNDECLARED emit 事件名未在 @emits 声明 ← CompElem.ts:1273 / event.ts matchEmit\n * E-EMITS-ARG @emits(...) 实参无法静态解析 ← 装饰期静默收 Set,无法校验\n * E-PROP-TYPE @prop 无默认值且未声明 type ← CompElem.ts(编译期唯一入口)\n * W-PROP-CUSTOM-CTOR @prop type 含自定义构造器且无 converter ← utils.ts convertValue 的 DEV 提示(已删)\n * W-PROP-CASE @prop 字段名非 lowerCamelCase(运行期按 kebabCase 映射,功能正常,仅风格提示);\n * 只有与另一 prop 撞同一属性名时才升为 E-PROP-CASE(真的互相覆盖)\n * E-PROP-ASSIGN 组件内对 this.<非model prop> 赋值 ← 单向数据流约定(非运行时约束,见检查点注释)\n * W-FIELD-OPT-DEAD @prop/@state 的 shallow|hasChanged 运行期零消费点(声明在,实现不在)\n * W-LIFECYCLE-TYPO 与基类生命周期名只差一字符、且本文件内无任何引用的方法(拼错的静默失效)\n * E-COMPUTED-NOT-GETTER @computed 用在非 getter 上 ← computed.ts(编译期唯一入口)\n * E-CSSCOPE-TARGET @csscope 用在非 static getter 上 ← csscope.ts(编译期唯一入口)\n *\n * 静态字符串解析:除字符串字面量外,还支持解析模块级 const 常量\n * (`const EV = 'x'`、`const EVS = { Ready: 'x', G: { A: 'y' } }`),\n * 以及对它们的成员访问(`EVS.Ready`、`EVS.G.A`)—— 对齐真实代码库的枚举式写法。\n *\n * 不可静态判定的调用点(转换器报错、required 缺失、forEach 重复 key 等)不在此处。\n */\nimport type { ComponentAnalysis } from '../types'\n// unwrapTsExpr 是 unwrapExpr 的历史名(field-extract / method-deco-extract /\n// template-rules / literal-meta 仍在用),在此转出以免改动那些 import 路径。\n// 本文件原先那份实现**不认** TSTypeAssertion(`<T>x`),已随统一修正。\nimport { decoratorName, keyName, superClassName, unwrapExpr } from '../utils/ast'\nexport { decoratorName, unwrapExpr as unwrapTsExpr }\n\nexport interface ConventionError {\n start: number\n end: number\n message: string\n /** 'warn':提示级(合法但易踩坑),恒走 console.warn,不随 conventions 档位阻断构建。缺省 error。 */\n severity?: 'warn'\n}\n\nexport interface ConventionsContext {\n /** 本文件内全部类声明(含非组件类),继承链解析用 */\n localClasses: Map<string, any>\n /** 模块级字符串常量表(collectStringConsts 产物),emit/@emits 实参解析用 */\n stringConsts: Map<string, any>\n /** 本文件全部 import 本地名。导入常量(跨文件)无法解析值 → 按「不透明」放行 */\n importedLocals: Set<string>\n /**\n * 模块级 `const NAME = <init>` 的 init 节点表(collectModuleConsts 产物)。\n * 五族访问器前移(field-extract)用:`@prop(OPTS)` 等 options 标识符\n * 只支持**文件内静态分析**——inline init 源码到注入字面量(同模块作用域等价求值)。\n */\n moduleConsts?: Map<string, any>\n /**\n * 模块级函数表(collectModuleFunctions 产物):顶层 `function NAME() {}` 与\n * `const NAME = 箭头/函数表达式`。用于模板约定检查 E-TEMPLATE-INTERP 判定\n * 「插值位调用的本地函数是否返回 Template(子视图)」。不收类方法。\n */\n moduleFunctions?: Map<string, { node: any; annotatedTemplate: boolean }>\n /**\n * U5:本文件源码(compileFile 注入,测试可缺省)。\n * collectThisUsage 的预筛依据——函数体切片不含 `this` 字面量即可跳过深度 walk\n * (emit/propAssign 赋值模式都要求 ThisExpression,源码必含 `this`)。\n */\n code?: string\n}\n\n/** isStringLiteral:覆盖 `Literal` / `StringLiteral` 两种形态(estree / babel 原生)。 */\nfunction isStringLiteral(n: any): boolean {\n return !!n && (n.type === 'StringLiteral' || (n.type === 'Literal' && typeof n.value === 'string'))\n}\n\n/** 对象属性节点:estree 形态产出 `Property`,兼容 babel 原生 `ObjectProperty`。 */\nfunction isObjectProp(p: any): boolean {\n return !!p && (p.type === 'Property' || p.type === 'ObjectProperty') && !p.computed\n}\n\n/**\n * 收集模块级字符串常量:`const X = 'str'`、`const X = { K: 'v', N: { K: 'v' } }`。\n * 值必须是纯静态字符串(对象允许嵌套一层对象),动态初始化不收录。\n */\nexport function collectStringConsts(program: any): Map<string, any> {\n const out = new Map<string, any>()\n const strOf = (n: any): string | null => (isStringLiteral(n) ? String(n.value) : null)\n for (const stmt of program?.body ?? []) {\n const decl = stmt?.type === 'ExportNamedDeclaration' ? stmt.declaration : stmt\n if (decl?.type !== 'VariableDeclaration' || decl.kind !== 'const') continue\n for (const d of decl.declarations ?? []) {\n if (d.id?.type !== 'Identifier' || !d.init) continue\n const name = d.id.name\n const sv = strOf(d.init)\n if (sv != null) {\n out.set(name, sv)\n continue\n }\n if (d.init.type === 'ObjectExpression') {\n const obj: Record<string, any> = {}\n let ok = true\n for (const p of d.init.properties ?? []) {\n if (!isObjectProp(p)) { ok = false; break }\n const k = keyName(p.key)\n if (!k) { ok = false; break }\n const v = strOf(p.value)\n if (v != null) { obj[k] = v; continue }\n if (p.value?.type === 'ObjectExpression') {\n const inner: Record<string, any> = {}\n let ok2 = true\n for (const ip of p.value.properties ?? []) {\n if (!isObjectProp(ip)) { ok2 = false; break }\n const ik = keyName(ip.key)\n const iv = strOf(ip.value)\n if (!ik || iv == null) { ok2 = false; break }\n inner[ik] = iv\n }\n if (ok2) { obj[k] = inner; continue }\n }\n ok = false\n break\n }\n if (ok) out.set(name, obj)\n }\n }\n }\n return out\n}\n\n/**\n * 收集模块级 `const NAME = <init>` 的 init 节点(含 `export const`)。\n * 五族 options 标识符解析用(field-extract.ts):不做内容校验——init 源码\n * 原样内联进同文件的 `__ce_static__` 字面量,模块作用域下等价求值。\n * 仅收 `const`(import / 运行时拼接 / `let` 不支持 → 调用方报 E-PROP-ARG 等)。\n */\nexport function collectModuleConsts(program: any): Map<string, any> {\n const out = new Map<string, any>()\n for (const stmt of program?.body ?? []) {\n const decl = stmt?.type === 'ExportNamedDeclaration' ? stmt.declaration : stmt\n if (decl?.type !== 'VariableDeclaration' || decl.kind !== 'const') continue\n for (const d of decl.declarations ?? []) {\n if (d.id?.type !== 'Identifier' || !d.init) continue\n out.set(d.id.name, d.init)\n }\n }\n return out\n}\n\n/**\n * 收集模块级函数:顶层 `function NAME() {}` 与 `const NAME = (...) => ...` / `function`。\n * 返回 名字 → { node, annotatedTemplate },`annotatedTemplate` 表示返回类型注解为 `Template`。\n * 用途:E-TEMPLATE-INTERP 判定插值位调用的本地函数是否产出子视图。\n * 不收类方法(方法返回值无法在模块级静态证明)。\n */\nexport function collectModuleFunctions(\n program: any,\n): Map<string, { node: any; annotatedTemplate: boolean }> {\n const out = new Map<string, { node: any; annotatedTemplate: boolean }>()\n const visit = (decl: any) => {\n if (!decl) return\n if (decl.type === 'FunctionDeclaration' && decl.id?.name) {\n out.set(decl.id.name, { node: decl, annotatedTemplate: returnTypeIsTemplate(decl) })\n }\n if (decl.type === 'VariableDeclaration' && decl.kind === 'const') {\n for (const d of decl.declarations ?? []) {\n if (d.id?.type !== 'Identifier' || !d.init) continue\n const init = d.init\n if (init.type === 'ArrowFunctionExpression' || init.type === 'FunctionExpression') {\n out.set(d.id.name, { node: init, annotatedTemplate: returnTypeIsTemplate(init) })\n }\n }\n }\n }\n for (const stmt of program?.body ?? []) {\n const decl = stmt?.type === 'ExportNamedDeclaration' ? stmt.declaration : stmt\n visit(decl)\n }\n return out\n}\n\n/** 函数返回类型注解是否为 `Template`(`function f(): Template` / `const f = (): Template =>`)。 */\nfunction returnTypeIsTemplate(fnNode: any): boolean {\n const rt = fnNode.returnType\n if (!rt) return false\n const ann = rt.type === 'TSTypeAnnotation' ? rt.typeAnnotation : rt\n if (ann?.type === 'TSTypeReference') {\n const tn = ann.typeName\n if (tn?.type === 'Identifier' && tn.name === 'Template') return true\n }\n return false\n}\n\n/**\n * 函数体是否「返回 h`` 模板」(简写箭头 `() => h\\`...\\`` 或块体内任一 `return h\\`...\\``)。\n * `hAliases` 来自 collectTemplateTagAliases(comp),对齐 template-extract 的别名识别。\n */\nexport function bodyReturnsTemplate(fnNode: any, hAliases: Set<string>): boolean {\n const body = fnNode.body\n if (!body) return false\n if (body.type !== 'BlockStatement') return isHCall(body, hAliases)\n let found = false\n const walk = (n: any) => {\n if (!n || typeof n.type !== 'string' || found) return\n if (n.type === 'ReturnStatement' && n.argument && isHCall(n.argument, hAliases)) {\n found = true\n return\n }\n for (const k of Object.keys(n)) {\n if (k === 'start' || k === 'end' || k === 'type' || k === 'parent') continue\n const v = n[k]\n if (Array.isArray(v)) for (const x of v) walk(x)\n else if (v && typeof v === 'object' && typeof v.type === 'string') walk(v)\n }\n }\n walk(body)\n return found\n}\n\nfunction isHCall(node: any, hAliases: Set<string>): boolean {\n const n = unwrapExpr(node)\n return (\n n?.type === 'TaggedTemplateExpression' &&\n n.tag?.type === 'Identifier' &&\n hAliases.has(n.tag.name)\n )\n}\n\n/**\n * 静态解析字符串表达式:字面量 / 常量标识符 / 常量成员访问(两级对象)。\n * 返回:\n * { ok: true, value } 解析成功\n * { ok: true, opaque: true } 根标识符是跨文件导入(值不可知),跳过校验\n * { ok: false, unknownKey } 表达式形态可静态分析,但常量 key 不存在(unknownKey 形如 'EVS.Other')\n * { ok: false } 标识符不在常量表(可能是运行期变量)\n * null 完全无法静态分析(动态表达式)\n */\ntype ResolveResult =\n | { ok: true; value: string; opaque?: boolean }\n | { ok: false; unknownKey?: string }\n | null\n\nfunction resolveStaticString(n: any, consts: Map<string, any>, importedLocals: Set<string>): ResolveResult {\n if (isStringLiteral(n)) return { ok: true, value: String(n.value) }\n if (n?.type === 'Identifier') {\n if (importedLocals.has(n.name)) return { ok: true, value: '', opaque: true }\n const v = consts.get(n.name)\n if (typeof v === 'string') return { ok: true, value: v }\n return { ok: false }\n }\n if (n?.type === 'MemberExpression' && !n.computed) {\n // A.B / A.B.C:沿常量表下钻\n const parts: string[] = []\n let cur = n\n while (cur?.type === 'MemberExpression' && !cur.computed && keyName(cur.property)) {\n parts.unshift(keyName(cur.property)!)\n cur = cur.object\n }\n if (cur?.type !== 'Identifier') return null\n if (importedLocals.has(cur.name)) return { ok: true, value: '', opaque: true }\n const root = consts.get(cur.name)\n if (root == null) return { ok: false }\n let v: any = root\n let path = cur.name\n for (const p of parts) {\n path += '.' + p\n if (v == null || typeof v !== 'object') return { ok: false, unknownKey: path }\n v = v[p]\n if (v === undefined) return { ok: false, unknownKey: path }\n }\n return typeof v === 'string' ? { ok: true, value: v } : { ok: false, unknownKey: path }\n }\n return null\n}\n\n/** 复刻 matchEmit(event.ts:274-287)的匹配语义:精确命中或 'prefix:*' 通配。 */\nfunction matchEmits(declared: Set<string>, evName: string): boolean {\n if (declared.has(evName)) return true\n for (const n of declared) {\n if (n.endsWith(':*') && evName.startsWith(n.slice(0, -1))) return true\n }\n return false\n}\n\n/**\n * 收集一个类(含同文件基类链)的 @emits 声明。\n * 实参无法静态解析为字符串 → E-EMITS-ARG 编译错误。\n * 实参是跨文件导入常量 → 记入 hasOpaque(声明集不完整,后续放弃 UNDECLARED 校验)。\n */\nfunction collectDeclaredEmits(\n cls: any,\n ctx: ConventionsContext,\n isEmitsDec: (localName: string) => boolean,\n isCompElem: (localName: string) => boolean,\n errs: ConventionError[],\n): { declared: Set<string>; hasOpaque: boolean } {\n const out = new Set<string>()\n let hasOpaque = false\n const seen = new Set<any>()\n const visit = (node: any) => {\n if (!node || seen.has(node)) return\n seen.add(node)\n for (const dec of node.decorators ?? []) {\n const name = decoratorName(dec)\n if (!name || !isEmitsDec(name)) continue\n const expr = dec.expression ?? dec\n for (const arg of expr.arguments ?? []) {\n if (arg.type === 'SpreadElement') {\n errs.push({ start: arg.start, end: arg.end, message: 'E-EMITS-ARG: @emits 不支持展开实参(无法静态解析)' })\n continue\n }\n const r = resolveStaticString(arg, ctx.stringConsts, ctx.importedLocals)\n if (r?.ok && r.opaque) hasOpaque = true\n else if (r?.ok) out.add(r.value)\n else if (r?.unknownKey) errs.push({ start: arg.start, end: arg.end, message: `E-CONST-KEY: 常量成员 '${r.unknownKey}' 不存在` })\n else errs.push({ start: arg.start, end: arg.end, message: 'E-EMITS-ARG: @emits 实参必须是字符串字面量或可静态解析的常量(编译期静态校验)' })\n }\n }\n const sup = superClassName(node)\n if (!sup || isCompElem(sup)) return\n const parent = ctx.localClasses.get(sup)\n if (parent) visit(parent)\n else {\n // 跨文件基类可能声明了 @emits;看不到就标记声明集不完整,\n // 放弃 UNDECLARED 校验,避免把继承事件误报成未声明。\n hasOpaque = true\n }\n }\n visit(cls)\n return { declared: out, hasOpaque }\n}\n\n/**\n * 遍历成员函数体,收集 `this.emit(...)` 调用与 `this.<name> = ...` 赋值。\n *\n * `this` 绑定规则:箭头函数继承外层 this;非箭头函数(function/方法内的 function 声明)\n * 重新绑定 this —— 进入非箭头函数后收集到的 this.* 不再属于组件实例,跳过。\n */\ninterface ThisUsage {\n emitCalls: Array<{ node: any; arg: any }>\n propAssignments: Array<{ node: any; propName: string }>\n}\n\nfunction collectThisUsage(memberFn: any, code?: string): ThisUsage {\n const usage: ThisUsage = { emitCalls: [], propAssignments: [] }\n // U5 预筛:emit/propAssign 匹配都要求 ThisExpression → 函数体源码必含字面 `this`。\n // 无则直接返回空(slice+includes 的原生扫描比递归 Object.keys walk 便宜一个量级)。\n const body = memberFn.body\n if (\n code &&\n body &&\n typeof body.start === 'number' &&\n typeof body.end === 'number' &&\n !code.slice(body.start, body.end).includes('this')\n ) {\n return usage\n }\n const rec = (n: any, fnBarrier: boolean) => {\n if (!n || typeof n.type !== 'string') return\n if (!fnBarrier && n.type === 'CallExpression') {\n const c = n.callee\n if (\n c?.type === 'MemberExpression' &&\n !c.computed &&\n c.object?.type === 'ThisExpression' &&\n keyName(c.property) === 'emit' &&\n n.arguments?.length\n ) {\n usage.emitCalls.push({ node: n, arg: n.arguments[0] })\n }\n }\n if (!fnBarrier && n.type === 'AssignmentExpression') {\n const l = n.left\n if (\n l?.type === 'MemberExpression' &&\n !l.computed &&\n l.object?.type === 'ThisExpression' &&\n keyName(l.property)\n ) {\n // 任何赋值运算符都算:=、+=、??=、||= ……\n usage.propAssignments.push({ node: n, propName: keyName(l.property)! })\n }\n }\n if (!fnBarrier && n.type === 'UpdateExpression' && (n.operator === '++' || n.operator === '--')) {\n const l = n.argument\n if (\n l?.type === 'MemberExpression' &&\n !l.computed &&\n l.object?.type === 'ThisExpression' &&\n keyName(l.property)\n ) {\n usage.propAssignments.push({ node: n, propName: keyName(l.property)! })\n }\n }\n // 进入非箭头函数(function 声明/表达式)后 this 重绑 → 后代 this.* 不再属于组件实例\n const childBarrier = fnBarrier || n.type === 'FunctionExpression' || n.type === 'FunctionDeclaration'\n for (const k of Object.keys(n)) {\n if (k === 'start' || k === 'end' || k === 'type') continue\n const v = (n as any)[k]\n if (Array.isArray(v)) {\n for (const c of v) rec(c, childBarrier)\n } else if (v && typeof v === 'object' && typeof v.type === 'string') {\n rec(v, childBarrier)\n }\n }\n }\n // 从函数体开始遍历:成员函数自身(MethodDefinition.value 是 FunctionExpression)不算「嵌套函数」\n rec(memberFn.body, false)\n return usage\n}\n\n/** 提取装饰器实参里的 options 对象节点(无参形态返回 null;Identifier 经 moduleConsts 内联解析)。 */\nfunction decoratorOptionsNode(member: any, isDec: (n: string) => boolean, ctx?: ConventionsContext): any | null {\n for (const dec of member.decorators ?? []) {\n const dn = decoratorName(dec)\n // 必须按 isDec(local) 匹配:import { prop as p } 时本地名是 p,不是 prop。\n if (!dn || !isDec(dn)) continue\n const expr = dec.expression ?? dec\n if (expr.type === 'CallExpression') {\n const a0 = expr.arguments?.[0]\n if (a0?.type === 'ObjectExpression') return a0\n if (a0?.type === 'Identifier' && ctx?.moduleConsts?.has(a0.name)) {\n const init = unwrapExpr(ctx.moduleConsts.get(a0.name))\n if (init?.type === 'ObjectExpression') return init\n }\n return null\n }\n return null // 无参形态\n }\n return null\n}\n\n/** 展开后的 options 序列:对象字面量属性与“无法静态解析的 spread”占位。 */\nexport type OptionEntry = { kind: 'prop'; node: any } | { kind: 'opaque' }\n\n/**\n * 展开 options 对象(含同文件 const 对象与可解析的 spread)。\n *\n * 无法解析的 spread 记为 opaque:调用方既不能假设某个 key 不存在,也不能\n * 假设其值;需要精确语义(model setter / type)时必须保守处理。\n */\nexport function flattenOptionProps(\n node: any,\n ctx?: ConventionsContext,\n depth = 0,\n seen: Set<any> = new Set(),\n): OptionEntry[] {\n const obj = unwrapExpr(node)\n if (!obj || obj.type !== 'ObjectExpression' || depth > 8 || seen.has(obj)) {\n return [{ kind: 'opaque' }]\n }\n const nextSeen = new Set(seen).add(obj)\n const out: OptionEntry[] = []\n for (const p of obj.properties ?? []) {\n if (p.type === 'SpreadElement' || p.type === 'ExperimentalSpreadProperty') {\n const arg = unwrapExpr(p.argument)\n let init: any\n if (arg?.type === 'ObjectExpression') init = arg\n else if (arg?.type === 'Identifier' && ctx?.moduleConsts?.has(arg.name)) {\n init = unwrapExpr(ctx.moduleConsts.get(arg.name))\n }\n if (init?.type === 'ObjectExpression') {\n out.push(...flattenOptionProps(init, ctx, depth + 1, nextSeen))\n } else {\n out.push({ kind: 'opaque' })\n }\n continue\n }\n if (p.computed && !(p.key?.type === 'Literal' || p.key?.type === 'StringLiteral')) {\n out.push({ kind: 'opaque' })\n continue\n }\n out.push({ kind: 'prop', node: p })\n }\n return out\n}\n\n/** 某个 key 在展开序列里的“最后一次赋值”状态。 */\nexport function finalOption(\n entries: OptionEntry[],\n key: string,\n): { known: boolean; node?: any } {\n let known = false\n let node: any\n for (const e of entries) {\n if (e.kind === 'opaque') {\n // opaque spread 可能覆盖任意 key;只有其后的显式属性才能恢复“已知”\n known = false\n node = undefined\n continue\n }\n if (keyName(e.node.key) === key) {\n known = true\n node = e.node.value\n }\n }\n return { known, node }\n}\n\n/** 展开序列中是否存在无法静态解析的 spread。 */\nexport function hasOpaqueOption(entries: OptionEntry[]): boolean {\n return entries.some((e) => e.kind === 'opaque')\n}\n\n/** convertValue 内建处理的构造器名(其余构造器走 new t(字符串) 路径)。 */\nconst BUILTIN_TYPE_NAMES: ReadonlySet<string> = new Set([\n 'String', 'Number', 'Boolean', 'Object', 'Array', 'Date', 'Function',\n])\n\n/**\n * type 选项里的自定义构造器标识符名。仅识别 Identifier 与全 Identifier 的\n * ArrayExpression;其它形态(成员访问、表达式、变量引用)无法静态判定 → 返回空(宁漏勿误报)。\n */\nfunction customCtorTypeNames(node: any): string[] {\n const v = unwrapExpr(node)\n const one = (n: any): string | undefined => {\n if (n?.type !== 'Identifier') return undefined\n return BUILTIN_TYPE_NAMES.has(n.name) ? undefined : n.name\n }\n if (v?.type === 'Identifier') {\n const n = one(v)\n return n ? [n] : []\n }\n if (v?.type === 'ArrayExpression') {\n const out: string[] = []\n for (const el of v.elements ?? []) {\n if (el?.type !== 'Identifier') return []\n const n = one(el)\n if (n && !out.includes(n)) out.push(n)\n }\n return out\n }\n return []\n}\n\n/**\n * prop / state 声明名 → 运行期 HTML attribute 名。\n *\n * 对齐 myfx `kebabCase` 的 camelCase 分词(`Foo` → `foo`、`fooBar` → `foo-bar`)。\n * 只用于「两个 prop 是否撞同一属性」的判定 —— 不需要与 myfx 在缩写词(`getMyURL`)上\n * 逐字节一致,撞名关系的判定结果一致即可。\n */\nfunction attrNameOf(name: string): string {\n return name\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase()\n}\n\n/** CompElem 基类的公开方法 / 生命周期名(手工镜像 `F:\\github\\compelem\\src\\CompElem.ts`)。 */\nconst COMPELEM_MEMBERS: ReadonlySet<string> = new Set([\n 'setup', 'propsReady', 'render', 'beforeMount', 'mounted', 'slotChange', 'afterUpdate',\n 'beforeDestroyed', 'destroyed', 'destroy', 'forceUpdate', 'updateProps', 'nextTick', 'emit',\n 'insertStyleSheet', 'getSubViewNodes', 'defineSignalField',\n 'connectedCallback', 'disconnectedCallback', 'attributeChangedCallback',\n])\n\n/** 运行期已无消费点的 field option(`shallow` / `hasChanged`:全仓 grep 零命中)。 */\nconst DEAD_FIELD_OPTIONS = ['shallow', 'hasChanged'] as const\n\n/** 编辑距离是否恰好 ≤ 1(增/删/改一个字符)。 */\nfunction editDistanceLe1(a: string, b: string): boolean {\n const la = a.length\n const lb = b.length\n if (Math.abs(la - lb) > 1) return false\n let i = 0\n while (i < la && i < lb && a[i] === b[i]) i++\n if (la === lb) return i === la || a.slice(i + 1) === b.slice(i + 1)\n return la > lb ? a.slice(i + 1) === b.slice(i) : a.slice(i) === b.slice(i + 1)\n}\n\n/** 与给定方法名只差一字符的基类成员(无则 null)。短名(<5)不参与,避免噪音。 */\nfunction nearestMemberName(name: string): string | null {\n if (name.length < 5) return null\n for (const m of COMPELEM_MEMBERS) {\n if (m.length >= 5 && editDistanceLe1(name, m)) return m\n }\n return null\n}\n\n/** 全文件里该标识符出现的次数(含声明本身)。 */\nfunction countIdent(code: string, name: string): number {\n const re = new RegExp(`(?<![\\\\w$])${name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}(?![\\\\w$])`, 'g')\n let n = 0\n while (re.exec(code)) n++\n return n\n}\n\n/**\n * W-FIELD-OPT-DEAD:`@prop` / `@state` 的 options 里出现了运行期没有消费点的键。\n *\n * 这类选项「写了不报错、也不生效」,比直接报错更难发现 —— 使用者会以为它在起作用。\n * 只在 options 完全可静态展开(无 spread)时判断,否则可能误伤。\n */\nfunction warnDeadOptions(\n errs: ConventionError[],\n entries: ReturnType<typeof flattenOptionProps>,\n member: any,\n memberName: string,\n familyLabel: string,\n): void {\n if (!entries.length || hasOpaqueOption(entries)) return\n for (const key of DEAD_FIELD_OPTIONS) {\n const opt = finalOption(entries, key)\n if (!opt.known || !opt.node) continue\n errs.push({\n start: opt.node.start ?? member.start,\n end: opt.node.end ?? member.end,\n severity: 'warn',\n message:\n `W-FIELD-OPT-DEAD: ${familyLabel}('${memberName}') 的选项 '${key}' 运行期没有任何消费点` +\n `(信号相等性恒为 Object.is)—— 该选项不会生效,可删除`,\n })\n }\n}\n\n/**\n * 对单个组件执行全部约定检查。返回错误列表(可为空)。\n * 注意:约定检查独立于模板 codegen 与静态分析闸门 —— 二者都会执行,不短路。\n */\nexport function checkConventions(\n comp: ComponentAnalysis,\n ctx: ConventionsContext,\n): ConventionError[] {\n const errs: ConventionError[] = []\n const cls = comp.cls ?? ctx.localClasses.get(comp.className)\n if (!cls) return errs\n\n // 装饰器判定:按「本地名 → imported 名」精确解析(兼容 import { emits as e })\n const isEmitsDec = (local: string) => comp.compelemImports.get(local) === 'emits'\n const isPropDec = (local: string) => comp.compelemImports.get(local) === 'prop'\n const isStateDec = (local: string) => comp.compelemImports.get(local) === 'state'\n const isComputedDec = (local: string) => comp.compelemImports.get(local) === 'computed'\n const isCsscopeDec = (local: string) => comp.compelemImports.get(local) === 'csscope'\n\n // ---- 1. @emits 声明收集(含继承链) ----\n const { declared, hasOpaque } = collectDeclaredEmits(\n cls,\n ctx,\n isEmitsDec,\n (local) => comp.compelemImports.get(local) === 'CompElem',\n errs,\n )\n\n // ---- 2. 遍历类成员:emit 调用 / prop 赋值 / 装饰器目标检查 ----\n const propFields = new Map<string, any>() // name → PropertyDefinition 节点\n for (const member of cls.body?.body ?? []) {\n const name = keyName(member.key)\n if (!name || member.type !== 'PropertyDefinition') continue\n const decs: string[] = (member.decorators ?? []).map(decoratorName).filter(Boolean) as string[]\n if (decs.some((d) => isPropDec(d))) propFields.set(name, member)\n }\n\n /**\n * E-PROP-ASSIGN 专用的**同文件继承链合并** prop 集:子类方法里对基类声明的\n * prop 赋值,只查本类 propFields 会漏报。沿 extends 链上溯同文件基类\n * (跨文件基类不可知,保持漏报不误报),浅替换语义——子类同名字段的选项\n * 对象整体覆盖祖先(先放本类,祖先仅在无同名时补入)。\n * ⚠️ 只用于 propAssignments 判定;成员级检查(E-PROP-CASE/TYPE 等)仍用\n * 本类 propFields——那是按「本类成员自带 @prop」遍历的,混入祖先字段会\n * 把子类同名的普通字段误当 prop 检查。\n */\n const propFieldsChain = new Map<string, any>(propFields)\n {\n const isCompElemBase = (name: string) => comp.compelemImports.get(name) === 'CompElem'\n let cur = cls\n for (let depth = 0; depth < 8; depth++) {\n const sup = superClassName(cur)\n if (!sup || isCompElemBase(sup)) break\n const parent = ctx.localClasses.get(sup)\n if (!parent) break // 基类在本文件外:其 prop 集不可知\n for (const member of parent.body?.body ?? []) {\n const name = keyName(member.key)\n if (!name || member.type !== 'PropertyDefinition') continue\n const decs: string[] = (member.decorators ?? []).map(decoratorName).filter(Boolean) as string[]\n if (decs.some((d) => isPropDec(d)) && !propFieldsChain.has(name)) propFieldsChain.set(name, member)\n }\n cur = parent\n }\n }\n\n for (const member of cls.body?.body ?? []) {\n const memberName = keyName(member.key)\n\n // 装饰器目标检查(与成员是否有函数体无关)\n const decs: string[] = (member.decorators ?? []).map(decoratorName).filter(Boolean) as string[]\n if (memberName && decs.some((d) => isComputedDec(d)) && member.kind !== 'get') {\n errs.push({\n start: member.start,\n end: member.end,\n message: `E-COMPUTED-NOT-GETTER: @computed 只能用于非静态 getter('${memberName}' 是 ${member.kind ?? 'member'})`,\n })\n }\n if (memberName && decs.some((d) => isCsscopeDec(d))) {\n if (!member.static || member.kind !== 'get') {\n errs.push({\n start: member.start,\n end: member.end,\n message: `E-CSSCOPE-TARGET: @csscope 只能用于 static getter('${memberName}' ${member.static ? '非 getter' : '非 static'})`,\n })\n }\n }\n\n // ---- 内置装饰器目标校验(E-DECO-TARGET)----\n // 内置装饰器 targets:\n // debounced / onced / throttled → METHOD(编译期前移,见 analyze/method-deco-extract.ts)\n // query / queryAll → FIELD\n // 自定义装饰器在编译期不可知 → 放行\n // targets 校验完全由编译期负责 —— 这是唯一的校验点。\n if (memberName) {\n const checkTarget = (importedName: string, allowed: string[]) => {\n // compelemImports 是 local→imported,需按 imported 值反查 local 名\n const hasDec = decs.some((d) => comp.compelemImports.get(d) === importedName)\n if (!hasDec) return\n const isMethodDeco = importedName === 'debounced' || importedName === 'onced' || importedName === 'throttled'\n if (isMethodDeco) {\n // 方法装饰器只包装“非 static、非 private 的普通实例方法”;\n // getter/static/private 会生成 `this.getter = …` / `this.#x_$__` 等坏代码。\n const ok =\n member.type === 'MethodDefinition' &&\n member.kind === 'method' &&\n member.static !== true &&\n !String(memberName).startsWith('#')\n if (!ok) {\n errs.push({\n start: member.start,\n end: member.end,\n message:\n `E-DECO-TARGET: @${importedName} 只能用于非 static、非 private 的普通实例方法('${memberName}' 是 ` +\n `${member.static ? 'static ' : ''}${String(memberName).startsWith('#') ? 'private ' : ''}${member.kind ?? member.type})`,\n })\n }\n return\n }\n let actual = 'unknown'\n if (member.type === 'MethodDefinition') actual = 'METHOD'\n else if (member.type === 'PropertyDefinition') actual = 'FIELD'\n if (!allowed.includes(actual)) {\n errs.push({\n start: member.start,\n end: member.end,\n message: `E-DECO-TARGET: @${importedName} 只能用于 ${allowed.join('/')}('${memberName}' 是 ${actual})`,\n })\n }\n }\n checkTarget('debounced', ['METHOD'])\n checkTarget('onced', ['METHOD'])\n checkTarget('throttled', ['METHOD'])\n checkTarget('query', ['FIELD'])\n checkTarget('queryAll', ['FIELD'])\n }\n\n // @prop 约定\n if (memberName && propFields.has(memberName)) {\n if (!/^[a-z]/.test(memberName)) {\n // 运行期把 prop 名按 kebabCase 映射成 HTML 属性(utils.ts `_observedAttrs`):\n // `Foo` → `foo`,`this.Foo` 访问器与属性通道都照常工作 ⇒ 大写开头**本身不是语法错误**,\n // 只有与另一个 prop 撞同一个属性名(`Foo` + `foo`)时才会真的互相覆盖。\n const attr = attrNameOf(memberName)\n const clash = [...propFields.keys()].find(\n (n) => n !== memberName && attrNameOf(n) === attr,\n )\n if (clash) {\n errs.push({\n start: member.start,\n end: member.end,\n message:\n `E-PROP-CASE: Prop '${memberName}' 与 '${clash}' 会映射到同一个 HTML 属性 '${attr}'` +\n `(运行期 kebabCase 归一)——两者互相覆盖,请改用 lowerCamelCase 区分`,\n })\n } else {\n errs.push({\n start: member.start,\n end: member.end,\n severity: 'warn',\n message:\n `W-PROP-CASE: Prop '${memberName}' 不是 lowerCamelCase —— 运行期按 kebabCase 映射为属性 '${attr}',` +\n `功能正常,仅提示统一风格`,\n })\n }\n }\n const opts = decoratorOptionsNode(member, isPropDec, ctx)\n const entries = opts ? flattenOptionProps(opts, ctx) : []\n const typeOpt = finalOption(entries, 'type')\n const hasInit = member.value != null // PropertyDefinition 的初始化表达式\n if (!hasInit && !typeOpt.known && !hasOpaqueOption(entries)) {\n errs.push({\n start: member.start,\n end: member.end,\n message: `E-PROP-TYPE: Prop '${memberName}' 没有默认值也没有声明 type,运行时无法做类型推断`,\n })\n }\n // W-PROP-CUSTOM-CTOR:type 含内置以外的构造器、又没配 converter 且属性通道未关时,\n // 属性字符串会以「原始字符串作单参」传给 new Ctor(...)。合法但易踩坑,提示级。\n if (typeOpt.known && typeOpt.node && !hasOpaqueOption(entries)) {\n const convOpt = finalOption(entries, 'converter')\n const attrOpt = finalOption(entries, 'attribute')\n const attrOff =\n attrOpt.known &&\n ((attrOpt.node?.type === 'Literal' && attrOpt.node.value === false) ||\n attrOpt.node?.type === 'BooleanLiteral' && attrOpt.node?.value === false)\n if (!convOpt.known && !attrOff) {\n const custom = customCtorTypeNames(typeOpt.node)\n if (custom.length) {\n errs.push({\n start: typeOpt.node.start,\n end: typeOpt.node.end,\n severity: 'warn',\n message:\n `W-PROP-CUSTOM-CTOR: Prop '${memberName}' 声明了自定义构造器 [${custom.join(', ')}]:` +\n `HTML 属性反序列化会把原始字符串作单参传给 new ${custom[0]}(...);` +\n `如需其它解析请配 converter,或 attribute:false 关闭属性通道`,\n })\n }\n }\n }\n // W-FIELD-OPT-DEAD:运行期已无消费点的选项(全仓 grep 零命中)——留着会让人误以为生效。\n warnDeadOptions(errs, entries, member, memberName, '@prop')\n }\n\n // @state 约定:只关心 options(成员合法性由 field-extract 全量校验)\n if (memberName && decs.some((d) => isStateDec(d))) {\n const opts = decoratorOptionsNode(member, isStateDec, ctx)\n const entries = opts ? flattenOptionProps(opts, ctx) : []\n warnDeadOptions(errs, entries, member, memberName, '@state')\n }\n\n // ---- W-LIFECYCLE-TYPO:与基类生命周期只差一字符、且全文件无人引用的方法 ----\n // 拼错的生命周期方法运行期永不调用(基类空实现,不报错),是最难查的一类静默失效。\n // 「全文件无人引用」是关键的降噪条件:真正的工具方法(renderTo / mountedAll)一定被调。\n if (\n memberName &&\n member.type === 'MethodDefinition' &&\n member.kind === 'method' &&\n !member.static &&\n !COMPELEM_MEMBERS.has(memberName) &&\n ctx.code\n ) {\n const near = nearestMemberName(memberName)\n if (near && countIdent(ctx.code, memberName) <= 1) {\n errs.push({\n start: member.start,\n end: member.end,\n severity: 'warn',\n message:\n `W-LIFECYCLE-TYPO: '${memberName}' 与基类方法 '${near}' 只差一个字符,且本文件内没有任何引用 —— ` +\n `运行期不会调用它;若不是拼写错误请忽略本条`,\n })\n }\n }\n\n // 函数体内的 this 使用\n const fn =\n member.type === 'MethodDefinition' || member.type === 'PropertyDefinition' ? member.value : null\n if (!fn || (fn.type !== 'FunctionExpression' && fn.type !== 'ArrowFunctionExpression')) continue\n // static 成员里的 this 是类本身,不是组件实例;emit/propAssign 规则不适用。\n if (member.static) continue\n\n const usage = collectThisUsage(fn, ctx.code)\n for (const { arg } of usage.emitCalls) {\n const r = resolveStaticString(arg, ctx.stringConsts, ctx.importedLocals)\n if (r?.ok && r.opaque) {\n // 跨文件导入常量:值不可知,跳过校验(跨文件常量表是 vite 插件的后续工作)\n continue\n }\n if (r?.ok) {\n if (hasOpaque) continue // 声明集不完整 → 放弃 UNDECLARED 校验,避免误报\n if (!matchEmits(declared, r.value)) {\n errs.push({\n start: arg.start,\n end: arg.end,\n message: `E-EMIT-UNDECLARED: '${r.value}' was not declared in @emits`,\n })\n }\n } else if (r?.unknownKey) {\n errs.push({\n start: arg.start,\n end: arg.end,\n message: `E-CONST-KEY: 常量成员 '${r.unknownKey}' 不存在`,\n })\n } else {\n errs.push({\n start: arg.start,\n end: arg.end,\n message: 'E-EMIT-ARG: this.emit 实参必须是字符串字面量或可静态解析的常量(编译期静态校验)',\n })\n }\n }\n for (const { node, propName } of usage.propAssignments) {\n // 沿同文件继承链查(含基类 prop);model 选项解析用的字段节点即声明处\n const field = propFieldsChain.get(propName)\n if (!field) continue\n // model:true 的 prop 运行时开放 set 通道(双向绑定),允许组件内赋值。\n // spread 无法解析时不能证明“非 model”,跳过以免误报;已知 model:false 才报。\n const opts = decoratorOptionsNode(field, isPropDec, ctx)\n const entries = opts ? flattenOptionProps(opts, ctx) : []\n const modelOpt = finalOption(entries, 'model')\n if (modelOpt.known) {\n const v = modelOpt.node\n const isBool =\n v?.type === 'BooleanLiteral' || (v?.type === 'Literal' && typeof v.value === 'boolean')\n if (!isBool) continue // 值不可静态判定 → 宁漏勿误报\n if (v.value === true) continue\n } else if (hasOpaqueOption(entries)) continue\n // E-PROP-ASSIGN 是**单向数据流约定**,不是运行时约束:注入的 setter 会直接写信号\n // (`set x(__v) { this.__s.x.value = __v }`),`model` prop 更是开放写回的。\n // 之所以在编译期拦,是因为「子组件悄悄改父组件传入值」在反应式链路里必然出现\n // 双源真相;写法上应改用 model 或 updateProps 让改动走事件回到父端。\n errs.push({\n start: node.start,\n end: node.end,\n message: `E-PROP-ASSIGN: 不能在组件内对 prop '${propName}' 赋值(props 由外部单向传入;双向请用 model 或 updateProps)`,\n })\n }\n }\n\n // 按位置排序,稳定输出\n errs.sort((a, b) => a.start - b.start)\n return errs\n}\n","/**\n * cssVars / @computed getter 的响应式依赖静态提取(编译期静态分析)。\n *\n * 语义(只收集响应式读取;宁可省略键走全根兜底,不可欠收集):\n *\n * 1. 纯语法并集:三目/逻辑短路不裁剪,凡可达的 this 链读取一律入集。\n * 2. 依赖入口三合一:\n * - this 链(`this.a.b`;`this.arr[i]` 取静态前缀 `arr` 并继续扫描下标表达式)\n * - 别名等价类(`let that = this`、传递、后置赋值——预扫描 fixpoint,进箭头、不进非箭头函数体)\n * - 解构捕获(`const {a, b: {c}} = this` → 记 `a` / `b.c`;rest/数组解构 → 放弃该键)\n * 失败入口:裸 this / 裸别名逃逸(`return that`、`f(this)`、`[...this]`)→ 该 getter 放弃(键省略)\n * 3. 链根五级分级:\n * ① fields(prop/state/computed)→ 记录链路 + 根\n * ② queryFields(@query/@queryAll,非响应式)→ 记录死条目\n * ③ own bodies(方法/普通 getter/箭头字段)→ 内联扫体(不记 root,inlineDepth ≤ 8 防环)\n * ④ 同文件祖先(localClasses + classInfoOf 记忆)→ 同级处理\n * ⑤ 未知(跨文件基类成员、mixin 链等)→ 放弃该 getter\n * 4. 调用表达式:callee 为 this/别名链 → 按③分级;自由/模块/局部 callee → 只扫实参\n * (模块函数的 this 非组件实例);FunctionExpression/Declaration 体内含 this → 放弃。\n * 5. 自由/局部/形参/模块标识符一律忽略(非响应式读取不收集)。\n * 6. 嵌套箭头共享 this 等价类,词法下钻。\n * 7. `super.cssVars`:沿**同文件** super 链取第一个定义了 cssVars 的祖先,内联扫其体\n * (父类 cssVars 的依赖就是本组件的依赖,见 scanNode 的 Super 分支)。链上有跨文件\n * 基类时仍不可知 —— 其 cssVars 体不在这份 AST 里。\n *\n * 失败语义:cssVars 任一失败 → 整体 undefined(不注入,运行时全根兜底);\n * @computed 失败键跳过(该键运行时全根兜底),全部失败 → 注入空对象;无 @computed → undefined。\n *\n * 调试:环境变量 DEPS_TRACE=1 时每次失败向 stderr 输出 `[deps-fail] <原因标签>`。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { addDepPath, isTsWrapper, keyName, unwrapExpr } from '../utils/ast'\nimport { classInfoOf, compelemResolver, superClassName, type ImportResolver } from './component'\n\ninterface ExtractCtx {\n comp: ComponentAnalysis\n localClasses: Map<string, any>\n /** compelem 导入名解析器(本地名 → 导入原名,用于链终点 CompElem 判定与类信息提取) */\n resolve: ImportResolver\n /** this 等价类:预扫描收集的别名名 */\n aliasNames: Set<string>\n /** 豁免的 ThisExpression(别名/解构声明 init 位,身份判定) */\n exemptThis: Set<object>\n deps: Set<string>\n failed: boolean\n seen: WeakSet<object>\n /** 内联扫体深度(防环) */\n depth: number\n /**\n * 当前正在展开其成员体的类节点(默认 = 本组件自己的类节点)。\n *\n * `super.cssVars` 的解析必须从**它所在的那个类**往上走,而不是每次都从本组件重新开始 ——\n * 否则「父类的 cssVars 自己又写 `super.cssVars`」时,递归会原地打转、永远够不到祖父类\n * (实测:三级链 `A ← B ← Foo`,B 与 Foo 都 `assign(super.cssVars, …)`,Foo 的依赖集\n * 会丢掉 A 的字段)。内联扫体时按栈式保存/恢复,见 inlineScan。\n */\n ownerClass: any\n}\n\nfunction record(ctx: ExtractCtx, path: string[]) {\n addDepPath(ctx.deps, path)\n}\n\n/** TS 包装节点解包(`this as any` / `that!` 等)—— 统一实现在 utils/ast#unwrapExpr。\n * 本副本原先比别处多认 `TSInstantiationExpression`、少认 `TSTypeAssertion`,已归一。 */\n\n/** 置失败标记;DEPS_TRACE=1 时输出原因标签(见文件头)。 */\nfunction failAt(ctx: ExtractCtx, where: string) {\n if (typeof process !== 'undefined' && process.env?.DEPS_TRACE) {\n console.error('[deps-fail]', where)\n }\n ctx.failed = true\n}\n\n// ---------------------------------------------------------------------------\n// 预扫描:this 别名等价类 + 解构捕获\n// ---------------------------------------------------------------------------\n\nfunction addAlias(ctx: ExtractCtx, name: string, mark: () => void) {\n if (ctx.aliasNames.has(name)) return\n ctx.aliasNames.add(name)\n mark()\n}\n\n/** `const {a, b: {c}} = <this|别名>` 的模式绑定:成员位记依赖,rest/数组解构放弃该键 */\nfunction bindMemberPattern(ctx: ExtractCtx, pat: any, prefix: string[], mark: () => void) {\n if (!pat) return\n switch (pat.type) {\n case 'Identifier':\n record(ctx, [...prefix, pat.name]) // 记录不触发 fixpoint(非别名变化)\n break\n case 'ObjectPattern':\n for (const p of pat.properties ?? []) {\n if (p.type === 'RestElement') {\n failAt(ctx, 'destructure-rest')\n return\n }\n const key = keyName(p.key)\n if (!key || p.computed) {\n failAt(ctx, 'destructure-key')\n return\n }\n bindMemberPattern(ctx, p.value, [...prefix, key], mark)\n }\n break\n case 'AssignmentPattern':\n bindMemberPattern(ctx, pat.left, prefix, mark)\n break\n case 'ArrayPattern':\n case 'RestElement':\n failAt(ctx, 'destructure-array')\n break\n }\n}\n\n/** 声明绑定:顶层 Identifier → 别名;ObjectPattern → 按成员捕获记依赖 */\nfunction bindFrom(ctx: ExtractCtx, pat: any, mark: () => void) {\n if (!pat) return\n switch (pat.type) {\n case 'Identifier':\n addAlias(ctx, pat.name, mark)\n break\n case 'ObjectPattern':\n for (const p of pat.properties ?? []) {\n if (p.type === 'RestElement') {\n failAt(ctx, 'bind-rest')\n return\n }\n const key = keyName(p.key)\n if (!key || p.computed) {\n failAt(ctx, 'bind-key')\n return\n }\n bindMemberPattern(ctx, p.value, [key], mark)\n }\n break\n case 'AssignmentPattern':\n bindFrom(ctx, pat.left, mark)\n break\n case 'ArrayPattern':\n failAt(ctx, 'bind-array')\n break\n }\n}\n\n/**\n * fixpoint 预扫描:收集别名等价类与解构捕获。\n * 进入箭头(共享 this),不进入 FunctionExpression/FunctionDeclaration/Class 体。\n */\nfunction prescanBody(ctx: ExtractCtx, nodes: any[]): void {\n const walk = (node: any, mark: () => void): void => {\n if (!node || typeof node.type !== 'string') return\n const t = node.type\n if (\n t === 'FunctionExpression' ||\n t === 'FunctionDeclaration' ||\n t === 'ClassDeclaration' ||\n t === 'ClassExpression'\n ) {\n return\n }\n if (t === 'VariableDeclarator') {\n const init = unwrapExpr(node.init)\n if (init) {\n if (init.type === 'ThisExpression') {\n ctx.exemptThis.add(init)\n bindFrom(ctx, node.id, mark)\n } else if (init.type === 'Identifier' && ctx.aliasNames.has(init.name)) {\n bindFrom(ctx, node.id, mark)\n }\n }\n } else if (t === 'AssignmentExpression') {\n const right = unwrapExpr(node.right)\n if (right && node.left?.type === 'Identifier') {\n if (right.type === 'ThisExpression') {\n ctx.exemptThis.add(right)\n addAlias(ctx, node.left.name, mark)\n } else if (right.type === 'Identifier' && ctx.aliasNames.has(right.name)) {\n addAlias(ctx, node.left.name, mark)\n }\n }\n }\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const child = node[key]\n if (Array.isArray(child)) {\n for (const c of child) walk(c, mark)\n } else if (child && typeof child === 'object' && typeof child.type === 'string') {\n walk(child, mark)\n }\n }\n }\n\n for (let round = 0; round < 16; round++) {\n let changed = false\n const mark = () => {\n changed = true\n }\n for (const n of nodes) walk(n, mark)\n if (!changed) return\n if (round === 15) failAt(ctx, 'alias-round15') // 别名链过深未收敛 → 保守放弃\n }\n}\n\n// ---------------------------------------------------------------------------\n// 链解析与根分级\n// ---------------------------------------------------------------------------\n\n/**\n * 从表达式解析「以 this/别名起始的最长静态路径」。\n * 返回 `{ path: [...] }`(可能为空 = 裸 this/别名)、`{ path: null }`(根级动态 `this[x]`)、\n * `null`(非 this/别名 起始)。遇到中间 computed 止步于前缀(更深下标由 scanChainRemainders 扫描)。\n */\nfunction resolveChain(ctx: ExtractCtx, node: any): { path: string[] | null } | null {\n let cur = unwrapExpr(node)\n if (cur.type === 'ThisExpression') return { path: [] }\n if (cur.type === 'Identifier' && ctx.aliasNames.has(cur.name)) return { path: [] }\n if (cur.type === 'MemberExpression' || cur.type === 'OptionalMemberExpression') {\n if (cur.computed) {\n const inner = resolveChain(ctx, cur.object)\n if (!inner || inner.path === null) return inner\n if (inner.path.length === 0) return { path: null } // this[x] 根级动态\n return inner // 前缀止于 computed;下标表达式留给 scanChainRemainders\n }\n const name = keyName(cur.property)\n const inner = resolveChain(ctx, cur.object)\n if (!inner) return null\n if (inner.path === null) return inner\n if (!name) return { path: null }\n return { path: [...inner.path, name] }\n }\n return null\n}\n\n/** 分级结果:命中(已记录/已内联)/ 未命中(继续向上找)/ 失败。 */\nfunction applyLevel(\n ctx: ExtractCtx,\n level: {\n fields: Map<string, any>\n queryFields?: Set<string>\n bodies?: Map<string, any>\n methods?: Set<string>\n getters?: Set<string>\n /** 该 level 对应的类节点(③ 级内联扫体时作为 `super` 的解析起点) */\n owner?: any\n },\n path: string[],\n): 'hit' | 'miss' | 'fail' {\n const root = path[0]\n if (level.fields.has(root)) {\n record(ctx, path)\n return 'hit'\n }\n if (level.queryFields?.has(root)) {\n record(ctx, path) // @query 非响应式:死条目(运行时永不通知,无害)\n return 'hit'\n }\n if (level.bodies?.has(root)) {\n inlineScan(ctx, level.bodies.get(root), level.owner)\n return 'hit' // 内联扫体,不记 root\n }\n if (level.methods?.has(root) || level.getters?.has(root)) return 'fail' // 有名无体 → 未知\n return 'miss'\n}\n\n/**\n * `CompElem` 运行时基类自带的响应式信号根(=`__s` 的键)。\n *\n * 基类不经过本编译器,其字段对静态分析完全不可见 ⇒ `this.slots.x` 的链根 `slots`\n * 在五级分级里全部 miss(own 无 / 祖先查不到 / 非跨文件判定)⇒ `unknown-root`\n * ⇒ **整个 cssVars 退到运行期全根兜底**。而 `slots` 恰恰是响应式的\n * (`CompElem.#slotsSig()` → `s.slots = signal(...)`,CompElem.ts:1005-1006),\n * 静态完全可定 —— 不该为一个已知信号付出「每轮遍历并订阅全部信号」的代价。\n *\n * ⚠️ 只收**确实落在 `__s` 上**的键。`@query`/`@queryAll` 不是信号,绝不能进来 ——\n * 那类根由 ② 级(`queryFields`)负责,记为「死条目」,codegen 侧用 `?.` 兜住。\n */\nconst BASE_SIGNAL_ROOTS: ReadonlySet<string> = new Set(['slots'])\n\n/** 链根五级分级:⓪ 基类内建信号 → ① own → ② query → ③ own bodies → ④ 同文件祖先 → ⑤ 未知失败。 */\nfunction classifyPath(ctx: ExtractCtx, path: string[]): void {\n const comp = ctx.comp\n // ⓪ 基类内建信号(`slots`)——先于 own 判定:它不可能出现在任何用户类的 fields 里,\n // 但必须能被认出来,否则整条链掉进 ⑤ 级全根兜底。\n if (BASE_SIGNAL_ROOTS.has(path[0])) {\n record(ctx, path)\n return\n }\n const own = applyLevel(\n ctx,\n {\n fields: comp.fields,\n queryFields: comp.queryFields,\n bodies: comp.bodies,\n methods: comp.ownMethods,\n getters: comp.ownGetters,\n owner: comp.cls ?? ctx.localClasses.get(comp.className),\n },\n path,\n )\n if (own !== 'miss') {\n if (own === 'fail') failAt(ctx, 'own-no-body')\n return\n }\n\n let node: any = comp.cls ?? ctx.localClasses.get(comp.className)\n const seenCls = new Set<any>()\n for (let i = 0; node && i < 8; i++) {\n const sup = superClassName(node)\n if (!sup) break\n if (ctx.resolve(sup) === 'CompElem') break // 链终点:根未知\n const parent = ctx.localClasses.get(sup)\n if (!parent || seenCls.has(parent)) {\n if (!parent) failAt(ctx, 'cross-file') // 跨文件基类 → 未知\n break\n }\n seenCls.add(parent)\n const info = classInfoOf(parent, ctx.resolve)\n const hit = applyLevel(\n ctx,\n {\n fields: info.fields,\n queryFields: info.queryFields,\n bodies: info.bodies,\n methods: info.methods,\n getters: info.getters,\n owner: parent,\n },\n path,\n )\n if (hit !== 'miss') {\n if (hit === 'fail') failAt(ctx, 'ancestor-no-body')\n return\n }\n node = parent\n }\n failAt(ctx, 'unknown-root') // 五级尽未命中 → 该键省略 → 运行时全根兜底\n}\n\n/**\n * `super.cssVars` 的依赖内联:沿**同文件** super 链找第一个定义了 `cssVars` 的祖先,\n * 内联扫它的体(语义见 scanNode 的 Super 分支注释)。\n *\n * 三种走到 `failAt` 的情形,都只能靠跨文件解析才能解决,本版本不做:\n * 1. 链上有**跨文件**基类 —— 它的 cssVars 体不在这份 AST 里;\n * 2. 同文件链上**无人**定义 cssVars(链终 CompElem,其 `render()` 返回 null、\n * 也不参与编译,没有产物可继承);\n * 3. 递归超限(父类 cssVars 里又 `super.cssVars`,由 inlineScan 的 depth 守卫兜住)。\n */\nfunction inlineScanSuperCssVars(ctx: ExtractCtx): void {\n let node: any = ctx.ownerClass\n const seenCls = new Set<any>()\n for (let i = 0; node && i < 8; i++) {\n const sup = superClassName(node)\n if (!sup) break\n if (ctx.resolve(sup) === 'CompElem') break // 链终点:基类无 cssVars 体\n const parent = ctx.localClasses.get(sup)\n if (!parent) {\n failAt(ctx, 'cross-file')\n return\n }\n if (seenCls.has(parent)) break\n seenCls.add(parent)\n const body = classInfoOf(parent, ctx.resolve).cssVarsBody\n if (body && body.length) {\n // 递归的 `super.cssVars` 必须从 **parent** 继续往上找,而不是回到本组件\n inlineScan(ctx, body, parent)\n return\n }\n node = parent\n }\n failAt(ctx, 'super-cssVars')\n}\n\n// ---------------------------------------------------------------------------\n// 主扫描\n// ---------------------------------------------------------------------------\n\nfunction subtreeHasThis(node: any): boolean {\n if (!node || typeof node.type !== 'string') return false\n if (node.type === 'ThisExpression') return true\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const c: any = node[key]\n if (Array.isArray(c)) {\n for (const x of c) if (subtreeHasThis(x)) return true\n } else if (c && typeof c === 'object' && typeof c.type === 'string') {\n if (subtreeHasThis(c)) return true\n }\n }\n return false\n}\n\n/** 裸别名的合法位:声明/赋值/链根。其余(实参、return、spread…)= 逃逸 → 失败。 */\nfunction legalAliasPos(node: any, parent: any): boolean {\n if (!parent) return false\n if (parent.type === 'VariableDeclarator') return parent.id === node || parent.init === node\n if (parent.type === 'AssignmentExpression') return parent.left === node\n if (parent.type === 'MemberExpression' || parent.type === 'OptionalMemberExpression') {\n return parent.object === node\n }\n return false\n}\n\n/** 链分类后补扫 computed 下标表达式(`this.arr[this.i]` 的 `this.i` 不可漏)。 */\nfunction scanChainRemainders(ctx: ExtractCtx, node: any): void {\n let cur: any = node\n while (cur) {\n if (isTsWrapper(cur)) {\n cur = cur.expression\n continue\n }\n if (cur.type === 'MemberExpression' || cur.type === 'OptionalMemberExpression') {\n if (cur.computed) scanNode(ctx, cur.property, cur)\n cur = cur.object\n continue\n }\n break\n }\n}\n\nfunction toStatements(bodyNode: any): any[] {\n if (!bodyNode) return []\n if (Array.isArray(bodyNode)) return bodyNode // cssVarsBody 已是语句数组(见 §super.cssVars)\n if (bodyNode.type === 'BlockStatement') return bodyNode.body ?? []\n return [{ type: 'ExpressionStatement', expression: bodyNode }]\n}\n\n/**\n * 内联扫体:方法/getter/箭头字段的函数体直接展开扫描(不记 root)。\n *\n * @param owner 该体**所属的类节点**(祖先的体传祖先自己)。体内若出现\n * `super.cssVars`,解析要从这个类继续往上走,故按栈式保存/恢复 `ctx.ownerClass`。\n * 省略 = 体属于 `ctx.ownerClass` 当前指向的类。\n */\nfunction inlineScan(ctx: ExtractCtx, bodyNode: any, owner?: any): void {\n if (ctx.failed) return\n if (ctx.depth >= 8) {\n failAt(ctx, 'depth') // 深度超限(递归调用环)→ 保守放弃\n return\n }\n ctx.depth++\n const snapAlias = new Set(ctx.aliasNames)\n const snapOwner = ctx.ownerClass\n if (owner !== undefined) ctx.ownerClass = owner\n try {\n const nodes = toStatements(bodyNode)\n prescanBody(ctx, nodes)\n for (const stmt of nodes) scanNode(ctx, stmt, null)\n } finally {\n ctx.aliasNames = snapAlias\n if (owner !== undefined) ctx.ownerClass = snapOwner\n ctx.depth--\n }\n}\n\nfunction scanNode(ctx: ExtractCtx, node: any, parent: any): void {\n if (ctx.failed || !node || typeof node.type !== 'string') return\n if (ctx.seen.has(node)) return\n ctx.seen.add(node)\n\n // --- TS 包装:透传 parent(裸 this/别名的合法位判定要看真实位置) ---\n if (isTsWrapper(node)) {\n scanNode(ctx, node.expression, parent)\n return\n }\n\n // --- 非箭头函数:体内含 this(含参数默认值/嵌套箭头)→ 非组件 this → 放弃 ---\n if (node.type === 'FunctionExpression' || node.type === 'FunctionDeclaration') {\n if (subtreeHasThis(node)) {\n failAt(ctx, 'fn-this')\n return\n }\n // 无 this → 参数/体可安全下钻(通用规则)\n }\n\n // --- super:仅 `super.cssVars` 可解(同文件父类),其余成员一律未知 ---\n if (node.type === 'Super') {\n // 典型形态:`assign(super.cssVars, {…})`(compelem-ui 的 `Editable`)。\n // 父类 cssVars 的响应式依赖**就是本组件的依赖** —— 合并后的返回值由父类那份\n // 决定,所以直接内联扫父类的 cssVars 体即可,父类体就在手边(同文件),\n // **不需要跨文件解析**。此前这里对所有 `super` 一律 failAt,白白让这类组件\n // 整个 cssVars 退到运行期全根兜底。\n const m = parent\n const isCssVars =\n m &&\n (m.type === 'MemberExpression' || m.type === 'OptionalMemberExpression') &&\n m.object === node &&\n keyName(m.property) === 'cssVars'\n if (isCssVars) {\n inlineScanSuperCssVars(ctx)\n return\n }\n failAt(ctx, 'super')\n return\n }\n\n // --- this/别名链(只在最外层分类一次) ---\n if (node.type === 'MemberExpression' || node.type === 'OptionalMemberExpression') {\n const parentIsMember =\n parent &&\n (parent.type === 'MemberExpression' || parent.type === 'OptionalMemberExpression') &&\n parent.object === node\n if (!parentIsMember) {\n const resolved = resolveChain(ctx, node)\n if (resolved) {\n if (resolved.path === null) {\n failAt(ctx, 'dynamic-index') // 根级动态 this[x]\n return\n }\n classifyPath(ctx, resolved.path)\n if (ctx.failed) return\n scanChainRemainders(ctx, node)\n return\n }\n // 非 this/别名 起始 → 通用下钻(object 内可能有调用包裹的 this 链)\n }\n }\n\n // --- 裸 this(豁免位 = 别名/解构声明 init,由预扫描记录) ---\n if (node.type === 'ThisExpression') {\n if (!ctx.exemptThis.has(node)) {\n failAt(ctx, 'bare-this')\n return\n }\n return\n }\n\n // --- 裸别名(链位已由 classify 消费;到这里 = 逃逸) ---\n if (node.type === 'Identifier' && ctx.aliasNames.has(node.name)) {\n if (!legalAliasPos(node, parent)) {\n failAt(ctx, 'alias-escape')\n return\n }\n return\n }\n\n // --- 其余标识符(自由/局部/形参/模块绑定):一律忽略,规则5 ---\n // --- 通用下钻:三目/逻辑/嵌套箭头纯语法并集 ---\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const child = node[key]\n if (Array.isArray(child)) {\n for (const c of child) scanNode(ctx, c, node)\n } else if (child && typeof child === 'object' && typeof child.type === 'string') {\n scanNode(ctx, child, node)\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// 入口\n// ---------------------------------------------------------------------------\n\nfunction runExtract(\n comp: ComponentAnalysis,\n localClasses: Map<string, any> | undefined,\n body: any[],\n): string[] | undefined {\n const ctx: ExtractCtx = {\n comp,\n localClasses: localClasses ?? new Map(),\n resolve: compelemResolver(comp.compelemImports),\n aliasNames: new Set<string>(),\n exemptThis: new Set<object>(),\n deps: new Set<string>(),\n failed: false,\n seen: new WeakSet<object>(),\n depth: 0,\n ownerClass: comp.cls ?? (localClasses ?? new Map()).get(comp.className),\n }\n prescanBody(ctx, body)\n for (const stmt of body) scanNode(ctx, stmt, null)\n if (ctx.failed) return undefined\n return [...ctx.deps]\n}\n\n/**\n * 提取 `get cssVars()` 的响应式依赖。无法静态化时返回 undefined(不注入,运行时全根兜底)。\n * 无 cssVars getter 或 getter 体为空 → 返回 [](合法的空依赖)。\n */\nexport function extractCssDeps(\n comp: ComponentAnalysis,\n localClasses?: Map<string, any>,\n): string[] | undefined {\n if (!comp.cssVarsBody) return undefined // 无自有 getter(可能继承基类)→ 不注入\n if (!comp.cssVarsBody.length) return []\n return runExtract(comp, localClasses, comp.cssVarsBody)\n}\n\n/**\n * 提取各 `@computed` getter 的响应式依赖(per-key):\n * - 失败键跳过(该键运行时全根兜底);全部失败 → 注入空对象;\n * - 无 @computed → undefined(不注入)。\n */\nexport function extractComputedDeps(\n comp: ComponentAnalysis,\n localClasses?: Map<string, any>,\n): Record<string, string[]> | undefined {\n if (!comp.computedBodies || comp.computedBodies.size === 0) return undefined\n const out: Record<string, string[]> = {}\n for (const [name, body] of comp.computedBodies) {\n if (!body.length) {\n out[name] = []\n continue\n }\n const deps = runExtract(comp, localClasses, body)\n if (deps === undefined) continue // 失败键省略 → 运行时全根兜底\n out[name] = deps\n }\n return out\n}\n","/**\n * @prop/@state 初始值的**编译期**类型推导。\n *\n * 字段声明在 field-extract 里被整体删除,初始值只流向构造体的 `signal(<init>)`;\n * 为了让 `__ce_static__.props` 在首实例之前就带类型,这里从初始化器推导\n * `typeName`。值本身不再写进静态表(`defaultValue` 早已移除)——静态表里的\n * 对象/数组与实例信号不是同一个对象,写进去只会误导。\n *\n * 推导规则严格镜像 compelem 运行时 `PropTypeMap`:\n * boolean→Boolean / string→String / number→Number / object→Object /\n * array→Array / function→Function;null / bigint / regex 不携带可靠类型信息,不写。\n */\nimport { unwrapTsExpr } from './conventions'\n\nexport interface InitMeta {\n /** 推导出的构造器名(String / Number / Boolean / Array / Object / Function)。 */\n typeName?: string\n}\n\nconst EMPTY: InitMeta = {}\n\n/** ESTree 形态(`Literal` + value/regex/bigint),babel 原生形态也一并认。 */\nexport function isNumericLit(n: any): boolean {\n return n?.type === 'NumericLiteral' || (n?.type === 'Literal' && typeof n.value === 'number')\n}\nexport function isStringLit(n: any): boolean {\n return n?.type === 'StringLiteral' || (n?.type === 'Literal' && typeof n.value === 'string')\n}\nexport function isBooleanLit(n: any): boolean {\n return n?.type === 'BooleanLiteral' || (n?.type === 'Literal' && typeof n.value === 'boolean')\n}\n/** 一元 `+` / `-` 作用在数值字面量上(`-1`、`+0`)—— typeof 仍是 number。 */\nexport function isNumericUnary(n: any): boolean {\n return (\n n?.type === 'UnaryExpression' &&\n (n.operator === '+' || n.operator === '-') &&\n isNumericLit(unwrapTsExpr(n.argument))\n )\n}\n\n/**\n * 推导字段初始值的编译期类型。\n * @param rawNode `PropertyDefinition.value`(undefined = 无初始值)\n */\nexport function inferInitMeta(rawNode: any): InitMeta {\n const node = unwrapTsExpr(rawNode)\n if (!node) return EMPTY\n\n if (isStringLit(node)) return { typeName: 'String' }\n if (isNumericLit(node)) return { typeName: 'Number' }\n if (isBooleanLit(node)) return { typeName: 'Boolean' }\n // null / bigint / regex:运行时分别推成 Object / undefined / Object,都不比“不写”更可靠。\n if (node.type === 'Literal' || node.type === 'NullLiteral' || node.type === 'BigIntLiteral' || node.type === 'RegExpLiteral') {\n return EMPTY\n }\n if (node.type === 'TemplateLiteral') return { typeName: 'String' }\n if (node.type === 'UnaryExpression') {\n if (isNumericUnary(node)) return { typeName: 'Number' }\n if (node.operator === '!') return { typeName: 'Boolean' }\n return EMPTY\n }\n if (node.type === 'ArrayExpression') return { typeName: 'Array' }\n if (node.type === 'ObjectExpression') return { typeName: 'Object' }\n if (node.type === 'ArrowFunctionExpression' || node.type === 'FunctionExpression') {\n return { typeName: 'Function' }\n }\n return EMPTY\n}\n","/**\n * @watch 编译期解析(watch 前移)。\n *\n * 运行时 @watch 装饰器在类定义期用 myfx `get(options, 'deep'/'immediate'/'once')`\n * 逐键解析选项并注册六张 watch 表;这里把「选项解析」移到编译期:\n * - 静态解析 @watch(source, options?) → watchEffects 工厂数组注入 __ce_static__,\n * 并从源码中**删除 @watch 装饰器调用**(处理器方法保留);\n * - 运行时由 CompElem 构造期 `for (const factory of ceStatic.watchEffects)\n * effect(factory(this))` 消费 —— 每个工厂产出一个 signal effect,\n * 直接读 `rc.__s.<source>.value` 建立依赖,变更即回调处理器;\n * - 解析失败(source / options 非静态字面量)→ E-WATCH-ARG(error 级,阻断构建),\n * 此时**不删除装饰器、不注入 watchEffects**,运行时装饰器路径照常兜底。\n *\n * source 支持形态:字符串字面量、字符串字面量数组、模块级 const 字符串常量\n * (含成员访问,如 EV.TITLE —— 对齐 conventions 的 stringConsts 机制)。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { keyName, IDENT_RE, stringify } from '../utils/ast'\nimport { decoratorName, type ConventionError, type ConventionsContext } from './conventions'\nimport { classInfoOf, compelemResolver, superClassName } from './component'\n\n/** 源码字面量序列化(与 codegen 各文件的同名局部常量一致) */\n\nexport interface WatchEntry {\n /** 处理器方法名 */\n name: string\n /** 监控路径(多路径已展开) */\n sources: string[]\n deep?: boolean\n immediate?: boolean\n once?: boolean\n /** 处理器是否为 static 成员 */\n isStatic?: boolean\n}\n\nexport interface WatchExtractResult {\n entries: WatchEntry[]\n /** 需从源码删除的 @watch(...) 装饰器 span(已做整行清理) */\n removals: Array<{ start: number; end: number }>\n errors: ConventionError[]\n /**\n * `entries` 是否已并入**完整同文件**基类链的 @watch(祖先在前)。\n *\n * 仅当链最终到达 CompElem 时为 true。此时父类自己发射的 `watchEffects`\n * 与已内联的前缀内容完全相同,再拼一次会让同一批处理器执行两次。\n * 链上有跨文件基类时必须为 false,让 emitWatchEffects 保留 `super` 拼接。\n */\n inlinedAncestors: boolean\n}\n/**\n * 生成 signal 模式 watch effect 工厂数组。\n * 每个 watch 条目 → `(rc) => effectFn`。\n *\n * ⚠️ 处理器实参必须与**库 API** 一致,本实现按下列权威来源对齐:\n * - `compelem/README.md`「属性/状态监视」:\n * `@watch(\"width\", { immediate: true }) watchWidth(nv: string, ov: string, sourceName: string)`\n * - `WatchHandler` 签名:\n * `(newValue, oldValue, source: string, subNewValue?, subOldValue?) => any`\n *\n * 两个由此推出的语义要点:\n * 1. **每个 source 各自独立判定与独立调用**。多源 `@watch(['a','b'])` 时处理器被\n * 调用**多次**,每次带各自的 nv/ov/sourceName —— 靠 sourceName 区分是哪个源\n * 触发的(README 明确这么用)。\n * 2. `ov` 是**该源的上一次值**,不是数组。\n *\n * deep:signal 模型下没有 Proxy,**就地修改**(`obj.n.v = 7`)不会写信号,\n * 因此不可能被任何 effect 观测到;此处仅对 `deep: true` 的源退化为 JSON 深比较,\n * 用于「整体换成新引用但内容相同」时不误触发。非 deep 源一律 `!==` 引用比较\n * (比 JSON.stringify 便宜得多,且对对象源语义正确)。\n *\n * once:按源各自计一次。\n * immediate:创建时按源各调用一次,ov 为 undefined。\n */\nexport function generateWatchEffects(entries: WatchEntry[]): string {\n const factories: string[] = []\n for (const entry of entries) {\n const { name, sources, immediate, once, isStatic, deep } = entry\n /**\n * static handler 不在原型上,必须经构造器取:`rc.constructor.<name>(...)`。\n * 写成 `rc.<name>` 会得到 undefined,effect 首次触发即抛\n * \"rc.onA is not a function\"。\n */\n const recv = isStatic ? 'rc.constructor' : 'rc'\n /**\n * source → 读取表达式。\n *\n * source 可以是**多级路径**。signal 模型下 `__s` 只按根键建信号,\n * 所以 `\"a.b\"` 必须读成 `rc.__s.a.value.b`;直接拼成 `rc.__s.a.b.value`\n * 会把整串当键名,运行时得到 `undefined.value`。\n */\n const readOf = (src: string): string => {\n const segs = src.split('.')\n const root = segs[0]\n // 多级路径必须逐段可选链:首轮对象可能尚未初始化(`@watch('form.name')`)。\n const rest = segs.slice(1).map((x) =>\n IDENT_RE.test(x) ? `?.${x}` : `?.[${JSON.stringify(x)}]`,\n )\n return `rc.__s.${root}?.value${rest.join('')}`\n }\n const reads = sources.map(readOf)\n const seed = `[${reads.join(', ')}]`\n const idx = sources.map((_, i) => i)\n /**\n * deep 源用「序列化缓存」:每次触发只对 n[i] 做**一次** JSON.stringify,\n * 与上一轮缓存的字符串比较。\n * s[i] 在工厂期用同一读取表达式播种,保证 immediate 语义不变\n * (首轮 n 与播种 o 相同 → 不触发)。\n */\n const useStrCache = deep === true\n const sSeed = useStrCache ? ` const s = [${reads.map((r) => `JSON.stringify(${r})`).join(', ')}];` : ''\n const qDecl = useStrCache ? 'let q; ' : ''\n /** 该源是否真的变了:deep 走缓存字符串比较,其余走引用比较 */\n const changed = (i: number) =>\n useStrCache\n ? `(q = JSON.stringify(n[${i}])) !== s[${i}] && (s[${i}] = q, true)`\n : `n[${i}] !== o[${i}]`\n/**\n * 变更回调:(nv, ov, sourceName)。\n *\n * ⚠️ **必须包 `untrack`**:这个调用发生在 effect 体**内部**(`CompElem.setup` 里\n * `effect(factory(this))`),作者方法体里任何额外的信号读都会被 `track()` 收编成\n * 本 watch 的依赖 —— 而本 watch 的订阅集本该**只含装饰器里声明的源**(`reads` 是\n * 静态算出的)。例:\n *\n * ```ts\n * @watch('a', 'aChanged')\n * aChanged(nv) { this.a = nv; console.log(this.debugInfo) } // debugInfo 被误订阅\n * ```\n *\n * 方法体对 codegen 是黑盒(用户代码),无法静态剔除里面的读,故在调用点整体\n * 关闭收集。这是 `untrack` 唯一的内部使用点,也是它存在的理由。\n */\n const call = (i: number) => `untrack(() => ${recv}.${name}(n[${i}], o[${i}], ${stringify(sources[i])}))`\n /** immediate 前奏:ov 此刻尚不存在,按 API 传 undefined */\n const callInit = (i: number) => `untrack(() => ${recv}.${name}(o[${i}], undefined, ${stringify(sources[i])}))`\n const store = idx.map((i) => `o[${i}] = n[${i}]`).join('; ')\n\n if (once && immediate) {\n // 创建时按源各触发一次,之后永不触发\n factories.push(\n `(rc) => { const o = ${seed}; ${idx.map(callInit).join('; ')}; return () => {} }`,\n )\n } else if (once) {\n // o 在建 effect 时播种 → 首轮判定「无变化」;f 按源各自只允许一次\n factories.push(\n `(rc) => { const o = ${seed};${sSeed} const f = ${JSON.stringify(idx.map(() => 0))}; ` +\n `return () => { const n = [${reads.join(', ')}]; ${qDecl}` +\n idx.map((i) => `if (!f[${i}] && ${changed(i)}) { f[${i}] = 1; ${call(i)} }`).join('; ') +\n `; ${store} } }`,\n )\n } else if (immediate) {\n factories.push(\n `(rc) => { const o = ${seed};${sSeed} ${idx.map(callInit).join('; ')}; ` +\n `return () => { const n = [${reads.join(', ')}]; ${qDecl}` +\n idx.map((i) => `if (${changed(i)}) { ${call(i)} }`).join('; ') +\n `; ${store} } }`,\n )\n } else {\n factories.push(\n `(rc) => { const o = ${seed};${sSeed} return () => { const n = [${reads.join(', ')}]; ${qDecl}` +\n idx.map((i) => `if (${changed(i)}) { ${call(i)} }`).join('; ') +\n `; ${store} } }`,\n )\n }\n }\n return `[${factories.join(',')}]`\n}\n\nfunction strOf(n: any): string | null {\n if (!n) return null\n if (n.type === 'StringLiteral') return String(n.value)\n if (n.type === 'Literal' && typeof n.value === 'string') return String(n.value)\n return null\n}\n\nfunction boolOf(n: any): boolean | null {\n if (!n) return null\n if (n.type === 'BooleanLiteral') return n.value === true\n if (n.type === 'Literal' && typeof n.value === 'boolean') return n.value\n return null\n}\n\n/**\n * 该组件(含**同文件内**基类链)会被建成 `__s` 信号的键集。\n *\n * `comp.fields` 只含本类**自身**成员(classInfoOf 不做基类合并),所以子类上\n * `@watch(\"title\")`(title 来自父类 @state)会被误判为非信号。必须沿 extends 链上溯。\n *\n * 返回 null = 键集**不可知**,调用方应跳过校验(宁可放过,也不误伤)。两种来源:\n * 1. 链上有本文件之外的基类(不随本文件编译,字段不可穷举);\n * 2. 链上出现 `extends <工厂调用>` 形态的 **mixin** —— mixin 的 @prop/@state 落在\n * 另一份 `__ce_static__` 里,同样不可穷举(见下方循环内的说明)。\n * 这与「基类在别处」时组件通常已被 D6 阻断的情形一致;而 mixin 组件是**刻意放行**的\n * (`component.ts` 的 `unknownSuperAdmitted → skipInjection`),故这条更不能误报。\n */\nfunction signalKeysOf(\n cls: any,\n ctx: ConventionsContext,\n comp: ComponentAnalysis,\n ownFields: Set<string>,\n): Set<string> | null {\n const keys = new Set<string>(ownFields)\n let cur = cls\n for (let depth = 0; depth < 8; depth++) {\n // 无 extends 子句 → 链到此为止,键集**完整可知**,可以直接返回。\n if (!cur.superClass) return keys\n const sup = superClassName(cur)\n // 有 extends 但基类不是可解析的标识符(`extends Virtualized(CompElem)` 这类\n // **mixin 工厂调用**)→ mixin 贡献的 @prop/@state 编译进的是**另一个**\n // __ce_static__,本文件里无法穷举 ⇒ 与「基类在别处」同构,返回 null 让调用方\n // 跳过校验(宁可放过,也不误伤)。\n // 反例(修复前的行为):`class Tree extends Virtualized(CompElem)` 上\n // `@watch('vRowHeight')`(vRowHeight 由 mixin 声明)会被误报 E-WATCH-SOURCE\n // 而阻断构建 —— 这类组件在本分支之外是刻意放行的(component.ts 判\n // unknownSuperAdmitted → skipInjection),所以必须在这里放行。\n if (!sup) return null\n // CompElem 是框架基类,永远在链尾且不贡献响应式字段(slots 除外)——\n // 必须当终止条件返回已知键集,不能当成「本文件外的未知基类」而放弃校验,\n // 否则所有直接继承 CompElem 的组件(也就是绝大多数)都跳过检查。\n if (comp.compelemImports.get(sup) === 'CompElem') {\n keys.add('slots')\n return keys\n }\n const parent = ctx.localClasses.get(sup)\n if (!parent) return null // 基类在别处 → 不可知\n const info = classInfoOf(parent, compelemResolver(comp.compelemImports))\n for (const k of info.fields.keys()) keys.add(k)\n cur = parent\n }\n return null // 链过深,视为不可知\n}\n\n/** 解析 source 实参 → 路径数组;不可静态解析返回 null。(field-extract 复用) */\nexport function resolveSources(arg: any, ctx: ConventionsContext): string[] | null {\n const s = strOf(arg)\n if (s != null) return [s]\n if (arg?.type === 'ArrayExpression') {\n const out: string[] = []\n for (const el of arg.elements ?? []) {\n const v = strOf(el)\n if (v == null) return null\n out.push(v)\n }\n return out.length ? out : null\n }\n // 模块级 const(字符串或字符串常量的成员访问,如 EV.TITLE)\n if (arg?.type === 'Identifier') {\n const v = ctx.stringConsts.get(arg.name)\n return typeof v === 'string' ? [v] : null\n }\n if (arg?.type === 'MemberExpression' && !arg.computed) {\n let parts: string[] = []\n let node = arg\n while (node?.type === 'MemberExpression' && !node.computed) {\n const k = keyName(node.property)\n if (!k) return null\n parts.unshift(k)\n node = node.object\n }\n if (node?.type === 'Identifier') {\n const base = ctx.stringConsts.get(node.name)\n if (base && typeof base === 'object') {\n let cur: any = base\n for (const p of parts) {\n cur = cur[p]\n if (cur == null) return null\n }\n return typeof cur === 'string' ? [cur] : null\n }\n }\n }\n return null\n}\n\n/**\n * 装饰器独占一行时把删除范围扩到整行(含换行),避免留下纯缩进的空行。(field-extract 复用)\n */\nexport function lineSpan(code: string, start: number, end: number): { start: number; end: number } {\n const ls = code.lastIndexOf('\\n', start - 1) + 1\n const leIdx = code.indexOf('\\n', end)\n const lineEnd = leIdx === -1 ? code.length : leIdx\n const before = code.slice(ls, start)\n const after = code.slice(end, lineEnd)\n if (/^[ \\t]*$/.test(before) && /^[ \\t]*$/.test(after)) {\n return { start: ls, end: Math.min(lineEnd + 1, code.length) }\n }\n return { start, end }\n}\n\n/**\n * 提取组件类上全部 @watch 配置。错误(E-WATCH-ARG / E-WATCH-SOURCE)与条目互斥:\n * 有错误时调用方应放弃删除与注入(运行时装饰器路径兜底)。\n *\n * ⚠️ **继承**:条目里会**先并入同文件基类链上的 @watch**(祖先在前),因为\n * `watchEffects` 是按 `(this.constructor).__ce_static__` 逐实例取的 —— 子类若只\n * 注入自己的 watch,父类实例上的处理器在子类实例上就完全不生效。\n * 顺序「祖先在前」使父类处理器先于子类触发。\n *\n * 只并入**条目**,不并入 removals:祖先在 analyzeFile 里是独立组件,删自己的装饰器。\n */\nexport function extractWatchers(\n comp: ComponentAnalysis,\n code: string,\n ctx: ConventionsContext,\n): WatchExtractResult {\n const result: WatchExtractResult = { entries: [], removals: [], errors: [], inlinedAncestors: false }\n const cls = comp.cls ?? ctx.localClasses.get(comp.className)\n if (!cls) return result\n\n const resolve = compelemResolver(comp.compelemImports)\n const isWatchDec = (local: string) => comp.compelemImports.get(local) === 'watch'\n\n /**\n * 沿 extends 链上溯同文件基类,返回 [最远祖先 … 直接父类] 以及链是否**完整**。\n *\n * complete = 链最终到达 CompElem(或无 super)。只有完整链才能把祖先条目内联并\n * 抑制 `super.watchEffects`;一旦遇到跨文件基类,祖先数组里可能还含更上层\n * (跨文件)的 watch,必须保留 `super` 拼接,否则会静默丢掉它们。\n */\n const ancestorChain = (): { chain: Array<{ node: any; fields: Set<string> }>; complete: boolean } => {\n const chain: Array<{ node: any; fields: Set<string> }> = []\n let cur = cls\n let complete = false\n for (let depth = 0; depth < 8; depth++) {\n const sup = superClassName(cur)\n if (!sup) { complete = true; break }\n if (resolve(sup) === 'CompElem') { complete = true; break }\n const parent = ctx.localClasses.get(sup)\n if (!parent) { complete = false; break } // 基类在本文件外,其 watch 由其自身所在文件处理\n chain.push({ node: parent, fields: new Set(classInfoOf(parent, resolve).fields.keys()) })\n cur = parent\n }\n return { chain: chain.reverse(), complete }\n }\n\n /**\n * 收集单个类的 @watch 条目。\n * @param own true = 本类(记录 removals / errors);false = 祖先(只取条目)\n */\n const collect = (node: any, knownFields: Set<string>, own: boolean): void => {\n /** 处理单个 @watch 装饰器;出错时提前 return(不用 continue,跨函数边界非法)。 */\n const handle = (member: any, dec: any): void => {\n const memberName = keyName(member.key)\n if (!memberName) return\n const expr = dec.expression ?? dec\n // 祖先的错误在它自己被 analyzeFile 分析时上报,这里不重复报\n const fail = (msg: string) => {\n if (!own) return\n result.errors.push({ start: dec.start ?? expr.start, end: dec.end ?? expr.end, message: msg })\n }\n\n // 处理器方法名必须是合法标识符:产物 emit `rc.<name>(…)` 点访问,\n // 字符串字面量方法名(`'my-handler'(){}`)会拼出非法 JS(对齐 source\n // 路径的字段校验;祖先条目在 !own 时静默跳过,由其所在文件自行上报)\n if (!IDENT_RE.test(memberName)) {\n fail(`E-WATCH-ARG: @watch 处理器方法名 '${memberName}' 不是合法标识符,无法前移(产物为 rc.<name>() 点访问)`)\n return\n }\n\n if (expr.type !== 'CallExpression') {\n fail(`E-WATCH-ARG: @watch 必须以调用形式使用(@watch(source, options?)),编译期无法解析`)\n return\n }\n const args = expr.arguments ?? []\n\n // ---- source ----\n const sources = resolveSources(args[0], ctx)\n if (!sources) {\n fail(`E-WATCH-ARG: @watch 的 source 无法静态解析(须为字符串字面量、字符串数组或模块级字符串常量)`)\n return\n }\n // 根必须是合法标识符;段可以是标识符或数字属性名。非法路径会生成坏 JS。\n const badPath = sources.find(\n (s) => !/^[A-Za-z_$][\\w$]*(\\.(?:[A-Za-z_$][\\w$]*|[0-9]+))*$/.test(s),\n )\n if (badPath) {\n fail(`E-WATCH-ARG: @watch 的 source '${badPath}' 不是合法字段路径(仅支持 a、a.b、a.0)`)\n return\n }\n // source 必须是**真信号键**。生成的 effect 读 `rc.__s.<s>.value`,\n // 普通 getter / 不存在的成员会让 `__s[s]` 为 undefined → setup() 里直接抛错,\n // 故本检查在静态分析已判不合规时跳过(基类可能在本文件外,键集不全,误报)。\n if (own && !comp.staticReason) {\n const signalKeys = signalKeysOf(node, ctx, comp, knownFields)\n if (signalKeys) {\n // 多级路径按**根键**判定(\"a.b\" 监听的是 __s.a)\n const unknown = sources.filter((s) => !signalKeys.has(s.split('.')[0]))\n if (unknown.length) {\n fail(\n `E-WATCH-SOURCE: @watch 的 source ${unknown.map((s) => `'${s}'`).join('、')} ` +\n `不是响应式字段(@prop/@state/@computed)—— @watch 只能监听信号`,\n )\n return\n }\n }\n }\n\n // ---- options ----\n let deep = false\n let immediate = false\n let once = false\n const optsNode = args[1]\n if (optsNode) {\n if (optsNode.type !== 'ObjectExpression') {\n fail(`E-WATCH-ARG: @watch 的 options 无法静态解析(须为对象字面量,deep/immediate/once 须为布尔字面量)`)\n return\n }\n let bad = false\n for (const p of optsNode.properties ?? []) {\n if (p.type === 'SpreadElement' || (p as any).type === 'ExperimentalSpreadProperty') {\n // 展开使得选项不可静态枚举(运行时 get 兜底键不受影响,但无法证明)\n bad = true\n break\n }\n const k = keyName(p.key)\n if (k === 'deep' || k === 'immediate' || k === 'once') {\n const b = boolOf(p.value)\n if (b == null) {\n bad = true\n break\n }\n if (k === 'deep') deep = b\n else if (k === 'immediate') immediate = b\n else once = b\n }\n // 其余键运行时本就不读,忽略\n }\n if (bad) {\n fail(`E-WATCH-ARG: @watch options 的 deep/immediate/once 必须是布尔字面量(编译期静态解析)`)\n return\n }\n }\n\n result.entries.push({\n name: memberName,\n sources,\n ...(deep ? { deep: true } : {}),\n ...(immediate ? { immediate: true } : {}),\n ...(once ? { once: true } : {}),\n ...(member.static ? { isStatic: true } : {}),\n })\n if (own) result.removals.push(lineSpan(code, dec.start ?? expr.start - 1, dec.end ?? expr.end))\n }\n\n for (const member of node.body?.body ?? []) {\n const memberName = keyName(member.key)\n if (!memberName) continue\n for (const dec of member.decorators ?? []) {\n const dn = decoratorName(dec)\n if (!dn || !isWatchDec(dn)) continue\n handle(member, dec)\n }\n }\n }\n\n // 只有“同文件链完整到达 CompElem”时才内联祖先:否则 `super.watchEffects` 里\n // 可能包含跨文件祖父的条目,压制它会静默丢 watch。链不完整时改为只收本类,\n // 由 emitWatchEffects 统一拼 `super.watchEffects`。\n const { chain, complete } = ancestorChain()\n result.inlinedAncestors = complete && chain.length > 0\n if (complete) {\n for (const anc of chain) collect(anc.node, anc.fields, false)\n }\n // 本类条目 + removals + errors\n collect(cls, new Set(comp.fields.keys()), true)\n return result\n}\n","/**\n * JS/TS 文本上下文扫描(编译器内部共享)。\n *\n * 只做一件事:标记“哪些字符处于 JS **代码**上下文”。\n * 字符串、模板字面量文本、注释、正则字面量内部一律标记为 0;\n * 模板的 ${...} 表达式与正则结束符/flag 标记为 1。\n *\n * stripTs / rewriteThis / hasTsSyntax 共用本模块,避免三份手写扫描器漂移\n * (历史上两份副本都不识别正则字面量,会把 /a!/、/this/ 改坏)。\n */\n\nexport interface JsTextScan {\n /** 1 = JS 代码上下文;0 = 字符串/模板文本/注释/正则内部 */\n mask: Uint8Array\n /** 引号、模板、注释、正则是否全部闭合;false 时调用方应放弃改写 */\n closed: boolean\n /**\n * `//` 行注释区间(start = 首个 `/`,end = 换行符下标或文本末尾)。\n * 供 stripLineComments 精确剥离——字符串/模板/正则里的 `//` 不会入列。\n */\n lineComments: Array<{ start: number; end: number }>\n}\n\n/** 这些关键字后允许出现正则字面量(而不是除号)。 */\nconst REGEX_PREFIX_KEYWORDS = new Set([\n 'return', 'typeof', 'instanceof', 'in', 'of', 'new', 'delete', 'void',\n 'case', 'do', 'else', 'yield', 'await', 'throw',\n])\n\n/**\n * 这些 token 之后的 `{` 是**块语句**而非对象字面量——尽管它们同时让\n * regexAllowed=true(`else {` / `do {` / `a => {`)。只影响 `}` 之后\n * regexAllowed 的恢复方向(块尾允许正则、对象尾只允许除法)。\n */\nconst BLOCK_KEYWORD_BEFORE_BRACE = new Set(['do', 'else', '=>'])\n\n/** 扫描 JS/TS 源码,返回代码上下文掩码与闭合状态。 */\nexport function scanJsText(src: string): JsTextScan {\n const n = src.length\n const mask = new Uint8Array(n)\n const lineComments: Array<{ start: number; end: number }> = []\n type Ctx =\n | { t: 'code'; braces: Array<'block' | 'object'> }\n | { t: 'sq' | 'dq' | 'tpl' | 'block' }\n | { t: 'line'; rec: { start: number; end: number } }\n | { t: 'regex'; inClass: boolean }\n const stack: Ctx[] = [{ t: 'code', braces: [] }]\n let i = 0\n // 上一个有效代码 token 是否允许 / 作为正则起点\n let regexAllowed = true\n // 最近一个标识符/关键字(或 '=>'):用于 `{` 的块/对象字面量判定\n let lastWord = ''\n\n const mark = (from: number, to: number) => {\n for (let k = from; k < to && k < n; k++) mask[k] = 1\n }\n\n while (i < n) {\n const top = stack[stack.length - 1]\n const c = src[i]\n\n if (top.t === 'line') {\n if (c === '\\n') {\n top.rec.end = i\n stack.pop()\n }\n i++\n continue\n }\n if (top.t === 'block') {\n if (c === '*' && src[i + 1] === '/') {\n stack.pop()\n i += 2\n } else i++\n continue\n }\n if (top.t === 'sq' || top.t === 'dq') {\n if (c === '\\\\') {\n i += 2\n continue\n }\n if (c === (top.t === 'sq' ? \"'\" : '\"')) {\n // 收尾引号算代码位置:让 \"x\"! 的 ! 仍可被 stripTs 识别\n mask[i] = 1\n stack.pop()\n // ⚠️ 字符串是**值**,其后出现的 `/` 只能是除号(`'a' / 2`)。\n // 不复位的话 regexAllowed 会保留进字符串之前的值(多数情况是 true),\n // 下一个 `/` 被当成正则起点 ⇒ 把后面的代码整段屏蔽(2026-10-22 审查 C-6):\n // `'a' / 2` ⇒ rewriteThis 引号配对复检失败,合法 JS 被拒\n // `'a' / 2 + (this.n / 3)` ⇒ `this` 落在\"正则内容\"里漏改写 ⇒ 运行期静默错值\n regexAllowed = false\n }\n i++\n continue\n }\n if (top.t === 'tpl') {\n if (c === '\\\\') {\n i += 2\n continue\n }\n if (c === '`') {\n mask[i] = 1\n stack.pop()\n // 同 sq/dq:模板字面量也是值 ⇒ 其后的 `/` 是除号,见 C-6 说明\n regexAllowed = false\n i++\n continue\n }\n if (c === '$' && src[i + 1] === '{') {\n stack.push({ t: 'code', braces: [] })\n mark(i, i + 2)\n i += 2\n regexAllowed = true\n continue\n }\n i++\n continue\n }\n if (top.t === 'regex') {\n if (c === '\\\\') {\n i += 2\n continue\n }\n if (c === '[') {\n top.inClass = true\n i++\n continue\n }\n if (c === ']') {\n top.inClass = false\n i++\n continue\n }\n if (c === '/' && !top.inClass) {\n const start = i\n i++\n while (i < n && /[a-z]/i.test(src[i])) i++\n mark(start, i) // 结束斜杠与 flags 算代码位置(\"x\"! / /re/! 的 ! 可剥)\n stack.pop()\n regexAllowed = false\n continue\n }\n i++\n continue\n }\n\n // ---- code ----\n // 上面的分支都已 continue;这里显式收窄,便于 TS 使用 top.braces。\n if (top.t !== 'code') { i++; continue }\n if (c === '/' && src[i + 1] === '/') {\n const rec = { start: i, end: n }\n lineComments.push(rec)\n stack.push({ t: 'line', rec })\n i += 2\n continue\n }\n if (c === '/' && src[i + 1] === '*') {\n stack.push({ t: 'block' })\n i += 2\n continue\n }\n if (c === '/' && regexAllowed) {\n stack.push({ t: 'regex', inClass: false })\n i++\n continue\n }\n if (c === \"'\" || c === '\"') {\n stack.push({ t: c === \"'\" ? 'sq' : 'dq' })\n i++\n continue\n }\n if (c === '`') {\n stack.push({ t: 'tpl' })\n i++\n continue\n }\n if (c === '{') {\n // 表达式位(regexAllowed)的 `{` 是对象字面量;`else {` / `do {` / `a => {`\n // 虽然也处于 regexAllowed=true,但那是块语句——记下来供 `}` 恢复方向用\n top.braces.push(regexAllowed && !BLOCK_KEYWORD_BEFORE_BRACE.has(lastWord) ? 'object' : 'block')\n mask[i] = 1\n i++\n regexAllowed = true\n continue\n }\n if (c === '}') {\n if (top.braces.length === 0 && stack.length > 1) {\n stack.pop()\n mask[i] = 1\n i++\n regexAllowed = false\n continue\n }\n const kind = top.braces.pop()\n mask[i] = 1\n i++\n // 块语句结束(`if(a){} /re/.test(x)`)后正则是合法起点;对象字面量\n // 结束(`const o = {} / 2`)后 `/` 只能是除法。不区分块/对象时\n // 块尾的正则字面量会被当除法扫描,其内容(引号等)不被屏蔽,\n // 可能被 rewriteThis / stripTs 改坏\n regexAllowed = kind === 'block'\n continue\n }\n if (/\\s/.test(c)) {\n i++\n continue\n }\n\n mask[i] = 1\n if (c === '=' && src[i + 1] === '>') {\n // 箭头 `=>`:其后的 `{` 是函数体块,不是对象字面量\n mask[i + 1] = 1\n lastWord = '=>'\n regexAllowed = true\n i += 2\n continue\n }\n if (/[A-Za-z_$]/.test(c)) {\n let j = i + 1\n while (j < n && /[A-Za-z0-9_$]/.test(src[j])) j++\n const word = src.slice(i, j)\n mark(i, j)\n lastWord = word\n regexAllowed = REGEX_PREFIX_KEYWORDS.has(word)\n i = j\n continue\n }\n if (/[0-9]/.test(c)) {\n let j = i + 1\n while (j < n && /[0-9A-Za-z_.]/.test(src[j])) j++\n mark(i, j)\n regexAllowed = false\n i = j\n continue\n }\n if (c === ')' || c === ']' || c === '.') regexAllowed = false\n else regexAllowed = true\n i++\n }\n\n return { mask, closed: stack.length === 1, lineComments }\n}\n\n/**\n * 剥掉 `//` 行注释(换行符本身保留,行结构不变)。\n *\n * 用途:把源码切片**单行内联 emit** 的场景(field-extract 的 options 切片)——\n * 尾随行注释(`@prop({ type: String, // 说明\\n})`)被 trim 掉换行后,\n * `//` 会吞掉产物里后面的闭括号与追加属性 ⇒ 注入产物语法错误。\n * 注释位置来自 scanJsText 的精确上下文扫描:字符串 / 模板 / 正则里的\n * `//`(如 `\"http://x\"`)不会被误剥。\n */\nexport function stripLineComments(src: string): string {\n if (!src.includes('//')) return src\n const { lineComments } = scanJsText(src)\n if (!lineComments.length) return src\n let out = ''\n let pos = 0\n for (const { start, end } of lineComments) {\n out += src.slice(pos, start)\n pos = end // end 指向换行符(或文本末尾),换行随下一段保留\n }\n out += src.slice(pos)\n return out\n}\n\n/** 把非代码上下文替换为空格(保持长度),供“只看代码”的正则判定使用。 */\nexport function codeOnly(src: string): string {\n const { mask } = scanJsText(src)\n let out = ''\n for (let i = 0; i < src.length; i++) out += mask[i] ? src[i] : ' '\n return out\n}\n\n/**\n * TS 专有语法检测(生成到 JS 运行时会语法错误)。\n *\n * 只看代码上下文,避免把字符串里的 \"ok!\"、'as soon as' 误判为\n * 非空断言 / as 断言。`as`/`satisfies` 按文本判据检查;后缀 `!` 逐个候选\n * 做「关键字回看」,与 `strip-ts#stripTs` 用同一套 `isUnaryKeyword` 判据,\n * 保证复检与剥离**同序同判**(否则 `typeof!x` 会被 stripTs 正确保留、却被\n * 复检误报为非空断言 —— C1)。\n */\n/**\n * `as` / `satisfies` 断言判据。\n *\n * ⚠️ 必须排除**成员访问**:`this.as (1)` / `x?.as (2)` 里的 `as` 是方法名而不是\n * 类型断言。旧判据只要求\"词边界 + 后面是标识符/括号\",于是格式化工具把方法调用\n * 写成 `this.as (1)`(名字与 `(` 之间有空格)时被误报成\"含 TS 专有语法\",\n * **合法 JS 直接构建失败**(2026-10-22 审查 C-8)。\n * `(?<![\\w$.])` 同时挡掉 `obj.as`(前一个字符是 `.`,`?.` 亦然)与标识符内部。\n */\nconst AS_SATISFIES_RE = /(?<![\\w$.])(?:as|satisfies)\\s+[A-Za-z_(<]/\n/** 后缀 `!` 候选:`x!` / `f(x)!` / `arr[0]!`,但排除 `!=`(不等运算符)。 */\nconst BANG_RE = /[\\w)\\]]!(?!=)/g\n\nexport function hasTsSyntax(src: string): boolean {\n const code = codeOnly(src)\n if (AS_SATISFIES_RE.test(code)) return true\n BANG_RE.lastIndex = 0\n let m: RegExpExecArray | null\n while ((m = BANG_RE.exec(code)) !== null) {\n const prev = code[m.index]\n // `f(x)!` / `arr[0]!`:调用结果或下标后的 `!` 必是非空断言。\n if (prev === ')' || prev === ']') return true\n // 标识符结尾:回看该完整单词是不是「后面允许跟一元 `!`」的关键字\n // (`typeof!x` 的 `!` 是一元取反,不是断言);不是关键字才算断言。\n if (!isUnaryKeyword(code, m.index)) return true\n }\n return false\n}\n\n/**\n * 「以该字符结尾的完整标识符若是这些关键字,则其后紧跟的 `!` 是一元取反而非\n * 非空断言」的白名单(`strip-ts#stripTs` 与上面的 `hasTsSyntax` 共用一份)。\n *\n * 只按单个尾字符判会误剥:`typeof !x` / `await !x` / `return !x` / `case !x`\n * 的 `!` 前面是 `f`/`t`/`n`/`e`,全部落在标识符字符集里 ⇒ 被当成断言删掉,\n * 语义翻成 `typeof x`(且复检 `hasTsSyntax` 看不到被删的 `!`,不会报错)。\n * 同理 `for (const x of !list)`、`else !a && b()`:prelude 语句位与插值表达式\n * 同受保护,`of`/`in`/`else`/`do` 后的 `!` 也是一元,必须保留。\n *\n * ⚠️ **不含 `this` / `super`**:`this!.foo` / `super!.foo` 是合法的非空断言,要剥。\n * ⚠️ **不含 `instanceof`**:`x instanceof B!` 的 `!` 跟在右操作数 `B` 之后,是断言\n * (要剥);把 `instanceof` 加进来反而会把方向判错。只有关键字**后紧跟**的 `!`\n * 才是一元,`instanceof` 后一般是操作数不是 `!`。\n */\nconst UNARY_BEFORE_BANG = new Set([\n 'typeof', 'await', 'void', 'return', 'case', 'throw', 'delete', 'yield',\n 'of', 'in', 'else', 'do',\n])\n\n/**\n * 以 `end`(含)结尾向前取完整标识符单词,判断它是不是「后面允许跟一元 `!`」的关键字。\n * `end` 不是标识符字符时返回 false。\n *\n * 前一个代码字符是 `.`(含 `?.`)时不算关键字:`row.case!` 里的 `case` 是属性名,\n * 那个 `!` 是真断言。\n */\nexport function isUnaryKeyword(src: string, end: number): boolean {\n if (end < 0 || !/[A-Za-z0-9_$]/.test(src[end])) return false\n let i = end\n while (i > 0 && /[A-Za-z0-9_$]/.test(src[i - 1])) i--\n if (!UNARY_BEFORE_BANG.has(src.slice(i, end + 1))) return false\n let p = i - 1\n while (p >= 0 && /\\s/.test(src[p])) p--\n return p < 0 || src[p] !== '.'\n}\n\n/**\n * 把**代码区**的私有名引用降级为普通成员名:`this.#x` → `this.x`。\n *\n * 用途只有一个:给「把片段拼进裸函数再 parse」的校验/建作用域场景(build-vars 的\n * freeIdentifiers、compile 的 collectPreludeDeclNames)造一个能解析的副本 ——\n * 类体外出现 `#x` 是 early error(babel:`Private name #x is not defined`),\n * 而那两处只关心「自由标识符集合」与「prelude 声明了哪些名字」,不关心私有性。\n *\n * 语义等价性:`this.#x` 与 `this.x` 都是 MemberExpression,属性名不进自由标识符集合;\n * classifyThisChain 也只读属性名。故对校验结论无影响。\n *\n * 只动 mask=1 的字符:字符串 / 模板文本 / 注释 / 正则里的 `#` 原样保留\n * (`const sel = \"#a\"` 不会被改成 `\"a\"`)。扫描未闭合时退回裸正则,与旧行为一致。\n *\n * ⚠️ 产物不走本函数:预置代码的落盘版本由 compile.ts 的 `rewriteThis(…, 'rc')`\n * 处理,`this.#x` → `rc.#x`,写在 `static __ce_static__` 的类体内,语法合法。\n */\nexport function degradePrivateNames(src: string): string {\n if (src.indexOf('#') < 0) return src\n const { mask, closed } = scanJsText(src)\n if (!closed) return src.replace(/#(?=[A-Za-z0-9_$])/g, '')\n let out = ''\n for (let i = 0; i < src.length; i++) {\n const ch = src[i]\n if (ch === '#' && mask[i] === 1 && /[A-Za-z0-9_$]/.test(src[i + 1] ?? '')) continue\n out += ch\n }\n return out\n}\n","/**\n * @prop/@state/@computed/@query/@queryAll 编译期访问器前移。\n *\n * 与 @watch 前移同构(analyze/watch-extract.ts):\n * - 静态提取五族装饰器配置 → 生成类体访问器(get/set)+ `__ce_static__` 元数据\n * (props/states/computedGetters),并从源码中删除成员:\n * prop/state 字段**整体删除**,初始值改写入构造体 `this.__data_[key]=v`\n * (无构造则合成;#initProps/#initStates 以 this.__data_[key] 为默认值,\n * 不依赖 own 字段遮蔽与 delete);computed 整体替换为缓存读取 getter\n * (原体外提为 computedGetters);query 整体删除字段(注入懒查询 getter);\n * - 访问器经模块级运行时函数直调(`signal` / `signalComputed` / `writeModelProp` /\n * `_queryGet` / `_observedAttrs`,见 RUNTIME_HELPERS);编译注入 compelem import,\n * 模块绑定冲突时改用 __ce_ 前缀别名;\n * - **逐族 all-or-nothing + 失败即报错(E 码,error 级默认阻断构建)**:\n * 族内任一成员不可静态解析 → 该族整体放弃(不删不注)并产出约定错误。\n * 运行时五族装饰器已无定义路径(@prop 运行时为 no-op)——E 码是唯一保护。\n *\n * 静态解析范围(文件内静态分析):\n * - options:对象字面量,或模块级 `const OPTS = {...}` 标识符(init 源码原样\n * 内联进注入字面量——同模块作用域下与装饰器参数等价求值);\n * - selector:字符串字面量 / 模块级 const 字符串(resolveSources);\n * - 不支持 → E 码:import 的 options/selector、let/运行时拼接、computed 体内\n * super、族外/多族装饰器同居(须拆分独立成员,E-DECO-COEXIST)。\n *\n * 已知限制(有意):\n * - query 字段被整体删除 → mounted 前读取从「字段 undefined」变为「即时查询结果」;\n * - skipInjection 类照常提取并注入:`__ce_static__` 以 `...父类.__ce_static__`\n * spread 继承视图字段,own 家族字段(props/states/computedGetters)\n * 显式覆盖——缺失时显式写 `[]`/`undefined`,防止 spread 把父类条目误当 own。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { DEBUG_DIV } from '../types'\nimport { keyName, IDENT_RE } from '../utils/ast'\nimport { superClassName } from './component'\nimport {\n decoratorName,\n finalOption,\n flattenOptionProps,\n hasOpaqueOption,\n unwrapTsExpr,\n type ConventionError,\n type ConventionsContext,\n type OptionEntry,\n} from './conventions'\nimport { inferInitMeta } from './literal-meta'\nimport { lineSpan, resolveSources } from './watch-extract'\nimport { stripLineComments } from '../utils/js-text'\n\nexport interface FieldExtractResult {\n /** 需从源码删除的 span(prop/state/computed/query 整个成员),已做整行清理 */\n removals: Array<{ start: number; end: number }>\n /** 类体注入的访问器代码(prop/state/computed 的 get/set,以及 **`@tag` 类**的\n * `static get observedAttributes()`),每行以 \\n 结尾。无 `@tag` 的类不带\n * observedAttributes。 */\n accessors: string\n /** `__ce_static__.props` 字面量值(prop 族无成员时 undefined) */\n propsCode?: string\n /** `__ce_static__.states` 字面量值 */\n statesCode?: string\n /** `__ce_static__.computedGetters` 字面量值(方法简写 name(){...}) */\n computedCode?: string\n /** prop/state 初始值 → 构造体写入语句素材(原字段声明改写为构造体赋值) */\n fieldInits: Array<{ name: string; initText: string }>\n /** 本组件访问器所需的模块级运行时函数名(已按 bindings 定名) */\n runtimeHelpers: string[]\n /**\n * 提取期约定错误:E-PROP-ARG / E-STATE-ARG / E-COMPUTED-ARG / E-QUERY-ARG /\n * E-DECO-COEXIST。与条目互斥的族级约定(该族有错 → 不删不注),其余族不受影响。\n */\n errors: ConventionError[]\n}\n\ntype Family = 'prop' | 'state' | 'computed' | 'query'\n\n/** 访问器生成所需的模块级运行时函数(编译注入 compelem import)。 */\nexport const RUNTIME_HELPERS = ['signal', 'signalComputed', 'writeModelProp', '_queryGet', '_observedAttrs'] as const\n\nconst FAM_CODE: Record<Family, string> = {\n prop: 'E-PROP-ARG',\n state: 'E-STATE-ARG',\n computed: 'E-COMPUTED-ARG',\n query: 'E-QUERY-ARG',\n}\n\n/**\n * `@prop` / `@state` 选项的**唯一**合法键集合,逐字对齐运行期类型声明:\n * - StateOption → compelem/src/types.ts:108-120\n * - PropOption → compelem/src/types.ts:130-172(`_defaultValue` / `_typeAry` 是内部字段,不对外)\n *\n * 选项对象会被原样搬进 `__ce_static__.props/states`,运行期只按上述类型的字段取值,\n * 表外的键**没有任何消费点**(写进去既不报错也不生效)。故这里做闭集校验:\n * 表外键一律编译期拒绝,而不是逐个写特例(`type`/`defaultValue`/`prop` …)——\n * 后者漏掉一个键就静默放行,且文案还得跟着类型演进而改。\n */\nconst PROP_OPTION_KEYS: ReadonlySet<string> = new Set([\n 'shallow', 'type', 'required', 'model', 'attribute', 'hasChanged', 'converter', 'isValid',\n])\nconst STATE_OPTION_KEYS: ReadonlySet<string> = new Set(['shallow', 'hasChanged'])\n\n/**\n * 收集 options 里不在 `allowed` 内的键名(去重,保持书写顺序)。\n *\n * opaque 条目(无法静态展开的 spread)不下结论——展开内容不可知时宁漏勿误报;\n * 显式写出的键则必判,因为 spread 只会覆盖值、删不掉这个键。\n */\nfunction unsupportedOptionKeys(seq: OptionEntry[], allowed: ReadonlySet<string>): string[] {\n const out: string[] = []\n for (const e of seq) {\n if (e.kind !== 'prop') continue\n const k = keyName(e.node.key)\n if (k && !allowed.has(k) && !out.includes(k)) out.push(k)\n }\n return out\n}\n\n/**\n * `static get observedAttributes()` 的注入体。\n *\n * 体只有一句 `_observedAttrs(this)`:属性名表由**运行时**从合并后的\n * `__ce_static__.props` 推导(compelem/src/CompElem.ts),编译器不生成 kebab 名单。\n *\n * 为什么不能采用「own 属性字面量 + `super.observedAttributes` 并集」的写法:\n * 那样**有 `@tag` 子类的属性表是沿整条继承链拼出来的**,于是无 `@tag` 的基类也必须\n * 带一份自己的表(哪怕它永不被 `customElements.define`、浏览器根本不会读它)。\n * 一旦基类不带,子类就再也拿不到继承来的属性 —— attribute 驱动静默失效\n * (`attributeChangedCallback` 永不触发),链上没有任何 `@tag` 类带 own prop 时更会\n * 整个表变成 undefined。从 props 表推导则不依赖任何祖先的 getter,\n * 「只有 @tag 类带 observedAttributes」才真正安全,且跨文件基类 / mixin 工厂\n * (编译器看不见后代)也照样正确 —— props 表的合并是运行时的展开。\n *\n * 生成物必须是**纯 JS**(注入产物可能被 new Function/JS 环境求值,不得携带类型断言)。\n */\nfunction observedGetter(h: (canon: string) => string): string {\n return `static get observedAttributes() { return ${h('_observedAttrs')}(this) }\\n`\n}\n\n/**\n * 剔除「同文件祖先已经提供、且与本类要发的**逐字节相同**」的访问器行。\n *\n * 背景:`@prop/@state/@computed` 的访问器是**纯名字驱动**的 ——\n * `get title() { return this.__s.title.value }`,与声明处的初始值无关。于是子类\n * 重新声明同名成员时(为了覆盖默认值,本仓库的基类/子类模式就是这么用的:\n * `ScCommon` 声明 `title = 'untitled'`,`ScPartial` 声明 `title = 'A. 局部更新'`),\n * 它发出的那一行与祖先装在**祖先原型**上的那一行完全相同 —— 遮蔽掉祖先的,且不遮蔽\n * 就毫无区别。属纯死代码:三层链(基类→子类→孙类)能把同一行复制 3 份。\n *\n * **判据是「逐字节相同」而不是「同名」,因为同名不同语义是真实存在的**:\n * · `@prop({model:true}) value` 的 setter 是 `writeModelProp(...)`(按宿主类型\n * 三路分派),而子类 `@prop value` 的 setter 是 `this.__s.value.value = __v`。\n * 两者文本不同 ⇒ 不跳过。若按「同名就跳」,子类会静默把 model prop 退化成普通\n * prop,父级再也收不到 `update:value` —— 无报错。\n * · `@state` 与 `@prop` 同名时文本相同(都是读 `__s.<n>.value`)⇒ 可跳。\n * · `@computed` 只有 getter,文本与同名 prop 的 getter 相同 ⇒ 可跳。\n *\n * 只沿**同文件** super 链(`ctx.localClasses`)上溯:跨文件基类与 mixin 工厂的成员\n * 编译器看不见(`unknownSuperAdmitted`),它们的访问器无从比较,一律保留。\n * 也只信任 `inheritedAccessors` 里**确实有条目**的祖先 —— 那意味着该祖先的族已成功\n * 提交(族级 all-or-nothing,失败则一行都不发)。祖先没条目就不跳,即使这在理论上\n * 漏掉了可跳的行,也只是多留一行死代码,不会出错。\n */\nfunction dedupeAncestorAccessors(\n comp: ComponentAnalysis,\n ctx: ConventionsContext,\n accessors: string,\n inherited: Map<string, string[]> | undefined,\n): string {\n if (!inherited) return accessors\n // 本类自己提供的行(回填累加器,让更下层的子类也能剔)\n const own = accessors.split('\\n').filter((l) => l !== '')\n inherited.set(comp.className, own)\n if (own.length <= 1) return accessors // 只有族分块标记,没有访问器\n\n // 同文件 super 链上,祖先们已提供的所有行\n const provided = new Set<string>()\n const seen = new Set<string>()\n let cur: any = comp.cls ?? ctx.localClasses.get(comp.className)\n while (cur) {\n const sup = superClassName(cur)\n if (!sup || seen.has(sup)) break\n seen.add(sup)\n for (const line of inherited.get(sup) ?? []) provided.add(line)\n cur = ctx.localClasses.get(sup)\n }\n if (!provided.size) return accessors\n\n // 只删访问器行,保留 `//////// <族名>` 分块标记(它们是给人看的结构注释,\n // 且 inject-e2e 会统计分块数)。分块标记在过滤后可能出现空块,无害。\n return accessors\n .split('\\n')\n .filter((l) => l === '' || l.startsWith(DEBUG_DIV) || !provided.has(l))\n .join('\\n')\n}\n\n/**\n * 提取组件类上可静态化的五族成员。返回的 errors 非空时调用方应把错误并入\n * conventionErrors(error 级阻断构建);出错的族不删除、不注入。\n *\n * @param inheritedAccessors **文件级**累加器:`类名 → 该类实际生成的访问器行`。\n * 由 compile.ts 在同文件逐个组件调用时传入并回填,用于剔除「同文件祖先已经提供\n * 的、逐字节相同的」访问器行(见文件末 dedupeAncestorAccessors)。传 undefined\n * 时不做任何剔除。\n */\nexport function extractFieldAccessors(\n comp: ComponentAnalysis,\n code: string,\n ctx: ConventionsContext,\n bindings: Record<string, string> = {},\n inheritedAccessors?: Map<string, string[]>,\n): FieldExtractResult {\n const empty: FieldExtractResult = { removals: [], accessors: '', fieldInits: [], runtimeHelpers: [], errors: [] }\n // 组件自身 class 节点:优先 comp.cls(覆盖 mixin 工厂内的函数作用域类),\n // 回退按名查 localClasses(只收模块顶层 class 声明)\n const cls = comp.cls ?? ctx.localClasses.get(comp.className)\n if (!cls) return empty\n /** 运行时函数定名:默认原名,模块绑定冲突时用 __ce_ 前缀别名。 */\n const h = (canon: string) => bindings[canon] ?? canon\n\n /**\n * 「只有 @tag、没有五族成员」时仍要注入的那部分:`observedAttributes` getter。\n *\n * 与函数末尾的 emit 走同一个生成器,保证两条路径产物完全一致。\n * 条件只看 `comp.tagName`,**不看自有 prop** —— 自有 prop 一个都没有的 @tag 类\n * (属性整张来自无 @tag 基类)同样必须带这个 getter,否则浏览器注册它时读到的\n * observedAttributes 是 undefined,attribute 驱动全部静默失效。\n */\n const tagOnlyObservedAttrs = (): Pick<FieldExtractResult, 'accessors' | 'runtimeHelpers'> => {\n if (!comp.tagName) return { accessors: '', runtimeHelpers: [] }\n return {\n accessors: `${DEBUG_DIV} observedAttributes\\n${observedGetter(h)}`,\n runtimeHelpers: ['_observedAttrs'],\n }\n }\n\n const famOf = (local: string | null): Family | null => {\n if (!local) return null\n const imported = comp.compelemImports.get(local)\n if (imported === 'prop') return 'prop'\n if (imported === 'state') return 'state'\n if (imported === 'computed') return 'computed'\n if (imported === 'query' || imported === 'queryAll') return 'query'\n return null\n }\n\n // ---- 第一遍:成员分类 + 前置校验(族级 all-or-nothing,失败 → E 码)----\n interface Cand {\n member: any\n family: Family\n dec: any\n /** query 族区分 query / queryAll */\n decLocal: string\n /**\n * query 族第一遍已解析的 selector / cache 实参(第二遍直接复用)。\n *\n * 两遍用的是**同一批 AST 节点 + 同一份 ctx**(`dec` 存的就是 `nodes[0]`,\n * resolveSources 只读 ctx.stringConsts、不改动任何状态),结果必然相同,\n * 没必要再解析一次。\n */\n selector?: string\n cacheStrs?: string[] | null\n }\n const cands: Cand[] = []\n const failed = new Set<Family>()\n const errors: ConventionError[] = []\n const failMember = (family: Family, member: any, message: string) => {\n errors.push({ start: member.start, end: member.end, message })\n failed.add(family)\n }\n\n for (const member of cls.body?.body ?? []) {\n const decs: any[] = member.decorators ?? []\n if (!decs.length) continue\n const famDecs = new Map<Family, any[]>()\n let foreign = false\n for (const dec of decs) {\n const fam = famOf(decoratorName(dec))\n if (fam) {\n let arr = famDecs.get(fam)\n if (!arr) famDecs.set(fam, (arr = []))\n arr.push(dec)\n } else foreign = true\n }\n if (!famDecs.size) continue\n\n const name = keyName(member.key)\n const shownName = name ?? '(匿名)'\n\n // 族外装饰器(含 @watch/@debounced 等 compelem 装饰器与用户自定义装饰器)同居:\n // 删除范围与语义无法证明互不干扰 → 报错,要求拆分独立成员(决策4)\n if (foreign) {\n const foreignNames = decs\n .filter((d) => !famOf(decoratorName(d)))\n .map((d) => '@' + decoratorName(d))\n .join(' ')\n for (const f of famDecs.keys()) {\n errors.push({\n start: member.start,\n end: member.end,\n message: `E-DECO-COEXIST: 五族成员 '${shownName}' 与其他装饰器(${foreignNames})同居——请把其他装饰器拆分到独立成员声明`,\n })\n failed.add(f)\n }\n continue\n }\n if (famDecs.size > 1) {\n const famNames = decs.map((d) => '@' + decoratorName(d)).join(' ')\n for (const f of famDecs.keys()) {\n errors.push({\n start: member.start,\n end: member.end,\n message: `E-DECO-COEXIST: 成员 '${shownName}' 同时挂载多个五族装饰器(${famNames})——请拆分为独立成员声明`,\n })\n failed.add(f)\n }\n continue\n }\n const family = famDecs.keys().next().value as Family\n const nodes = famDecs.get(family)!\n const decLocal = decoratorName(nodes[0])!\n let selector: string | undefined\n let cacheStrs: string[] | null | undefined\n if (nodes.length !== 1) {\n failMember(family, member, `${FAM_CODE[family]}: 成员 '${shownName}' 重复挂载 @${decLocal}`)\n continue\n }\n\n if (!name || !IDENT_RE.test(name)) {\n failMember(\n family,\n member,\n `${FAM_CODE[family]}: 成员名 '${shownName}' 非法(须为合法标识符)`,\n )\n continue\n }\n\n if (family === 'prop' || family === 'state') {\n if (member.type !== 'PropertyDefinition' || member.static) {\n failMember(family, member, `${FAM_CODE[family]}: @${decLocal} 只能用于非 static 实例字段('${name}' 是 ${member.static ? 'static ' : ''}${member.kind ?? member.type})`)\n continue\n }\n } else if (family === 'computed') {\n if (member.type !== 'MethodDefinition' || member.kind !== 'get') {\n // 非 getter 目标由 conventions E-COMPUTED-NOT-GETTER 报告(避免同点重复);\n // 此处仅放弃该族——运行时 computed 装饰器仍可兜底。\n failed.add(family)\n continue\n }\n if (member.static) {\n failMember(family, member, `${FAM_CODE[family]}: @computed 只能用于非 static getter('${name}')`)\n continue\n }\n if (!member.value?.body || member.value.body.type !== 'BlockStatement') {\n failMember(family, member, `${FAM_CODE[family]}: getter '${name}' 体无法外提(缺块状函数体)`)\n continue\n }\n const bodyText = code.slice(member.value.body.start, member.value.body.end)\n if (/\\bsuper\\b/.test(bodyText)) {\n // 原体外提为 __ce_static__ 内的普通方法后 super 的 home-object 语义丢失(决策2:不支持\n failMember(family, member, `${FAM_CODE[family]}: getter '${name}' 体内含 super——外提为 __ce_static__ 方法后 home-object 语义丢失,不支持该场景`)\n continue\n }\n const expr = nodes[0].expression ?? nodes[0]\n if (expr.type !== 'Identifier') {\n failMember(family, member, `${FAM_CODE[family]}: @computed 不接受参数('${name}')`)\n continue\n }\n } else {\n // query\n if (member.type !== 'PropertyDefinition') {\n // 非字段目标由 conventions E-DECO-TARGET 报告;仅放弃该族\n failed.add(family)\n continue\n }\n if (member.static) {\n failMember(family, member, `${FAM_CODE[family]}: @${decLocal} 只能用于非 static 实例字段('${name}')`)\n continue\n }\n const expr = nodes[0].expression ?? nodes[0]\n if (expr.type !== 'CallExpression') {\n failMember(family, member, `${FAM_CODE[family]}: @${decLocal} 必须以调用形式使用(@${decLocal}(selector, cache?))`)\n continue\n }\n const args = expr.arguments ?? []\n if (args.length === 0 || args.length > 2) {\n failMember(family, member, `${FAM_CODE[family]}: @${decLocal} 参数个数非法(须 1-2 个)`)\n continue\n }\n if (args[0]?.type === 'ArrayExpression') {\n failMember(family, member, `${FAM_CODE[family]}: selector 不支持数组字面量('${name}')`)\n continue\n }\n const sel = resolveSources(args[0], ctx)\n if (!sel) {\n failMember(family, member, `${FAM_CODE[family]}: selector 无法静态解析(须字符串字面量或文件内 const 字符串——'${name}';import/动态值不支持)`)\n continue\n }\n if (sel.length !== 1) {\n failMember(family, member, `${FAM_CODE[family]}: selector 不支持多值('${name}')`)\n continue\n }\n selector = sel[0]\n // cache 参数:缺省 false;静态字符串按 === QueryCache.ONCE('once') 判定\n if (args[1]) {\n cacheStrs = resolveSources(args[1], ctx)\n if (cacheStrs && cacheStrs.length === 1) {\n // 'once' 字面量即可;其他字符串按非 ONCE 处理(与运行时 === 语义一致)\n } else if (\n args[1]?.type === 'MemberExpression' &&\n !args[1].computed &&\n keyName(args[1].property) === 'ONCE' &&\n args[1].object?.type === 'Identifier' &&\n comp.compelemImports.get(args[1].object.name) === 'QueryCache'\n ) {\n // QueryCache.ONCE(枚举跨模块无法求值,按绑定精确识别)\n } else {\n failMember(family, member, `${FAM_CODE[family]}: cache 参数无法静态解析(须 'once' 字符串或 QueryCache.ONCE——'${name}')`)\n continue\n }\n }\n }\n cands.push({ member, family, dec: nodes[0], decLocal, selector, cacheStrs })\n }\n\n if (!cands.length) {\n // 一个五族成员都没有的 @tag 类(如属性全部来自无 @tag 基类的子类)**仍要**\n // emit observedAttributes —— 它的属性表整张来自父表。早退会把它连同\n // runtimeHelpers 一起丢掉,故这里补上,不能直接返回 empty。\n return { ...empty, ...tagOnlyObservedAttrs(), errors }\n }\n\n // ---- 第二遍:按族生成(任一成员失败 → 整族丢弃 + 已产出 E 码)----\n interface Acc {\n removals: Array<{ start: number; end: number }>\n accessors: string[]\n items: AccItem[]\n }\n interface AccItem {\n name: string\n optsText?: string\n bodyText?: string\n model?: boolean\n selector?: string\n all?: boolean\n once?: boolean\n initText?: string\n /** 编译期推导的构造器名(与运行时 PropTypeMap 同域) */\n inferredType?: string\n /** options 里已显式写了 type(或 spread 可能覆盖 type)→ 推导值不得覆盖 */\n explicitType?: boolean\n /**\n * `@state m = this.<prop>` 的播种源。\n *\n * 真值由编译器注入 `prop`(运行期键),运行期 `CompElem#initStates` 从\n * `__data_[prop]` 深拷贝回灌信号 —— 声明处的初始值是一句会被立刻覆盖的\n * **死代码**,据此推出来的 defaultValue / type 描述的是那个死值,\n * 写进元数据就是谎报,故播种字段一律不推导。\n */\n seedProp?: string\n }\n const accs: Record<Family, Acc> = {\n prop: { removals: [], accessors: [], items: [] },\n state: { removals: [], accessors: [], items: [] },\n computed: { removals: [], accessors: [], items: [] },\n query: { removals: [], accessors: [], items: [] },\n }\n\n const memberSpan = (member: any, dec: any) => {\n const dStart = dec.start ?? (dec.expression?.start ?? member.start)\n return lineSpan(code, Math.min(member.start, dStart), member.end)\n }\n\n /** options 实参 → 可注入的对象字面量节点:字面量直取;Identifier 经 moduleConsts 内联。 */\n const resolveOptsNode = (family: Family, member: any, a0: any): any | null => {\n if (!a0) return null\n if (a0.type === 'ObjectExpression') return a0\n if (a0.type === 'Identifier') {\n const src = a0.name\n if (ctx.importedLocals?.has(src)) {\n failMember(\n family,\n member,\n `${FAM_CODE[family]}: options 标识符 '${src}' 是跨文件导入——import 的 options 不支持(文件内静态分析范围外)`,\n )\n return null\n }\n const init = unwrapTsExpr(ctx.moduleConsts?.get(src))\n if (init?.type === 'ObjectExpression') return init\n failMember(family, member, `${FAM_CODE[family]}: options 标识符 '${src}' 无法解析为文件内 const 对象(须是模块级 const;import/let/运行时拼接不支持)`)\n return null\n }\n failMember(family, member, `${FAM_CODE[family]}: options 无法静态解析(须对象字面量或文件内 const 对象)`)\n return null\n }\n\n /**\n * `@state m = this.<ident>` → `<ident>`;其余形状(字面量 / 标识符 / 调用 /\n * 可选链 / 计算属性 / `this.a.b`)一律返回 undefined,按普通初始值处理。\n *\n * 注意只识别**非计算的单层** `this.x`:`this` 开头还有别的形状\n * (`this.get()`、`this.a.b`),它们的求值结果不是\"播种源名字\",不能猜。\n */\n const parseSeedProp = (value: any): string | undefined => {\n if (value?.type !== 'MemberExpression') return undefined\n if (value.optional === true || value.computed === true) return undefined\n if (value.object?.type !== 'ThisExpression') return undefined\n return value.property?.type === 'Identifier' ? value.property.name : undefined\n }\n\n /**\n * 本类**本地声明**的 state / computed 字段名。\n *\n * 播种识别必须先把它们排除:`@state a = 1` + `@state b = this.a` 是\n * \"抄兄弟字段的初值\",走构造期求值是**正确**的,不能被误判成 prop 播种\n * (播种会去读 `__data_[a]`,那时 `#initStates` 可能还没轮到 a)。\n * 反过来,prop(本类的或从祖先继承的)不在这个集合里,`this.<prop>`\n * 才会走播种分支。\n */\n const localStateishFields = new Set<string>(\n cands\n .filter((c) => c.family === 'state' || c.family === 'computed')\n .map((c) => keyName(c.member.key))\n .filter((k): k is string => !!k),\n )\n\n for (const { member, family, dec, decLocal, selector: qSel, cacheStrs: qCache } of cands) {\n if (failed.has(family)) continue\n const acc = accs[family]\n const name = keyName(member.key)!\n const expr = dec.expression ?? dec\n\n if (family === 'prop') {\n let optsText = '{}'\n let model = false\n let explicitType = false\n if (expr.type === 'CallExpression') {\n const args = expr.arguments ?? []\n if (args.length !== 1) {\n failMember(family, member, `${FAM_CODE[family]}: @prop 必须无参或以单参调用(@prop(options))`)\n continue\n }\n const optsNode = resolveOptsNode(family, member, args[0])\n if (!optsNode) continue\n optsText = code.slice(optsNode.start, optsNode.end)\n const seq = flattenOptionProps(optsNode, ctx)\n const opaque = hasOpaqueOption(seq)\n\n const badKeys = unsupportedOptionKeys(seq, PROP_OPTION_KEYS)\n if (badKeys.length) {\n failMember(\n family,\n member,\n `E-PROP-ARG: @prop 的选项 ${badKeys.map((k) => `'${k}'`).join('、')} 不受支持——` +\n `PropOption 仅支持 ${[...PROP_OPTION_KEYS].join(' / ')};默认值直接写在字段初始化器上`,\n )\n continue\n }\n\n const modelOpt = finalOption(seq, 'model')\n if (modelOpt.known) {\n const v = modelOpt.node\n const isBool =\n v?.type === 'BooleanLiteral' || (v?.type === 'Literal' && typeof v.value === 'boolean')\n if (!isBool) {\n failMember(family, member, `E-PROP-ARG: model 必须是布尔字面量('${name}')`)\n continue\n }\n model = v.value === true\n } else if (opaque) {\n // spread 可能把 model 设为 true;按普通 setter 生成会静默破坏双向绑定。\n failMember(\n family,\n member,\n `E-PROP-ARG: options 的展开无法静态解析,无法确定 model('${name}');` +\n `请把 model 显式写在 @prop 字面量里`,\n )\n continue\n }\n\n const typeOpt = finalOption(seq, 'type')\n // spread 若可能覆盖 type,则不再追加推导值,避免静默改掉运行期类型。\n explicitType = typeOpt.known || opaque\n\n const attrOpt = finalOption(seq, 'attribute')\n if (attrOpt.known) {\n const v = attrOpt.node\n const isBool =\n v?.type === 'BooleanLiteral' || (v?.type === 'Literal' && typeof v.value === 'boolean')\n if (!isBool) {\n failMember(family, member, `E-PROP-ARG: attribute 必须是布尔字面量('${name}')`)\n continue\n }\n }\n }\n const meta = inferInitMeta(member.value)\n acc.removals.push(memberSpan(member, dec))\n acc.items.push({\n name,\n optsText,\n model,\n initText: member.value ? code.slice(member.value.start, member.value.end) : undefined,\n inferredType: meta.typeName,\n explicitType,\n })\n acc.accessors.push(\n `get ${name}() { return this.__s.${name}.value }\\n`,\n model\n ? `set ${name}(__v) { ${h('writeModelProp')}(${JSON.stringify(name)}, __v, this) }\\n`\n : `set ${name}(__v) { this.__s.${name}.value = __v }\\n`,\n )\n } else if (family === 'state') {\n // 播种:`@state m = this.p` → seedProp。\n //\n // 字段初始化跑在构造期,而 prop 真值要到 setup() 里 #initProps() 才落定;\n // 因此识别到 `this.<prop>` 时不能 emit `signal(this.p)`,改由\n // CompElem#initStates 读 `__data_[p]` 深拷贝回灌。\n // 指向本地 state / computed 时不播种(那是“抄兄弟字段初值”)。\n const rawSeed = parseSeedProp(member.value)\n const seedProp = rawSeed && !localStateishFields.has(rawSeed) ? rawSeed : undefined\n let optsText = '{}'\n if (expr.type === 'CallExpression') {\n const args = expr.arguments ?? []\n if (args.length !== 1) {\n failMember(family, member, `E-STATE-ARG: @state 必须无参或以单参调用(@state(options))`)\n continue\n }\n const optsNode = resolveOptsNode(family, member, args[0])\n if (!optsNode) continue\n optsText = code.slice(optsNode.start, optsNode.end)\n const seq = flattenOptionProps(optsNode, ctx)\n\n const badKeys = unsupportedOptionKeys(seq, STATE_OPTION_KEYS)\n if (badKeys.length) {\n failMember(\n family,\n member,\n `E-STATE-ARG: @state 的选项 ${badKeys.map((k) => `'${k}'`).join('、')} 不受支持——` +\n `StateOption 仅支持 ${[...STATE_OPTION_KEYS].join(' / ')};` +\n `类型由 TS 标注表达,初始值/从 prop 播种直接写在字段初始化器上`,\n )\n continue\n }\n }\n const meta = seedProp ? {} : inferInitMeta(member.value)\n acc.removals.push(memberSpan(member, dec))\n acc.items.push({\n name,\n optsText,\n initText: member.value ? code.slice(member.value.start, member.value.end) : undefined,\n inferredType: meta.typeName,\n seedProp,\n })\n acc.accessors.push(\n `get ${name}() { return this.__s.${name}.value }\\n`,\n `set ${name}(__v) { this.__s.${name}.value = __v }\\n`,\n )\n } else if (family === 'computed') {\n const bodyText = code.slice(member.value.body.start, member.value.body.end)\n acc.removals.push(memberSpan(member, dec))\n acc.items.push({ name, bodyText })\n acc.accessors.push(`get ${name}() { return this.__s.${name}.value }\\n`)\n } else {\n const args = expr.arguments ?? []\n // 第一遍已对同一节点、同一 ctx 解析过(resolveSources 只读,结果必然一致)\n const selector = qSel!\n let once = false\n if (args[1]) {\n if (qCache && qCache.length === 1) once = qCache[0] === 'once'\n else once = true\n }\n const all = comp.compelemImports.get(decLocal) === 'queryAll'\n acc.removals.push(memberSpan(member, dec)) // 字段声明整体删除(否则 own 字段遮蔽注入 getter)\n acc.items.push({ name, selector, all, once })\n acc.accessors.push(\n `get ${name}() { return ${h('_queryGet')}(${JSON.stringify(selector)}, ${all}, ${once}, this) }\\n`,\n )\n }\n }\n\n // ---- 汇总(族级提交)----\n const removals: Array<{ start: number; end: number }> = []\n let accessors = ''\n let propsCode: string | undefined\n let statesCode: string | undefined\n let computedCode: string | undefined\n const committed = new Set<Family>()\n /** 族块标签(访问器 get/set 的分隔注释) */\n const familyLabel: Record<Family, string> = { prop: 'props', state: 'states', computed: 'computed', query: 'query' }\n\n /**\n * `__ce_static__.props/states` 单条目文本:`{ …options, type }`。\n *\n * options 保持**原样源码**(不重建属性),spread / 注释 / 多行写法一律原样保留;\n * 推导出来的 `type` 追加到这个对象字面量的属性位里。\n * 故取的是 options 切片的**花括号内部**(`slice(1,-1)`)——直接把整个 `{…}`\n * 当属性塞进去会产出 `{ { type: String }, … }` 这种嵌套字面量。\n *\n * 优先级:显式 `type` > 从默认值推导。\n * (`defaultValue` 已经不再 emit —— 运行期真值始终是信号 `__s[key].value`,\n * 静态表里那个字面量与实例信号是两个不同对象,拿它当默认值会误导。)\n */\n const NO_OPTS = '{}'\n /**\n * options 内部切片 → 去掉首尾空白与**尾逗号**。\n *\n * options 源码原样保留(含尾逗号),而 parts 之间靠 `join(', ')` 分隔:\n * 源码里 `{ type: Object, hasChanged(a,b){…}, }` 这种常见写法会把尾逗号带进来,\n * 与 join 叠加产出 `{ …},\\n ,, defaultValue: … }` —— 语法错误,产物整个文件\n * 解析失败(compelem-ui `base/ControlBox.ts`、`table/ColumnConfigPane.ts` 即此症状,\n * vite 报 `vite:oxc PARSE_ERROR Unexpected token`)。\n *\n * 只吃**最后一个**字符为 `,` 的情况,故注释里带逗号(`{ a: 1 ␟,␟ }` 形式)不受影响。\n *\n * ⚠️ 先剥 `//` 行注释:fieldEntryText 会把本切片折进单行 `{ … }`,尾随行注释\n * (`@prop({ type: String, // 说明\\n})`)经 trim 失去换行后会吞掉产物的闭括号\n * 与追加属性 ⇒ 注入产物语法错误。字符串里的 `//` 不受影响(见 stripLineComments)。\n */\n function optsInnerText(text: string): string {\n let t = stripLineComments(text).trim()\n if (t.charCodeAt(t.length - 1) === 44 /* , */) t = t.slice(0, -1).trim()\n return t\n }\n /**\n * `type` 只对 prop 有意义(运行期 attribute 转换/类型校验要读它);state 的\n * 类型由 TS 标注保证,运行期从不读 state 的 type,故**不 emit**(省产物字节,\n * 也避免「表里有 type ⇒ 运行时会校验」的错觉)。\n */\n function fieldEntryText(i: AccItem, family: Family): string {\n const parts: string[] = []\n // options 切片恒以 `{` 开头、`}` 结尾(node.start/node.end 即字面量两侧花括号)\n const opts = i.optsText === undefined || i.optsText === NO_OPTS ? '' : optsInnerText(i.optsText.slice(1, -1))\n if (opts) parts.push(opts)\n // 播种源。值是**标识符名字**而非表达式 —— 运行期由 CompElem#initStates\n // 去 `__data_[p]` 取真值,此刻的 `this.p` 求值太早。\n if (i.seedProp !== undefined) parts.push(`prop: ${JSON.stringify(i.seedProp)}`)\n if (family === 'prop' && i.inferredType !== undefined && !i.explicitType) {\n parts.push(`type: ${i.inferredType}`)\n }\n // 无任何可写字段(推导不出、options 为空)时仍是 `{}` 而不是 `{ }`\n if (!parts.length) return `${JSON.stringify(i.name)}: {}`\n return `${JSON.stringify(i.name)}: { ${parts.join(', ')} }`\n }\n\n const commit = (f: Family, fn: (acc: Acc) => string | undefined) => {\n if (failed.has(f)) return\n const acc = accs[f]\n if (!acc.items.length) return\n removals.push(...acc.removals)\n if (acc.accessors.length) accessors += `${DEBUG_DIV} ${familyLabel[f]}\\n`\n accessors += acc.accessors.join('')\n committed.add(f)\n const code2 = fn(acc)\n if (code2 !== undefined) {\n if (f === 'prop') propsCode = code2\n else if (f === 'state') statesCode = code2\n else if (f === 'computed') computedCode = code2\n }\n }\n\n commit('prop', (a) => `{ ${a.items.map((i) => fieldEntryText(i, 'prop')).join(', ')} }`)\n commit('state', (a) => `{ ${a.items.map((i) => fieldEntryText(i, 'state')).join(', ')} }`)\n commit('computed', (a) => `{ ${a.items.map((i) => `${JSON.stringify(i.name)}()${i.bodyText}`).join(', ')} }`)\n commit('query', () => undefined)\n\n // prop/state 信号 + computed 信号体 → 构造体写入素材\n // (字段声明已整体删除;访问器统一读 `__s.<name>.value`,\n // 故**每个**已提交成员都必须建信号——无默认值者建 `signal(undefined)`,\n // 否则 `this.__s.x.value` 在无初始值的 @prop/@state 上直接抛 undefined.value)\n const fieldInits: Array<{ name: string; initText: string; computed?: boolean }> = []\n const runtimeHelpers: string[] = []\n if (committed.has('prop')) {\n for (const i of accs.prop.items) {\n fieldInits.push({ name: i.name, initText: i.initText ?? 'undefined' })\n }\n runtimeHelpers.push('signal')\n if (accs.prop.items.some((i) => i.model)) runtimeHelpers.push('writeModelProp')\n }\n if (committed.has('state')) {\n for (const i of accs.state.items) {\n // 播种字段(`@state m = this.p`)**不能**把 `this.p` 当初始值 emit:\n // 那是构造期求值,prop 真值那时还没落地(见 parseSeedProp 上方注释)。\n // 这里建 `signal(undefined)` 占位,实际值由 setup() 里的\n // #initStates 按 `prop`(运行期键) 从 `__data_[p]` 深拷贝回灌。\n fieldInits.push({ name: i.name, initText: i.seedProp !== undefined ? 'undefined' : i.initText ?? 'undefined' })\n }\n if (!runtimeHelpers.includes('signal')) runtimeHelpers.push('signal')\n }\n if (committed.has('computed')) {\n if (!runtimeHelpers.includes('signal')) runtimeHelpers.push('signal')\n if (!runtimeHelpers.includes('signalComputed')) runtimeHelpers.push('signalComputed')\n for (const i of accs.computed.items) {\n // bodyText 形如 `{ ... }`(getter 体,含花括号)\n if (i.bodyText === undefined) continue\n fieldInits.push({ name: i.name, initText: i.bodyText, computed: true })\n }\n }\n if (committed.has('query')) runtimeHelpers.push('_queryGet')\n\n // ---- 剔除同文件祖先已提供的、逐字节相同的访问器行 ----\n accessors = dedupeAncestorAccessors(comp, ctx, accessors, inheritedAccessors)\n\n // observedAttributes:**只给 @tag 类 emit**。\n //\n // 只有 `@tag` 类会被 `customElements.define`(tag.ts:immediate 直接 define,\n // 否则经 DefinitionComponentMap → defineComponents),也只有它的表会被浏览器读。\n // 无 `@tag` 的类(纯基类 / mixin 中间层 / 跨文件基类)永不被定义,带一份\n // observedAttributes 就是死代码。\n //\n // 条件只看 `comp.tagName`,**不看自有 prop**:一个自己一个 `@prop` 都没有的\n // @tag 类(属性全来自无 @tag 基类)同样必须 emit —— 它的表整张来自父表。\n //\n // 体是 `_observedAttrs(this)`(运行时从合并后的 props 表推导),因此**不依赖\n // 任何祖先的 getter**:这正是「基类可以不 emit」安全的前提。详见 observedGetter 注释。\n if (comp.tagName) {\n accessors += `${DEBUG_DIV} observedAttributes\\n`\n accessors += observedGetter(h)\n if (!runtimeHelpers.includes('_observedAttrs')) runtimeHelpers.push('_observedAttrs')\n }\n return { removals, accessors, propsCode, statesCode, computedCode, fieldInits, runtimeHelpers, errors }\n}\n","/**\n * 方法装饰器编译期前移:@debounced / @throttled / @onced。\n *\n * 与 @watch / 五族前移同构(analyze/watch-extract.ts、field-extract.ts):\n * - 静态提取装饰器参数 → 生成**构造体注入语句**(逐条直线代码,无计划表、无运行时遍历);\n * - 从源码中删除装饰器本身(**方法体保留**);\n * - 生成 destroy 注入语句(cancel + 置**空操作函数**)。\n *\n * 产物形态(对齐原运行时 `DebouncedDecorator.created` 等):\n *\n * @throttled(100) onScroll() { this.sync() }\n * ⇒ 构造体:const __f0 = this.onScroll; this.onScroll = throttle(__f0, 100); this.onScroll_$__ = __f0\n * ⇒ destroy:this.onScroll = () => {}; this.onScroll_$__ = () => {}\n *\n * @debounced(50, true) onSearch(kw) { … }\n * ⇒ 构造体:const __f1 = this.onSearch;\n * const __g1 = function (...a) { if (this?.isDestroyed) return; return __f1.apply(this, a) }\n * this.onSearch = debounce(__g1, 50, true); this.onSearch_$__ = __g1\n * ⇒ destroy:this.onSearch?.cancel?.(); this.onSearch = () => {}; this.onSearch_$__ = () => {}\n *\n * @onced init() { … }\n * ⇒ 构造体:const __f2 = this.init.bind(this); this.init = once(__f2); this.init_$__ = __f2\n * ⇒ destroy:this.init = () => {}; this.init_$__ = () => {}\n *\n * ⚠️ destroy 里**置空操作函数而非 null**:库里存在若干「一次性定时器 / 手工 debounce」\n * 的迟到回调,会在组件销毁后仍直接 `this.decoMethod()`。若置 null 会抛\n * \"X is not a function\";置 no-op 则静默无害(这些方法本就只在存活期有意义)。\n * 注意 no-op 是**真值**(null 是假值),故不要依赖销毁后 `if (this.X)` 为假。\n *\n * ⚠️ **三个装饰器的 `_$__` 语义各不相同**(已实测确认):\n * - debounced:包裹 **guard**(含 isDestroyed),`_$__` **也是 guard**\n * - throttled:包裹**原函数**(无 guard),`_$__` 是**原函数**\n * - onced:包裹 `once(base)`,`_$__` 是 **bind 后**的原函数\n * ⇒ 注入代码必须按类型分支,**不能统一写法**。\n *\n * ⚠️ **必须先把原型方法捞进临时变量**(`const __f = this.onX`):包装后\n * `this.onX` 即指向包装结果,再取就是递归。\n *\n * ⚠️ **继承**:只处理**本类 own** 的装饰器。祖先的 constructor 已经执行过自己的\n * 包装注入;子类再注入一遍会造成 debounce/throttle 双层包装与 _$__ 覆盖。\n *\n * **逐族 all-or-nothing + 失败即报错**:任一成员参数不可静态解析 → 该族整体\n * 不删不注并报 E 码。运行时装饰器已无定义路径,E 码是唯一保护。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { keyName, IDENT_RE } from '../utils/ast'\nimport { decoratorName, unwrapTsExpr, type ConventionError, type ConventionsContext } from './conventions'\nimport { isBooleanLit, isNumericLit, isNumericUnary } from './literal-meta'\nimport { lineSpan } from './watch-extract'\n\nexport interface MethodDecoResult {\n /** 构造体注入语句(多条以 '\\n' 连接;空表示无注入) */\n ctorStmts: string\n /** destroy 注入语句 */\n destroyStmts: string\n /** 需删除的 span(**只删装饰器本身**,方法体保留) */\n removals: Array<{ start: number; end: number }>\n /** 运行时的包装函数名(`debounce` / `throttle` / `once`),供文件级 import 注入 */\n runtimeHelpers: string[]\n errors: ConventionError[]\n}\n\ntype Kind = 'debounced' | 'throttled' | 'onced'\n\n/** 本地变量前缀(避开用户标识符;`__` 前缀与框架其余注入一致)。 */\nconst TMP_F = '__ce_mdf'\nconst TMP_G = '__ce_mdg'\n/** destroy 时给装饰器方法(及其 `_$__`)写入的空操作实现(见文件头注释)。 */\nconst NOOP = '() => {}'\n\n/**\n * 提取组件类上的方法装饰器。祖先条目并入(祖先在前),但 removals 只记本类。\n */\nexport function extractMethodDecos(\n comp: ComponentAnalysis,\n code: string,\n ctx: ConventionsContext,\n): MethodDecoResult {\n const result: MethodDecoResult = { ctorStmts: '', destroyStmts: '', removals: [], runtimeHelpers: [], errors: [] }\n const cls = comp.cls ?? ctx.localClasses.get(comp.className)\n if (!cls) return result\n\n const kindOf = (local: string): Kind | null => {\n const imported = comp.compelemImports.get(local)\n if (imported === 'debounced') return 'debounced'\n if (imported === 'throttled') return 'throttled'\n if (imported === 'onced') return 'onced'\n return null\n }\n\n /** 全局计数器,保证临时变量名不冲突(祖先 + 本类共用一个序列)。 */\n let seq = 0\n let failed = false\n const usedHelpers = new Set<string>()\n\n /**\n * 解析 `wait`:数字字面量(含一元负号)/ 模块级 `const` 数字。\n * ⚠️ ESTree 形态 —— 是 `Literal` + `value`,**不是** `NumericLiteral`。\n * 故必须用 literal-meta 的判定函数,不能直接比 `type === 'NumericLiteral'`\n * (曾因此让 `@debounced(50)` 全部误报 E-METHOD-DECO-ARG)。\n */\n const resolveWait = (arg: any): number | null => {\n if (!arg) return null\n const n = unwrapTsExpr(arg)\n if (isNumericLit(n)) return n.value\n if (isNumericUnary(n)) {\n const v = unwrapTsExpr(n.argument).value\n return n.operator === '-' ? -v : v\n }\n // 模块级 const:`const W = 200` → moduleConsts 存 init 节点\n if (n?.type === 'Identifier') {\n const init = ctx.moduleConsts?.get(n.name)\n if (init) {\n const i = unwrapTsExpr(init)\n if (isNumericLit(i)) return i.value\n if (isNumericUnary(i)) {\n const v = unwrapTsExpr(i.argument).value\n return i.operator === '-' ? -v : v\n }\n }\n }\n return null\n }\n\n const resolveBool = (arg: any): boolean | null => {\n if (!arg) return null\n const n = unwrapTsExpr(arg)\n if (isBooleanLit(n)) return n.value\n if (n?.type === 'Identifier') {\n const init = ctx.moduleConsts?.get(n.name)\n if (init && isBooleanLit(unwrapTsExpr(init))) return unwrapTsExpr(init).value\n }\n return null\n }\n\n /** 处理本类节点(祖先 constructor 已自行完成包装,不能重复注入)。 */\n const collect = (node: any): void => {\n const push = (s: string) => { result.ctorStmts += (result.ctorStmts ? '\\n' : '') + s }\n\n const handle = (member: any, dec: any): void => {\n const memberName = keyName(member.key)\n if (!memberName) return\n const dn = decoratorName(dec)\n if (!dn) return\n const kind = kindOf(dn)\n if (!kind) return\n // 目标校验由 checkConventions 的 E-DECO-TARGET 负责;这里只拒绝“明显不能包装”\n // 的形态,避免 conventions: 'warn' 时产出 `this.getter = ...` 这类运行期崩溃。\n if (member.kind !== 'method' || member.static || memberName.startsWith('#')) return\n\n const expr = dec.expression ?? dec\n const args: any[] = expr.type === 'CallExpression' ? (expr.arguments ?? []) : []\n\n const fail = (msg: string) => {\n failed = true\n result.errors.push({\n start: dec.start ?? expr.start ?? member.start,\n end: dec.end ?? expr.end ?? member.end,\n message: msg,\n })\n }\n\n // 产物 emit `this.<name>` / `this.<name>_$__` 点访问:字符串字面量方法名\n // (`'my-fn'(){}`)经 keyName 取出后不是合法标识符,直接拼接会产出非法 JS\n if (!IDENT_RE.test(memberName)) {\n fail(`E-METHOD-DECO-ARG: @${kind} 目标方法名 '${memberName}' 不是合法标识符,无法前移(产物为 this.<name> 点访问)`)\n return\n }\n\n if (kind === 'onced') {\n // 无参\n if (args.length) { fail(`E-METHOD-DECO-ARG: @onced 不接受参数`); return }\n const f = `${TMP_F}${seq++}`\n push(`const ${f} = this.${memberName}.bind(this);`)\n push(`this.${memberName} = once(${f});`)\n push(`this.${memberName}_$__ = ${f};`)\n result.destroyStmts += (result.destroyStmts ? '\\n' : '') +\n `this.${memberName} = ${NOOP}; this.${memberName}_$__ = ${NOOP};`\n usedHelpers.add('once')\n } else {\n const waitArg = args[0]\n const wait = resolveWait(waitArg)\n if (wait === null || !Number.isFinite(wait)) {\n fail(`E-METHOD-DECO-ARG: @${kind} 的 wait 无法静态解析(须为数字字面量或模块级 const 数字)`)\n return\n }\n let immediate = false\n if (kind === 'debounced' && args.length > 1) {\n const b = resolveBool(args[1])\n if (b === null) { fail(`E-METHOD-DECO-ARG: @debounced 的 immediate 必须是布尔字面量`); return }\n immediate = b\n }\n if (kind === 'throttled' && args.length > 1) {\n fail(`E-METHOD-DECO-ARG: @throttled 不接受第二个参数`)\n return\n }\n\n const f = `${TMP_F}${seq++}`\n push(`const ${f} = this.${memberName};`)\n\n if (kind === 'debounced') {\n // 包装 guard;guard 自身也是 _$__\n const g = `${TMP_G}${seq++}`\n push(`const ${g} = function (...__a) { if (this?.isDestroyed) return; return ${f}.apply(this, __a) };`)\n push(`this.${memberName} = debounce(${g}, ${wait}, ${immediate});`)\n push(`this.${memberName}_$__ = ${g};`)\n result.destroyStmts += (result.destroyStmts ? '\\n' : '') +\n `this.${memberName}?.cancel?.(); this.${memberName} = ${NOOP}; this.${memberName}_$__ = ${NOOP};`\n usedHelpers.add('debounce')\n } else {\n // throttled:包装原函数,_$__ 即原函数(**无 guard**)\n push(`this.${memberName} = throttle(${f}, ${wait});`)\n push(`this.${memberName}_$__ = ${f};`)\n result.destroyStmts += (result.destroyStmts ? '\\n' : '') +\n `this.${memberName} = ${NOOP}; this.${memberName}_$__ = ${NOOP};`\n usedHelpers.add('throttle')\n }\n }\n\n result.removals.push(lineSpan(code, dec.start ?? expr.start - 1, dec.end ?? expr.end))\n }\n\n for (const member of node.body?.body ?? []) {\n if (member.type !== 'MethodDefinition') continue\n for (const dec of member.decorators ?? []) {\n handle(member, dec)\n }\n }\n }\n\n // 只处理本类:同文件祖先的 constructor 已经包装过;跨文件祖先也由各自文件处理。\n // 再注入一遍会造成 debounce(throttle) 双层包装与 _$__ 覆盖。\n collect(cls)\n\n // ⚠️ 用户已声明 own `beforeDestroyed` ⇒ **整体放弃前移并报 E 码**。\n // 原因:清理语句要注入成一个 `beforeDestroyed()` 重写,若用户已有一个,注入会\n // 产生重复方法定义(后者覆盖前者 → 用户逻辑静默丢失)。而\"只跳过清理、保留包装\"\n // 会造成包装了却永不 cancel 的泄漏 —— 比不包装更难查。故与其它失败一样走\n // all-or-nothing(不删不注 + E 码阻断)。\n if (!failed && result.ctorStmts) {\n const dup = (cls.body?.body ?? []).find(\n (m: any) => m.type === 'MethodDefinition' && m.static !== true && keyName(m.key) === 'beforeDestroyed',\n )\n if (dup) {\n result.errors.push({\n start: dup.start,\n end: dup.end,\n message:\n 'E-METHOD-DECO-HOOK: 组件自带 `beforeDestroyed()`,方法装饰器(@debounced/@throttled/@onced)' +\n '的清理需要重写该钩子 —— 请把清理逻辑并入你的 beforeDestroyed,或移除该装饰器',\n })\n }\n }\n\n if (failed || result.errors.length) {\n // 逐族 all-or-nothing:整体放弃(不删不注),运行时装饰器路径已无定义 —— 由 E 码阻断\n result.ctorStmts = ''\n result.destroyStmts = ''\n result.removals = []\n result.runtimeHelpers = []\n return result\n }\n\n result.runtimeHelpers = [...usedHelpers]\n return result\n}\n","/**\n * TS 专有语法的运行时剥离(`x!` 后缀非空断言)。\n *\n * 单独成模块的原因:`template-extract`(分析期)与 `template-subs`(分析期 + 各 codegen 模块)\n * 都要用它,而 `template-subs` 已经 import 了 `template-extract` 的 `hasTsSyntax` /\n * `MainTemplate` / `TemplateVarInfo`。若 `template-extract` 反过来 import `template-subs`,\n * 就形成模块环 —— 本文件零依赖,把环打断。\n */\nimport { hasTsSyntax, isUnaryKeyword, scanJsText } from '../utils/js-text'\n\n/**\n * 剥离后缀非空断言 `expr!`(上下文感知,跳过字符串/注释/正则)。\n * 不处理 `as`/`satisfies`:复检 `hasTsSyntax` 仍命中则由调用方判为不可编译。\n */\nexport function stripTs(src: string): string {\n const { mask, closed } = scanJsText(src)\n if (!closed) return src\n let out = ''\n let lastCode = ''\n let lastCodeIdx = -1\n for (let i = 0; i < src.length; i++) {\n const c = src[i]\n if (mask[i] && c === '!') {\n const next = i + 1 < src.length ? src[i + 1] : ''\n // `!` 与上一个代码字符之间有换行时不判 postfix:`a\\n!b` 经 ASI 断成\n // 两条语句(`!b` 是前缀取反),剥掉 `!` 会静默改变语义。复检侧\n // hasTsSyntax 的 BANG_RE 要求 `!` 紧贴 [\\w)\\]],天然不命中跨行形态,\n // 两边判据保持一致\n const newlineBefore = lastCodeIdx >= 0 && src.slice(lastCodeIdx + 1, i).includes('\\n')\n const postfix =\n next !== '=' &&\n !!lastCode &&\n !newlineBefore &&\n /[A-Za-z0-9_$)\\]'\\\"`]/.test(lastCode) &&\n // 关键字(typeof/await/return/…)后的 `!` 是一元取反,不是断言\n !isUnaryKeyword(src, lastCodeIdx)\n if (postfix) continue\n }\n out += c\n if (mask[i] && !/\\s/.test(c)) {\n lastCode = c\n lastCodeIdx = i\n }\n }\n return out\n}\n\n/**\n * `stripTs` + `hasTsSyntax` 复检的合并出口(同一份文本只处理一次)。\n *\n * 主模板与分析期的每个插值都要「先 stripTs 再复检」,且同一条表达式文本会分别流经\n * `template-extract`(分析)、`build-vars`(取值函数)、`render-effect`(内联工厂)三处,\n * 每处各自 `stripTs`(内含多次 `scanJsText` 全文扫描)+ `hasTsSyntax`(再一次 `scanJsText`)\n * ⇒ 一条文本被全文扫描 6+ 遍。三处传入的是**逐字相同**的字符串(wraps 后仍是同一拼接结果),\n * 故按文本 memo。`stripTs`/`hasTsSyntax` 是纯函数(结果只依赖入参),跨文件共享同一缓存亦正确;\n * LRU 上限防 dev 长会话内存增长。\n */\nconst STRIP_CHECK_MEMO = new Map<string, { stripped: string; tsHit: boolean }>()\nconst STRIP_CHECK_MAX = 4096\n\nexport function stripTsChecked(src: string): { stripped: string; tsHit: boolean } {\n const hit = STRIP_CHECK_MEMO.get(src)\n if (hit !== undefined) {\n // LRU touch\n STRIP_CHECK_MEMO.delete(src)\n STRIP_CHECK_MEMO.set(src, hit)\n return hit\n }\n const r = { stripped: stripTs(src), tsHit: false }\n r.tsHit = hasTsSyntax(r.stripped)\n if (STRIP_CHECK_MEMO.size >= STRIP_CHECK_MAX) {\n const oldest = STRIP_CHECK_MEMO.keys().next().value\n if (oldest !== undefined) STRIP_CHECK_MEMO.delete(oldest)\n }\n STRIP_CHECK_MEMO.set(src, r)\n return r\n}\n","/**\n * 从 render() 函数体提取「主视图模板」:h`` 模板字面量 + 各插值的信息。\n *\n * 主视图定义:在 render() 函数体内、**不穿过任何函数边界**即可到达的 h`` 模板\n * (指令回调内的模板属于子视图,有独立的子模板 codegen)。\n * D7 已禁止「插值处直接嵌套模板」,因此主模板的 vars 编号是纯线性的。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { COMpelem_DIRECTIVES } from './render-body'\nimport { collectTemplateTagAliases } from './template'\nimport { stripTsChecked } from './strip-ts'\nimport { blockedTsText, containsBlockedTsNode, thisChain, topLevelReturns, unwrapExpr } from '../utils/ast'\n\n/**\n * 这些语句包住的 `return h`` `` **可能被跳过** ⇒ 条件会被整体丢弃(D8)。\n *\n * 只列\"有条件语义\"的语句:裸块 `{ return }` 一定执行、`try { return } finally {}`\n * 里的 return 也一定会发生,两者都不算丢条件,不进来(避免误报)。\n */\nconst SKIPS_RETURN_STMTS: ReadonlySet<string> = new Set([\n 'IfStatement',\n 'ForStatement',\n 'ForInStatement',\n 'ForOfStatement',\n 'WhileStatement',\n 'DoWhileStatement',\n 'SwitchStatement',\n])\n\nexport interface TemplateVarInfo {\n /** Template 序下标 */\n index: number\n /** 表达式源码(原样切片,可能含 TS 语法时已报错) */\n exprSource: string\n /** 是否为「直接调用 compelem 指令函数」(isDirective 的静态证明,见 B1 §3.3) */\n isDirectiveCall: boolean\n directiveName?: string\n /**\n * callee 是**模块绑定**的函数名(自定义指令 `directive()` 工厂产物,或普通格式化函数)。\n *\n * 静态上无法区分二者 —— 模块级 `pick`/`fmt`/`t` 与 `ripples`/`tooltip` 长得一样。\n * 故 extract 阶段**不**据此判定指令,只在**标签位**由 codegen 放行\n * (`<div ${ripples()}>` 是自定义指令的规范用法;文本位 `${fmt(x)}` 是取值)。\n *\n * 误判代价不对称:文本位误判成指令会生成 `get(i)[1][0]`,而该 var 的值是\n * 字符串/数字 → `undefined[0]` 在挂载时直接抛 TypeError。\n */\n moduleBindingName?: string\n /**\n * `${html(CONST)}` —— **静态 HTML 常量折叠点**。\n *\n * 实参是**同文件模块级 `const`**,初始化器是字符串字面量(无插值的模板字面量亦可),\n * 且整串**不含大写字母**。命中则把该串在编译期解析成节点、拼进建树序列 ——\n * 于是 nodeSn / paths / nodes 全部照常编号,**不产生 ups / fx / pointEffects**,\n * 运行期零开销(省掉每实例一次 `innerHTML` 解析 + 一个更新点 + 一个 effect)。\n *\n * **不含大写字母**是与运行期 `Html` 指令严格对齐的判据:`convertHTML` 在\n * `HAS_UPPER_RE.test(html)` 为假时**原样返回**(见 src/directives/Html.ts:15-16),\n * 即大小写转换(camelCase 属性 → kebab、`PascalCase` 标签 → 已注册标签名)根本不发生。\n * 故折叠子集与运行期路径**逐字节等价**;含大写则不折,落回运行期 `html()`,\n * 由它自己做转换 —— 语义零变化,只是慢。\n *\n * 不满足条件时返回 undefined:该 var 照常按 `html` 指令点编译,**不是错误**。\n * 折叠是纯优化,命中与否都不改变运行结果。跨文件常量天然落在这里\n * (compileFile 是单文件纯函数,不解析 import)。\n *\n * 存在本字段时该 var **不占用 varIndex**(build-vars 同步跳过)——\n * 两处共用同一个标记,保证 `exprs` 与 `ups` 仍 1:1。\n */\n fragment?: string\n /** TAG 指令实参中 this 链的全前缀路径(供运行时 directiveVarChain 回退) */\n directiveVarChain?: string[]\n /** 表达式在原始源码中的绝对起止偏移(子模板 wraps / prelude 切片用) */\n start?: number\n end?: number\n /**\n * 模块 AST 中的表达式节点(U2:freeIdentifiers 免重复 parse——模块已解析过,\n * 直接对该节点做自由标识符/this 链分类收集,语义与 wrapper 重解析一致)。\n * 手工构造的 vars 可不带(调用方回退字符串 parse 路径)。\n */\n node?: any\n}\n\n/**\n * 把「Template 序」的插值表压成「ups 序」(数组下标即 `UpOut.varIndex`)。\n *\n * ## 为什么两个序不一样\n * `${html(CONST)}` 静态片段在编译期就折进建树序列,**不产生 up、不占 varIndex**\n * (见 `TemplateVarInfo.fragment`)。于是 varIndex 与 quasis 下标不再线性对应:\n *\n * ```html\n * <div>${html(FRAG)}${this.n}</div>\n * ```\n *\n * 这里 `FRAG` 的 `index` 是 0 但没有 varIndex,`this.n` 的 `index` 是 1 而 varIndex 是 0。\n * 任何按 `v.index` 建表、再用 `up.varIndex` 去查的消费方,都会把 varIndex=0 解到\n * 片段 var 上 —— 取值表达式错、且读不到任何信号(该点永不更新)。\n *\n * 本函数是该对照的**唯一真相源**:与 `build-vars`(`v.fragment` 同跳)保持同一序号空间。\n * 消费方:`compile.ts`(主模板 varIndexToExpr/Range)、`codegen/render-effect.ts`\n * (`buildSubInliner`)、`codegen/template-dom.ts`(isPureTmpl 自比对)。\n */\nexport function varsByUpIndex(vars: readonly TemplateVarInfo[]): TemplateVarInfo[] {\n const out: TemplateVarInfo[] = []\n for (const v of vars) {\n if (v.fragment) continue\n out.push(v)\n }\n return out\n}\n\nexport interface MainTemplate {\n /** quasis 的 cooked 串(长度 = 插值数 + 1) */\n strings: string[]\n vars: TemplateVarInfo[]\n start: number\n end: number\n /** prelude 为 render() 顶层、return 之前的语句切片;无则为 '' */\n preludeStart: number\n preludeEnd: number\n preludeSrc: string\n}\n\nexport class TemplateExtractError extends Error {}\n\n/** 仅允许出现在 TAG 位置的内置指令(其非模板实参可静态提取 this 链)。 */\nexport const TAG_ONLY_DIRECTIVES = new Set(['bind', 'show', 'model', 'classes', 'styles', 'html'])\n\n/** 与运行期 `Html` 指令的 `HAS_UPPER_RE` 同源:含大写则不做折叠(运行期自己转)。 */\nconst HAS_UPPER_RE = /[A-Z]/\n\n/**\n * 判定 `${html(CONST)}` 静态 HTML 常量折叠点,返回可折叠的 HTML 串,不满足则 undefined。\n *\n * 判据(全部满足才折):\n * 1. 表达式是 `html(IDENT)`:`html` 解析到从 compelem 导入的 `html`,实参恰好 1 个裸标识符;\n * 2. `IDENT` 在本文件解析到**模块级 `const`**(`let`/`var` 可重新赋值,折叠会固化某次运行值);\n * 3. 初始化器是字符串字面量,或**无插值**的模板字面量;\n * 4. 整串不含大写字母(见 TemplateVarInfo.fragment 的等价性论证)。\n */\nexport function staticHtmlFragmentOf(e: any, comp: ComponentAnalysis): string | undefined {\n if (e?.type !== 'CallExpression' || e.callee?.type !== 'Identifier') return undefined\n if (comp.compelemImports.get(e.callee.name) !== 'html') return undefined\n const args = e.arguments ?? []\n if (args.length !== 1 || args[0]?.type !== 'Identifier') return undefined\n\n const decl = comp.moduleConstInits?.get(args[0].name)\n const init = decl?.init\n if (!init) return undefined\n\n let html: string\n if (init.type === 'Literal' && typeof init.value === 'string') html = init.value\n else if (init.type === 'TemplateLiteral' && (init.expressions ?? []).length === 0) {\n html = init.quasis?.[0]?.value?.cooked ?? ''\n } else return undefined\n\n if (HAS_UPPER_RE.test(html)) return undefined\n return html\n}\n\n/** 解包 TS 包装节点 —— 统一实现在 utils/ast#unwrapExpr。 */\n\n/**\n * 把一条 `this.a.b.c` 成员链还原为字段路径数组(最外层在前)。\n * 非 this 起始 / 含 computed 访问时返回 null。\n *\n * 统一实现在 utils/ast#thisChain(属性名走 keyName,`#private` 带 `#` 前缀,\n * 与 render-body 侧对齐 —— 本副本原先手写分支漏了前缀,会把 `this.#x` 与\n * `this.x` 混成同一个依赖键)。\n */\n\n/**\n * 提取 TAG 指令实参中的 this 链全前缀路径。\n *\n * 收集的路径与指令工厂调用期间运行时建立的依赖对齐:\n * `model(this.form.name)` → `['form', 'form.name']`(根 + 全路径前缀链)。\n * 仅收集可静态解析的 this 成员链;表达式中其他部分忽略。\n */\nexport function extractThisChainPaths(args: any[]): string[] | undefined {\n const out: string[] = []\n const seen = new Set<string>()\n const push = (p: string) => { if (!seen.has(p)) { seen.add(p); out.push(p) } }\n const walk = (node: any) => {\n if (!node || typeof node !== 'object' || typeof node.type !== 'string') return\n if (node.type === 'MemberExpression' || node.type === 'OptionalMemberExpression') {\n const parentIsMember = false // 由 thisChain 从最外层回溯,内层不再单独处理\n if (!parentIsMember) {\n const chain = thisChain(node)\n if (chain) {\n let acc = ''\n for (const seg of chain) {\n acc = acc ? acc + '.' + seg : seg\n push(acc)\n }\n return // 整条链已处理\n }\n }\n }\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const c = node[key]\n if (Array.isArray(c)) for (const x of c) walk(x)\n else if (c && typeof c === 'object' && typeof c.type === 'string') walk(c)\n }\n }\n for (const a of args) walk(a)\n return out.length ? out : undefined\n}\n\nexport function extractMainTemplate(\n comp: ComponentAnalysis,\n source: string,\n /** U5:analyzeRender 单 walk 时顺带收集的 depth-0 h`` 节点;提供则免本函数重扫。 */\n preHits?: any[],\n): MainTemplate | null {\n const hAliases = collectTemplateTagAliases(comp)\n if (!hAliases.size) return null\n if (!comp.renderBody) return null\n\n const hits: any[] = []\n if (preHits !== undefined) {\n hits.push(...preHits)\n } else {\n // 不下钻函数边界:回调内模板属于子视图\n const walk = (node: any) => {\n if (!node || typeof node !== 'object' || typeof node.type !== 'string') return\n if (\n node.type === 'ArrowFunctionExpression' ||\n node.type === 'FunctionExpression' ||\n node.type === 'FunctionDeclaration'\n ) {\n return\n }\n if (\n node.type === 'TaggedTemplateExpression' &&\n node.tag?.type === 'Identifier' &&\n hAliases.has(node.tag.name)\n ) {\n hits.push(node)\n }\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const c = node[key]\n if (Array.isArray(c)) for (const x of c) walk(x)\n else if (c && typeof c === 'object' && typeof c.type === 'string') walk(c)\n }\n }\n for (const stmt of comp.renderBody) walk(stmt)\n }\n\n if (!hits.length) return null\n if (hits.length > 1) {\n throw new TemplateExtractError(\n `组件 ${comp.className} 的 render() 中发现 ${hits.length} 个主视图 h\\`\\` 模板` +\n `(指令回调内的模板不计);codegen 要求主视图模板唯一`,\n )\n }\n\n const tmpl = hits[0]\n const quasi: any = tmpl.quasi\n // cooked == null = 模板串含**非法转义**(如 Windows 路径 `C:\\users` 里的 `\\u`):\n // tagged template 容忍非法转义(ES2018 revision),静默取 '' 会丢字,必须报错要求转义\n const strings: string[] = (quasi.quasis ?? []).map((q: any, qi: number) => {\n if (q.value?.cooked == null) {\n const raw = typeof q.start === 'number' && typeof q.end === 'number' ? source.slice(q.start, q.end) : ''\n throw new TemplateExtractError(\n `组件 ${comp.className} 的主模板第 ${qi} 段静态文本含非法转义序列(偏移 ${q.start ?? '?'}):` +\n `\\`${raw}\\`;模板串里 \\\\u、\\\\x 后必须是合法转义(路径等请写 \\\\\\\\),否则该段文本无法取值`,\n )\n }\n return String(q.value.cooked)\n })\n const exprs: any[] = quasi.expressions ?? []\n\n const vars: TemplateVarInfo[] = exprs.map((e: any, index: number) => {\n const exprSource = source.slice(e.start, e.end).trim()\n // 顺序:stripTs → TS 复检(**不能**直接用 exprSource 判)。\n // codegen 侧(build-vars.ts / render-effect.ts)都是「stripTs → TS 复检」,\n // 此处若检查未剥离的原文,`${this.foo!}` 这类**可被安全剥掉**的写法会在分析期\n // 被拒,而同一表达式在 codegen 里本来能通过 —— 两处判定必须同序。\n // 注意 exprSource 本身仍是原样切片(start/end 供 wraps / prelude 使用),不改。\n // stripTsChecked 与 codegen 三处共用同一 memo,省同一条文本的重复全文扫描。\n if (stripTsChecked(exprSource).tsHit) {\n throw new TemplateExtractError(\n `组件 ${comp.className} 模板插值 #${index} 含 TS 专有语法(as/satisfies/非空断言):` +\n `\\`${exprSource}\\`;codegen 产物为纯 JS,请在模板外完成类型操作`,\n )\n }\n // 旧式尖括号断言 `<T>x / 显式实例化 f<T>():文本判据抓不到(会与 `a < b` 比较混淆),\n // 按 AST 判(C-G6 ①)。\n if (containsBlockedTsNode(e)) {\n throw new TemplateExtractError(\n blockedTsText(`组件 ${comp.className} 模板插值 #${index}`, exprSource),\n )\n }\n let isDirectiveCall = false\n let directiveName: string | undefined\n let moduleBindingName: string | undefined\n let directiveVarChain: string[] | undefined\n // 先做指令分类,再记录可折叠的静态 HTML 常量。\n // 折叠只发生在文本位;属性/TAG 位由 clearAttrFragments 清掉 fragment 标记后\n // 仍按 `html` 指令点编译(TAG 位是合法用法)。\n const fragment = staticHtmlFragmentOf(e, comp)\n if (e.type === 'CallExpression' && e.callee?.type === 'Identifier') {\n const imported = comp.compelemImports.get(e.callee.name)\n if (imported && COMpelem_DIRECTIVES.has(imported)) {\n isDirectiveCall = true\n directiveName = imported\n if (TAG_ONLY_DIRECTIVES.has(imported)) {\n directiveVarChain = extractThisChainPaths(e.arguments ?? [])\n }\n } else if (comp.knownDirectives?.has(e.callee.name)) {\n // 外部指令(options.knownDirectives,如 compelem-router 的 outlet):\n // 调用返回 DirectiveInstance,按指令点编译(0.28 动态引擎的「函数值即指令」契约)\n isDirectiveCall = true\n directiveName = e.callee.name\n } else if (comp.moduleBindings?.has(e.callee.name)) {\n // 模块绑定调用:只记名,**不在此处**判为指令。\n // 静态无法区分自定义指令(directive() 产物)与普通函数(formatter/i18n);\n // 只有标签位才放行,见 TemplateVarInfo.moduleBindingName 的说明。\n moduleBindingName = e.callee.name\n }\n }\n return { index, exprSource, isDirectiveCall, directiveName, moduleBindingName, directiveVarChain, fragment, start: e.start, end: e.end, node: e }\n })\n\n // prelude = return 之前的全部顶层语句(与子模板 buildCandidate 同逻辑)\n let preludeStart = tmpl.start\n let preludeEnd = tmpl.start\n let preludeSrc = ''\n const rets = topLevelReturns(comp.renderBody)\n const retNode = rets.find((r) => unwrapExpr(r.argument) === tmpl)\n const stmts = comp.renderBody\n // 拿不到 return 节点 = 唯一的那个顶层 return 的**直接参数**不是本模板\n // (`cond ? h\\`\\` : null` / `cond && h\\`\\`` / `(a, h\\`\\`)` / `fn(h\\`\\`)`)。\n // 此时下方只会静默产出「无 prelude、无条件恒渲染」的视图,条件被整体丢弃,\n // 而 compile.ts 的硬错误门只看有没有 buildTemplate,看不见这种形状 ⇒ 必须在此报。\n if (!retNode && rets.length === 1) {\n const arg = rets[0].argument\n const argSrc = arg && typeof arg.start === 'number' && typeof arg.end === 'number'\n ? source.slice(arg.start, arg.end)\n : ''\n throw new TemplateExtractError(\n `D8: 组件 ${comp.className} render() 的顶层 return 必须直接返回 h\\`\\` 模板` +\n `(可带 TS 包装/括号)或 null;条件/短路/逗号/函数包装会静默丢弃条件` +\n `(收到 \\`${argSrc}\\`)。请改用 ifTrue / ifElse / when 指令包裹模板。`,\n )\n }\n if (retNode) {\n const retIdx = stmts.indexOf(retNode)\n if (retIdx > 0) {\n preludeStart = stmts[0].start\n preludeEnd = stmts[retIdx - 1].end\n preludeSrc = source.slice(preludeStart, preludeEnd)\n } else if (retIdx < 0) {\n // return 不是 render() 的**直接**顶层语句(被 if / for / switch 包住)。\n //\n // ⚠️ 这里必须报错,不能\"取前置语句当 prelude 然后继续\"(2026-10-22 审查 C-4):\n // ```ts\n // render() { if (this.n) { return h`<div>${this.n}</div>` } }\n // ```\n // `topLevelReturns` 会下钻块语句 ⇒ rets.length === 1 ⇒ 过 D5;retNode 也匹配上\n // ⇒ 过 D8。结果 buildTemplate 无条件建 `<div>`、fx 无 `if (rc.n)` 守卫 ⇒\n // **n = 0 时照样渲染**,编译零诊断。而注释明写 D8 就是要防\"条件被整体丢弃\"。\n //\n // 只对**能跳过 return** 的宿主语句报(条件 / 循环 / switch):裸块 `{ return h`` }`\n // 与 try/finally 里的 return 不会丢条件,继续按老逻辑取 prelude。\n const hostIdx = stmts.findIndex(\n (s: any) => typeof s.start === 'number' && s.start <= tmpl.start && tmpl.end <= s.end,\n )\n const host = hostIdx >= 0 ? stmts[hostIdx] : null\n if (host && SKIPS_RETURN_STMTS.has(host.type)) {\n throw new TemplateExtractError(\n `D8: 组件 ${comp.className} render() 的模板 return 被包在 ${host.type} 里,` +\n `该条件会被整体丢弃(视图恒渲染)。请把 return 提到 render() 顶层,` +\n `或改用 ifTrue / ifElse / when 指令包裹模板。`,\n )\n }\n // 块内 return 之前的局部声明仍无法捕获,会由 build-vars 的 free-check 明确报错。\n if (hostIdx > 0) {\n preludeStart = stmts[0].start\n preludeEnd = stmts[hostIdx - 1].end\n preludeSrc = source.slice(preludeStart, preludeEnd)\n }\n }\n }\n\n // C-G6 ④:prelude(render() 顶层、return 之前的语句)同受尖括号断言 / 显式实例化门\n // 保护。复用已解析的 renderBody 语句 AST,不再二次 parse。文本判据(hasTsSyntax)\n // 抓不到 `<T>x` / `f<T>()`,但这两形态会随 prelude 原样进入取值函数与内联工厂。\n if (preludeSrc) {\n for (const s of stmts) {\n if (typeof s.start === 'number' && s.start > preludeEnd) break\n if (\n typeof s.start === 'number' &&\n typeof s.end === 'number' &&\n s.start >= preludeStart &&\n s.end <= preludeEnd &&\n containsBlockedTsNode(s)\n ) {\n throw new TemplateExtractError(\n blockedTsText(`组件 ${comp.className} render() prelude`, source.slice(s.start, s.end)),\n )\n }\n }\n }\n\n return { strings, vars, start: tmpl.start, end: tmpl.end, preludeStart, preludeEnd, preludeSrc }\n}\n","/**\n * 模板层约定规则:模板树 + 插值表达式源码 → 编译期诊断。\n *\n * 编译期覆盖以下约定检查:\n * E-PROP-INTERP .prop 的值必须是插值\n * E-MUTATE-MODIFIER @mutate 必须带 attr/child/char/tree 类型修饰符\n * E-EVENT-FN 事件处理器必须是函数/成员\n * E-EVENT-MODIFIER 非键盘事件上出现了不会生效的修饰符(运行期会被当成按键名过滤)\n * E-REF-TYPE ref 必须绑定 createRef() 结果\n * E-DIRECTIVE-SCOPE 指令只能出现在允许的位置\n * E-FOREACH-KEY forEach 的 keyFn 必须是函数(运行期无条件 keyFn.call)\n * E-MODEL-CHAIN model() 的实参必须能解析出 this 写回路径\n * W-EVENT-NO-HANDLER @event 无插值 → 监听器为空(运行期注册 noop)\n * W-EVENT-COMP-MODIFIER 组件事件上使用了该通道不支持的修饰符\n *\n * 其余同类运行时检查的编译期覆盖:\n * - 动态根元素(vars.length != updatePointMetas.length)的三个触发条件\n * (注释内插值 / 属性多插值 / 标签名插值)→ template-tree.ts 硬错误\n *\n * 无法静态判定的表达式形态(外部标识符、动态访问、未知基类成员)一律放行 —— 宁漏勿误报。\n * 错误定位统一挂在模板字面量整体(start/end = 模板源码区间),明细在 message 中。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { decoratorName, isCustomTag, keyName, superClassName, thisChain, THIS_MEMBER_RE } from '../utils/ast'\nimport type { TemplateTree, TElement, TNode } from './template-tree'\nimport type { MainTemplate, TemplateVarInfo } from './template-extract'\nimport type { ConventionsContext } from './conventions'\nimport { bodyReturnsTemplate, unwrapTsExpr } from './conventions'\nimport { collectTemplateTagAliases } from './template'\n\n/** knownTags 缺省(无同文件 @tag 登记)时的空集——isCustomTag 需要恒有 .has。 */\nconst EMPTY_TAG_SET: ReadonlySet<string> = new Set<string>()\n\nexport interface TemplateRuleError {\n start: number\n end: number\n message: string\n /** 'warn':提示级(合法但运行期静默失效),走 console.warn,不阻断构建。缺省 error。 */\n severity?: 'warn'\n}\n\n\n/** 指令允许的插入位置(EnterPointType 值,小写)。 */\nconst DIRECTIVE_SCOPES: Record<string, string[]> = {\n bind: ['tag'],\n show: ['tag'],\n model: ['tag'],\n classes: ['tag'],\n styles: ['tag'],\n forEach: ['text', 'slot'],\n ifTrue: ['text', 'slot'],\n ifElse: ['text', 'slot'],\n when: ['text', 'slot'],\n slot: ['slot'],\n html: ['tag', 'text', 'slot'],\n}\n\n/** @mutate 必需的变异类型修饰符(任一即可,对齐运行期 extends.ts addMutation 的 slots 判定)。 */\nconst MUTATE_TYPE_MODS = new Set(['attr', 'child', 'char', 'tree'])\n\n/**\n * 事件修饰符分类 —— 逐项对齐运行期 `events/event.ts`:\n *\n * - `EVENT_PLAIN_MODS`:`parseModifiers` 里的 `MODI_EV_NON_KEY_TOKENS`,**不会**被当成按键名;\n * - `EVENT_FLOW_MOD_RE`:`debounce` / `debounce:100` / `throttle` / `throttle:100`;\n * - 其余 token 一律按 `KeyboardEvent.key` 过滤(`checkKeys`),因此在**非键盘事件**上\n * 永远匹配不到(`e.key === undefined`)⇒ 监听器恒不触发,属于必须拦的写法。\n */\nconst EVENT_PLAIN_MODS: ReadonlySet<string> = new Set([\n 'self', 'stop', 'prevent', 'once', 'capture', 'passive',\n 'left', 'right', 'middle', 'ctrl', 'alt', 'shift', 'meta',\n])\nconst EVENT_FLOW_MOD_RE = /^(debounce|throttle)(:\\d+)?$/\n\n/**\n * 键盘类事件:其余 token 在这类事件上是**合法键名**(`@keydown.a`),不做取值枚举校验\n * (`KeyboardEvent.key` 取值域太大,逐一列举只会误报)。\n */\nconst KEY_EVENTS: ReadonlySet<string> = new Set(['keydown', 'keyup', 'keypress'])\n\n/**\n * **原生 DOM 事件名**白名单 —— E-EVENT-MODIFIER 只对这些名字判定修饰符词表。\n *\n * 为什么必须收窄到原生事件:自定义事件(尤其是 `extends.ts` 注册的**扩展事件**)\n * 会把 `parts` 原样交给自己的实现,修饰符词表由扩展事件自定义\n * (如 `@outside.mousedown`:`mousedown` 是 outside 的参数,不是按键名)。\n * 事件名不在本表 ⇒ 词表不可知 ⇒ 一律放行。\n */\nconst NATIVE_EVENTS: ReadonlySet<string> = new Set([\n 'click', 'dblclick', 'contextmenu', 'mousedown', 'mouseup', 'mousemove',\n 'mouseover', 'mouseout', 'mouseenter', 'mouseleave', 'wheel', 'scroll', 'scrollend',\n 'focus', 'blur', 'focusin', 'focusout', 'input', 'change', 'submit', 'reset', 'select',\n 'pointerdown', 'pointerup', 'pointermove', 'pointerover', 'pointerout',\n 'pointerenter', 'pointerleave', 'pointercancel', 'gotpointercapture', 'lostpointercapture',\n 'touchstart', 'touchend', 'touchmove', 'touchcancel',\n 'drag', 'dragstart', 'dragend', 'dragenter', 'dragleave', 'dragover', 'drop',\n 'paste', 'copy', 'cut', 'compositionstart', 'compositionend', 'compositionupdate',\n 'keydown', 'keyup', 'keypress',\n 'load', 'error', 'beforeunload', 'resize', 'animationstart', 'animationend',\n 'animationiteration', 'transitionend', 'transitionstart', 'slotchange',\n])\n\n/**\n * 组件事件通道(`registerEvent` 第 1 分支 → `wrapControlFn(cbk, f, true)`)实际生效的修饰符。\n * `stop/prevent/self/capture/passive/鼠标/键盘` 在这一通道被整体丢弃 —— 无非空 DOM 监听器可挂。\n */\nconst COMP_EVENT_MODS: ReadonlySet<string> = new Set(['once'])\n\n/**\n * CompElem 基类内置实例成员(事件绑定到它们不算错误)。\n *\n * 手工镜像,与 `F:\\github\\compelem\\src\\CompElem.ts` 逐项对应;运行期一加成员这里就要跟。\n * 少列 = 误报(把合法引用判成「不是组件成员」),多列 = 漏报,故宁可同步时多核对一遍。\n */\nconst KNOWN_BASE_MEMBERS = new Set([\n // 生命周期 / 框架方法\n 'setup', 'propsReady', 'render', 'beforeMount', 'mounted', 'slotChange', 'afterUpdate',\n 'beforeDestroyed', 'destroyed', 'destroy', 'emit', 'nextTick', 'forceUpdate', 'updateProps',\n 'insertStyleSheet', 'getSubViewNodes', 'defineSignalField',\n // Web Components 回调(CompElem.ts:284 / 321 / 626)\n 'connectedCallback', 'disconnectedCallback', 'attributeChangedCallback',\n // 只读字段 / getter\n 'cid', 'rootComponent', 'parentComponent', 'wrapperComponent', 'renderRoot', 'renderRoots',\n 'shadowRoot', 'slots', 'slotHooks', 'cssSheets', 'globalCssSheet', 'attrs', 'props',\n 'isMounted', 'isDestroyed', 'cssVars', 'tagName',\n])\n\n\nfunction collectElements(nodes: TNode[], out: TElement[]): void {\n for (const nd of nodes) {\n if (nd.type !== 'element') continue\n out.push(nd)\n collectElements(nd.children, out)\n }\n}\n\n/**\n * 沿同文件继承链收集成员名。\n * 链尾不可知(非本地类且非导入的 CompElem)→ 返回 null(无法穷尽,全部放行)。\n */\nfunction collectMemberNames(comp: ComponentAnalysis, ctx: ConventionsContext): Set<string> | null {\n const out = new Set<string>()\n let node = comp.cls ?? ctx.localClasses.get(comp.className)\n if (!node) return null\n const seen = new Set<any>()\n while (node && !seen.has(node)) {\n seen.add(node)\n for (const m of node.body?.body ?? []) {\n const n = keyName(m.key)\n if (n) out.add(n)\n }\n const sup = superClassName(node)\n if (!sup) {\n // 无标识符基类但有 superClass 节点(mixin 调用 `extends Mixin(X)`)→ 成员不可穷尽\n if (node.superClass) return null\n break\n }\n if (ctx.localClasses.has(sup)) {\n node = ctx.localClasses.get(sup)\n continue\n }\n // 链尾:基类是导入的 CompElem → 成员空间已知(仅剩框架内置),可穷尽\n if (comp.compelemImports.get(sup) === 'CompElem') break\n return null\n }\n return out\n}\n\n/** 在继承链上找成员定义节点(PropertyDefinition / MethodDefinition),自派生类向上取首个命中。 */\nfunction findMemberNode(\n comp: ComponentAnalysis,\n ctx: ConventionsContext,\n name: string,\n): any | null {\n let node = comp.cls ?? ctx.localClasses.get(comp.className)\n const seen = new Set<any>()\n while (node && !seen.has(node)) {\n seen.add(node)\n for (const m of node.body?.body ?? []) {\n if (keyName(m.key) === name) return m\n }\n const sup = superClassName(node)\n node = sup && ctx.localClasses.has(sup) ? ctx.localClasses.get(sup) : null\n }\n return null\n}\n\nfunction isCreateRefCall(initNode: any, comp: ComponentAnalysis): boolean {\n return (\n initNode?.type === 'CallExpression' &&\n initNode.callee?.type === 'Identifier' &&\n comp.compelemImports.get(initNode.callee.name) === 'createRef'\n )\n}\n\n/** 内联函数形态:function 声明 / async / 箭头函数。 */\nconst INLINE_FN_RE = /(^function\\b)|(^async\\s*(?:function\\b|\\())|=>/\n\n/** 不可能是双向绑定目标的节点类型(字面量 / 容器 / 运算结果 / 调用产物)。 */\nconst MODEL_NON_TARGET_TYPES: ReadonlySet<string> = new Set([\n 'Literal', 'StringLiteral', 'NumericLiteral', 'BooleanLiteral', 'NullLiteral',\n 'TemplateLiteral', 'ArrayExpression', 'ObjectExpression', 'UnaryExpression',\n 'BinaryExpression', 'LogicalExpression', 'ConditionalExpression',\n 'CallExpression', 'NewExpression', 'ThisExpression',\n])\n\n/** 成员链的最内层是不是 `this`(`thisChain` 为 null 时用来区分「含下标」与「非 this 根链」)。 */\nfunction rootIsThis(node: any): boolean {\n let cur = node\n while (cur && (cur.type === 'MemberExpression' || cur.type === 'OptionalMemberExpression')) {\n cur = cur.object\n }\n return cur?.type === 'ThisExpression'\n}\n\n/** 收集节点里的字符串字面量(数组展开;模板字面量要求无插值)。动态值一律不收。 */\nfunction literalStrings(node: any, out: string[] = []): string[] {\n if (!node || typeof node !== 'object') return out\n if (node.type === 'Literal' && typeof node.value === 'string') {\n out.push(String(node.value))\n return out\n }\n if (node.type === 'ArrayExpression') {\n for (const el of node.elements ?? []) literalStrings(el, out)\n return out\n }\n if (node.type === 'TemplateLiteral' && !(node.expressions ?? []).length) {\n const s = node.quasis?.[0]?.value?.cooked\n if (typeof s === 'string') out.push(s)\n }\n return out\n}\n\n/**\n * 本文件内「自定义元素标签 → `@emits` 声明集」。\n *\n * 只收同文件类:跨文件组件的 emits 表在单文件编译里不可知(compileFile 不解析 import),\n * 拿不到就放行 —— 组件事件相关检查宁可漏报也不能误报(`@click.stop` 在组件标签上\n * 完全可能绑定的是原生 click)。\n */\nfunction collectLocalEmits(\n comp: ComponentAnalysis,\n ctx: ConventionsContext,\n): Map<string, Set<string>> {\n const out = new Map<string, Set<string>>()\n for (const cls of ctx.localClasses.values()) {\n let tag: string | undefined\n let emits: Set<string> | undefined\n for (const dec of cls.decorators ?? []) {\n // 节点可能是 Decorator 包装,也可能直接是表达式 —— 两者都要吃(decoratorName 内部同样双通道)\n const expr = dec.expression ?? dec\n const local = decoratorName(dec)\n const imported = local ? comp.compelemImports.get(local) : undefined\n if (imported === 'tag') {\n tag = literalStrings(expr.arguments?.[0])[0]?.toLowerCase()\n } else if (imported === 'emits') {\n const list = new Set<string>()\n for (const a of expr.arguments ?? []) for (const s of literalStrings(a)) list.add(s)\n emits = list\n }\n }\n if (tag && emits) out.set(tag, emits)\n }\n return out\n}\n\n/** 对齐运行期 `matchEmit`:精确名或 `x:*` 前缀通配。 */\nfunction matchEmitName(emits: ReadonlySet<string>, name: string): boolean {\n if (emits.has(name)) return true\n for (const e of emits) {\n if (e.endsWith(':*') && name.startsWith(e.slice(0, -1))) return true\n }\n return false\n}\n\n/** `@emits` 声明的实参能否静态解析为字符串(决定该事件名是否可信) */\nfunction isUndefinedLike(node: any): boolean {\n if (!node) return true\n if (node.type === 'Identifier') return node.name === 'undefined'\n return node.type === 'Literal' && (node.value === null || node.value === undefined)\n}\n\n/**\n * 指令实参的静态校验(forEach keyFn / model 写回路径)。\n *\n * 与位置无关 —— 主模板与子模板(指令回调内的嵌套模板)共用本函数,\n * 故由 `checkTemplateRules`(主)和 `compile.ts`(子候选)两处分别调用。\n */\nexport function checkDirectiveArgs(\n vars: readonly TemplateVarInfo[],\n ctx?: ConventionsContext,\n): TemplateRuleError[] {\n const errs: TemplateRuleError[] = []\n for (const v of vars) {\n if (!v.isDirectiveCall) continue\n const name = v.directiveName\n if (!name) continue\n const args: any[] = v.node?.arguments ?? []\n const pos = { start: v.start ?? 0, end: v.end ?? 0 }\n\n // ---- E-FOREACH-KEY:运行期无条件 `keyFn.call(...)` ----\n if (name === 'forEach') {\n const raw = args[1]\n const keyFn = raw ? unwrapTsExpr(raw) : null\n // 完整形态是 forEach(list, keyFn, tmpl):实参不足 3 个 ⇒ keyFn 或模板必缺一个,\n // 两者都会让运行期落到「keyFn 不是函数」或「模板为 undefined」,编译期一律拦。\n const missing = args.length < 3\n const literal =\n !!keyFn &&\n (keyFn.type === 'Literal' ||\n keyFn.type === 'TemplateLiteral' ||\n keyFn.type === 'ArrayExpression' ||\n keyFn.type === 'ObjectExpression' ||\n keyFn.type === 'UnaryExpression')\n if (missing || literal || isUndefinedLike(keyFn)) {\n errs.push({\n ...pos,\n message:\n `E-FOREACH-KEY: forEach 的第二个实参必须是 key 函数(keyFn: (item, key, index) => key),` +\n `当前${missing ? `实参只有 ${args.length} 个(需要 list / keyFn / tmpl 三个)` : `为 \\`${v.exprSource.slice(0, 80)}\\` 的字面量`}——` +\n `运行期会直接对它调用 .call(),恒抛 TypeError`,\n })\n }\n continue\n }\n\n // ---- E-MODEL-CHAIN:运行期用 `varChain[last]` 作写回路径,`set(this, path, v)` ----\n if (name === 'model') {\n // 第三参 modelProp 显式给了路径:初始路径不存在时由它兜底,不再要求 this 链\n const override = args[2] ? unwrapTsExpr(args[2]) : null\n if (override) {\n const s = literalStrings(override)[0]\n const viaConst =\n override.type === 'Identifier' && ctx?.stringConsts?.get(override.name)\n if (typeof s === 'string' || typeof viaConst === 'string') continue\n }\n const arg0 = args.length ? unwrapTsExpr(args[0]) : null\n const chain = arg0 ? thisChain(arg0) : null\n const shown = v.exprSource.slice(0, 80)\n if (!arg0 || MODEL_NON_TARGET_TYPES.has(arg0.type)) {\n // 字面量 / 数组 / 对象 / 无实参:无论如何都算不出写回目标\n errs.push({\n ...pos,\n message:\n `E-MODEL-CHAIN: model() 的实参必须是 this.<字段>(或 this.<字段>.<子字段>),` +\n `当前 \\`${shown}\\` 根本不是可写目标——运行期以 directiveVarChain 末段作 set() 目标,` +\n `取不到时静默写不进去`,\n })\n } else if (!chain && arg0 && rootIsThis(arg0)) {\n // this 根链里含下标 / 动态访问:`this.arr[i]` 的链会整体退化成根字段,可能整块覆盖\n errs.push({\n ...pos,\n severity: 'warn',\n message:\n `W-MODEL-CHAIN: model() 的 '${shown}' 含下标 / 动态访问,编译期无法给出字段级写回路径;` +\n `运行期只能退到根字段,子项赋值可能被整体覆盖`,\n })\n } else if (chain?.some((seg) => seg.startsWith('#'))) {\n errs.push({\n ...pos,\n severity: 'warn',\n message:\n `W-MODEL-CHAIN: model() 的 '${shown}' 指向私有字段(#),` +\n `运行期用字符串路径 set() 写回,无法访问私有成员`,\n })\n }\n // 其它形态(循环项 `model(condi.color)`、外部标识符)→ 子视图写回语义未经证实,放行\n continue\n }\n }\n return errs\n}\n\n/** 对单个组件的主模板执行模板层约定检查。返回错误列表(可为空)。 */\nexport function checkTemplateRules(\n tree: TemplateTree,\n tmpl: MainTemplate,\n comp: ComponentAnalysis,\n ctx: ConventionsContext,\n knownTags?: Set<string>,\n): TemplateRuleError[] {\n const errs: TemplateRuleError[] = []\n const pos = { start: tmpl.start, end: tmpl.end }\n\n const elements: TElement[] = []\n collectElements(tree.root, elements)\n\n const members = collectMemberNames(comp, ctx)\n\n // ---- 指令实参校验(forEach keyFn / model 写回路径)----\n // 与插入位置无关(只看表达式本身),故独立成段;子模板由 compile.ts 另调一次。\n errs.push(...checkDirectiveArgs(tmpl.vars, ctx))\n\n // 本文件组件标签 → @emits 声明集(判定「组件事件通道」用,见 W-EVENT-COMP-MODIFIER)\n const localEmits = collectLocalEmits(comp, ctx)\n\n // 位置映射:varIndex → 所在位置(tag=标签属性位 / text=文本插值 / slot=组件标签体内插值)\n // C1(指令位置)与 C2(文本位插 Template)共用,无条件构建。\n const varPosMap = new Map<number, 'tag' | 'text' | 'slot'>()\n for (const el of elements) {\n for (const a of el.attrs) {\n if (a.name.includes('⟬')) {\n // 属性名整体插值 = TAG 指令位\n const m = /⟬Ċ⟭(\\d+)/.exec(a.name)\n if (m) varPosMap.set(+m[1], 'tag')\n }\n }\n }\n const walkText = (nodes: TNode[], inSlot: boolean) => {\n for (const nd of nodes) {\n if (nd.type === 'text') {\n for (const p of nd.parts) {\n if (p.type === 'var' && !varPosMap.has(p.index)) {\n varPosMap.set(p.index, inSlot ? 'slot' : 'text')\n }\n }\n } else if (nd.type === 'element') {\n // HTML 标签名大小写不敏感,`<Slot>` 与 `<slot>` 同义。这里必须比小写形式 ——\n // 只认 'slot' / 'SLOT' 会把 `<Slot>` 判成普通元素,其体内插值落到 'text' 位,\n // 于是 `slot()` 指令在该位置合法、却被误报 E-DIRECTIVE-SCOPE。\n // C3:自定义元素名恒含 `-`(跨包组件如 `<ui-table>` 不在本文件 knownTags 里,\n // 但其体内插值同样是 slot 位)——用 isCustomTag 统一判据,修跨包 `${slot(...)}` 误报。\n const isComp = isCustomTag(nd.tag.toLowerCase(), knownTags ?? EMPTY_TAG_SET)\n walkText(nd.children, isComp)\n }\n }\n }\n walkText(tree.root, false)\n\n // ---- C1: 指令插入位置校验 ----\n const directiveVars = tmpl.vars.filter((v) => v.isDirectiveCall && v.directiveName)\n for (const v of directiveVars) {\n const allowed = DIRECTIVE_SCOPES[v.directiveName!]\n if (!allowed) continue // 未知指令名(自定义指令)→ 放行\n const pos2 = varPosMap.get(v.index)\n if (pos2 && !allowed.includes(pos2)) {\n errs.push({\n ...pos,\n message:\n `E-DIRECTIVE-SCOPE: 指令 '${v.directiveName}' 只能出现在 ${allowed.join('/')} 位置,` +\n `当前在 ${pos2} 位置`,\n })\n }\n }\n\n // ---- C2: 文本/插槽位插值「返回 Template(子视图)的表达式」⇒ 禁止 ----\n // 子视图必须经指令(forEach/if/when)或子组件(自定义元素)实现;直接把返回 Template\n // 的本地函数插值到文本位会被字符串化成 [object Object](见 IntroPage 旧写法)。\n // 仅针对「本文件模块级函数」——跨文件导入无法静态证明返回类型,宁漏勿误报。\n const hAliases = collectTemplateTagAliases(comp)\n const localTemplateFns = new Set<string>()\n for (const [name, fn] of ctx.moduleFunctions ?? []) {\n if (fn.annotatedTemplate || bodyReturnsTemplate(fn.node, hAliases)) localTemplateFns.add(name)\n }\n for (const v of tmpl.vars) {\n if (v.isDirectiveCall) continue\n const p2 = varPosMap.get(v.index)\n if (p2 !== 'text' && p2 !== 'slot') continue\n const expr = unwrapTsExpr(v.node)\n if (expr?.type === 'CallExpression' && expr.callee?.type === 'Identifier') {\n if (localTemplateFns.has(expr.callee.name)) {\n errs.push({\n start: v.start ?? pos.start,\n end: v.end ?? pos.end,\n message:\n `E-TEMPLATE-INTERP: 插值表达式 '${v.exprSource}' 返回 Template(子视图),` +\n `不能直接插值在文本位(会被字符串化为 [object Object])。` +\n `请改用 forEach / if / when 指令,或将结构抽成子组件(自定义元素)。`,\n })\n }\n }\n }\n\n for (const el of elements) {\n for (const a of el.attrs) {\n // 属性名整体插值 = TAG 指令写法,不属于以下任何检查\n if (a.name.includes('⟬')) continue\n\n const varPart = a.parts.find((p) => p.type === 'var')\n const varCount = a.parts.filter((p) => p.type === 'var').length\n\n // ---- 事件修饰符 / 无处理器 ----\n // 运行期把「非内置 token」一律当 KeyboardEvent.key 过滤(events/event.ts:139-143):\n // 非键盘事件上 e.key 恒 undefined ⇒ 监听器永不触发,而修饰符本身照样生效,\n // 表现为「点了没反应但也不报错」,只能靠编译期拦。\n if (a.name.startsWith('@') && !a.name.startsWith('@mutate')) {\n const segs = a.name.slice(1).split('.')\n const evName = (segs[0] ?? '').toLowerCase()\n const mods = segs.slice(1)\n const compEmits = localEmits.get(el.tag.toLowerCase())\n const isCompEvent = !!compEmits && matchEmitName(compEmits, evName)\n if (isCompEvent) {\n // 组件事件走 wrapControlFn:只有 debounce/throttle/once 生效,其余静默丢弃\n const bad = mods.filter((mo) => !COMP_EVENT_MODS.has(mo) && !EVENT_FLOW_MOD_RE.test(mo))\n if (bad.length) {\n errs.push({\n ...pos,\n severity: 'warn',\n message:\n `W-EVENT-COMP-MODIFIER: '${a.name}' 是组件事件(${el.tag} 的 @emits 已声明 '${evName}'),` +\n `运行期只应用 debounce/throttle/once,[${bad.join(', ')}] 会被静默丢弃`,\n })\n }\n } else if (!KEY_EVENTS.has(evName) && NATIVE_EVENTS.has(evName)) {\n const bad = mods.filter((mo) => !EVENT_PLAIN_MODS.has(mo) && !EVENT_FLOW_MOD_RE.test(mo))\n if (bad.length) {\n errs.push({\n ...pos,\n message:\n `E-EVENT-MODIFIER: '${a.name}' 中的 [${bad.join(', ')}] 不是内置修饰符;` +\n `运行期会把它当作 KeyboardEvent.key 过滤,而 '${evName}' 不是键盘事件 ⇒ 处理器恒不触发`,\n })\n }\n }\n // 只有**裸事件名**才是「忘了写处理器」;`@click.stop` / `@dragover.prevent` 这类\n // 无处理器写法是刻意 idiom —— 空监听器仍会执行 stopPropagation / preventDefault。\n if (varCount === 0 && mods.length === 0) {\n errs.push({\n ...pos,\n severity: 'warn',\n message:\n `W-EVENT-NO-HANDLER: '${a.name}' 没有插值处理器,运行期只注册空监听器(noop)——` +\n `是否遗漏了 \\${…}?`,\n })\n }\n }\n\n // ---- E-PROP-INTERP:.prop 的值必须是插值(对齐 render.ts:336 的 EXP_TAG 判定)----\n if (a.name.startsWith('.') && varCount === 0) {\n errs.push({\n ...pos,\n message:\n `E-PROP-INTERP: Prop '${a.name}' 必须是插值(.foo=\"${'$'}{expr}\");` +\n `静态值请直接写属性或改用 bind 指令`,\n })\n continue\n }\n\n // ---- E-MUTATE-MODIFIER:@mutate 必须带类型修饰符(对齐 extends.ts addMutation)----\n // 必须放在 E-EVENT-FN 之前:事件属性带单插值时那条规则的 continue 会截断本检查\n if (a.name.startsWith('@mutate')) {\n const mods = a.name.slice(1).split('.').slice(1)\n if (!mods.some((mo) => MUTATE_TYPE_MODS.has(mo))) {\n errs.push({\n ...pos,\n message:\n `E-MUTATE-MODIFIER: 事件 '${a.name}' 缺少变异类型修饰符,` +\n `必须使用 @mutate.attr/child/char/tree 之一(裸 @mutate 运行期无法 observe)`,\n })\n }\n }\n\n // ---- E-EVENT-FN:事件处理器必须是函数 ----\n if (a.name.startsWith('@') && varCount === 1 && varPart) {\n const exprSource = tmpl.vars[varPart.index]?.exprSource ?? ''\n if (INLINE_FN_RE.test(exprSource)) continue\n const m = THIS_MEMBER_RE.exec(exprSource)\n if (m) {\n const name = m[1]\n // 成员不可穷尽(外部基类)→ 放行;命中已知成员 / 框架内置 → 放行\n if (members === null || members.has(name) || KNOWN_BASE_MEMBERS.has(name)) continue\n errs.push({\n ...pos,\n message: `E-EVENT-FN: 事件 '${a.name}' 的处理器 '${exprSource}' 不是组件 ${comp.className} 的成员`,\n })\n }\n // 其他形态(外部标识符、动态访问、条件表达式)→ 无法判定,放行\n continue\n }\n\n // ---- E-REF-TYPE:ref 必须绑定 createRef() 结果 ----\n if (a.name === 'ref' && varCount === 1 && varPart) {\n const exprSource = tmpl.vars[varPart.index]?.exprSource ?? ''\n const m = THIS_MEMBER_RE.exec(exprSource)\n if (m && members !== null) {\n const name = m[1]\n if (!members.has(name)) {\n errs.push({\n ...pos,\n message: `E-REF-TYPE: ref 绑定的 '${exprSource}' 不是组件 ${comp.className} 的成员`,\n })\n } else {\n const member = findMemberNode(comp, ctx, name)\n // 仅对「有初始化器的字段」可静态证明;方法/getter/无初始化器 → 放行\n if (member?.type === 'PropertyDefinition' && member.value != null) {\n if (!isCreateRefCall(member.value, comp)) {\n errs.push({\n ...pos,\n message:\n `E-REF-TYPE: ref 绑定的 '${exprSource}' 初始化器不是 createRef() 调用,` +\n `运行时将报「Ref must be a RefObject」`,\n })\n }\n }\n }\n }\n // members===null(外部基类)或非 this.* 形态 → 放行\n }\n }\n }\n\n return errs\n}\n","/**\n * 子模板提取:结构指令回调内的 h`` → 独立 buildTemplate + 内联 fx codegen。\n *\n * 产出 `__ce_static__.subViews[subId] = { buildTemplate, pointEffects, fx }`,并在回调函数上\n * 标注 `__subId`(Object.assign 包装,不改指令公开签名)。运行时结构指令消费静态 subs。\n *\n * 准入约束:\n * - 每个模板回调内恰好 1 个 h``(块体须为顶层 return 的直接参数);\n * - 回调形参 / prelude / 插值中的自由标识符必须可在静态作用域解析;\n * - 模板位必须是 render() 内**字面量书写的**箭头函数/函数表达式(when 的 cases\n * 必须是对象/数组字面量且分支值均为字面量函数)。变量引用、展开、条件表达式\n * 都无法枚举出分支,拿不到 __subId;\n * - 任一回调提取失败 → SubExtractError → 整组件报错阻断构建。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { blockedTsText, collectPatternNames, containsBlockedTsNode, parseUncached, topLevelReturns, unwrapExpr } from '../utils/ast'\nimport { COMpelem_DIRECTIVES, TEMPLATE_ARG_INDEX } from './render-body'\nimport { stripTs, stripTsChecked } from './strip-ts'\nimport { collectTemplateTagAliases } from './template'\nimport {\n TAG_ONLY_DIRECTIVES,\n TemplateExtractError,\n extractThisChainPaths,\n staticHtmlFragmentOf,\n type TemplateVarInfo,\n} from './template-extract'\nimport type { TemplateTree } from './template-tree'\n\nexport class SubExtractError extends Error { }\n\n/** 指令实参分区:与 render-body 的 TEMPLATE_ARG_INDEX 同语义。 */\nexport function partitionDirectiveArgs(directive: string, args: any[]): boolean[] {\n const tmplIdx = TEMPLATE_ARG_INDEX[directive]\n return args.map((_, i) => {\n if (tmplIdx === 'rest-after-0') return i >= 1\n if (Array.isArray(tmplIdx)) return tmplIdx.includes(i)\n return false\n })\n}\n\nconst FN_TYPES = new Set(['ArrowFunctionExpression', 'FunctionExpression'])\n\nfunction isFnNode(n: any): boolean {\n return !!n && FN_TYPES.has(n.type)\n}\n\n/** 一个被提取的模板回调子模板。start/end 为回调函数节点的绝对偏移 */\nexport interface SubCandidate {\n /** 按绝对 start 升序分配的稳定编号(0..n-1),写入 __subId */\n subId: number\n start: number\n end: number\n /** 形参源码片段(已去类型标注) */\n params: string[]\n /** prelude 为回调体顶层、return 之前的语句切片;表达式体为 '' */\n preludeStart: number\n preludeEnd: number\n preludeSrc: string\n /** 唯一 h`` 的 quasis cooked 串 */\n strings: string[]\n /** h`` 插值的绝对偏移与源码 */\n vars: TemplateVarInfo[]\n /** 解析后的模板树(compile.ts 预解析,供折叠/编号复用,避免重复 parse)。 */\n tree?: TemplateTree\n}\n\n// ---------- TS 剥离(prelude / 回调体常见 `x!` 后缀非空断言) ----------\n// 实现已移到零依赖模块 ./strip-ts:`template-extract` 也要用它(分析期须\n// stripTs → hasTsSyntax 复检,与 codegen 同序),而本文件已 import 了 template-extract,\n// 反向 import 会形成模块环。这里保留同名再导出,现有调用方无需改动。\nexport { stripTs, stripTsChecked }\n\n/**\n * 在绝对区间 [absStart, absEnd) 内为候选回调插入 Object.assign(..., {__subId: N}) 包装。\n *\n * 回调体(`h\\`...\\`` 模板源码)是**死代码**:运行时对第三参只读 `__subId` / `__fx` / `__bv`\n * (`resolveSubTemplateMeta` / `buildSubTemplate` / `getSubFx`),子视图 DOM 一律来自\n * `__ce_static__.subViews[N].buildTemplate`。故包装体改发 `function(){}`。\n *\n * `carriers` 提供时更进一步:**自洽子模板**(自身 fx 已落在 `subs[N].fx`,回调不携带\n * extras)的 carrier 是编译期常量,直接引用即可 —— 该包装原本写在 fx 工厂体内,\n * 每次更新都会重跑一遍 `Object.assign` + 新建闭包;提到模块级后更新路径零分配。\n * 携带 extras(`__fx` / `__bv`,必须逐次求值以捕获祖先形参)的候选仍走每次新建。\n *\n * @param extras subId → 追加属性源码片段(如 `, __fx: function(__comp){...}`,C1 闭包提升)\n */\nexport function applySubIdWraps(\n absStart: number,\n absEnd: number,\n source: string,\n candidates: readonly SubCandidate[],\n extras?: ReadonlyMap<number, string>,\n carriers?: ReadonlyMap<number, string>,\n): string {\n const inside = candidates.filter(\n (c) =>\n typeof c.start === 'number' &&\n typeof c.end === 'number' &&\n c.start >= absStart &&\n c.end <= absEnd &&\n c.end > c.start,\n )\n if (!inside.length) return source.slice(absStart, absEnd)\n\n // start ASC, end DESC:父在前,同区间不交叠(函数区间只嵌套)\n const sorted = [...inside].sort((a, b) => a.start - b.start || b.end - a.end)\n\n const render = (lo: number, hi: number, list: SubCandidate[]): string => {\n let out = ''\n let pos = lo\n for (const c of list) {\n if (c.start < pos) continue\n if (c.start > pos) out += source.slice(pos, c.start)\n const children = list.filter((x) => x !== c && x.start >= c.start && x.end <= c.end)\n const extra = extras?.get(c.subId) ?? ''\n const carRef = carriers?.get(c.subId)\n if (carRef && !extra) {\n // 自洽子模板:模块级常量 carrier,一次创建、全局共享\n out += carRef\n } else if (carRef) {\n // 需要逐次求值的 extras(__fx/__bv):新建载体但不带死体\n out += `Object.assign(function(){}, {__subId: ${c.subId}${extra}})`\n } else if (extra) {\n out += `Object.assign(function(){}, {__subId: ${c.subId}${extra}})`\n } else {\n // 无 carriers(未启用提升):保留原回调源码形态\n out += `Object.assign(${render(c.start, c.end, children)}, {__subId: ${c.subId}})`\n }\n pos = c.end\n }\n if (pos < hi) out += source.slice(pos, hi)\n return out\n }\n return render(absStart, absEnd, sorted)\n}\n\n/**\n * 从 params 源码片段提取全部**真实绑定名**(`item = 1` → `item`;`...rest` → `rest`;\n * `({row: r})` → 只有 `r`——`row` 是属性键不是绑定)。\n */\nexport function paramBaseNames(params: readonly string[]): Set<string> {\n const out = new Set<string>()\n for (const p of params) {\n const s = p.trim()\n let parsed = false\n try {\n const pf = parseUncached(`function __ce_pf(${s}) {}`)\n const fn = pf.program.body?.[0]\n if (fn?.type === 'FunctionDeclaration') {\n for (const pat of fn.params ?? []) collectPatternNames(pat, out)\n parsed = true\n }\n } catch {\n parsed = false\n }\n if (parsed) continue\n let t = s.startsWith('...') ? s.slice(3) : s\n const eq = t.indexOf('=')\n if (eq >= 0) t = t.slice(0, eq)\n const idents = t.match(/[A-Za-z_$][\\w$]*/g)\n if (idents) for (const id of idents) out.add(id)\n }\n return out\n}\n\n/** cand 的嵌套祖先(由外到内:start 升序、end 降序,严格包含)。 */\nexport function enclosingCandidates(\n cand: SubCandidate,\n all: readonly SubCandidate[],\n): SubCandidate[] {\n const parents = all.filter(\n (o) =>\n o !== cand &&\n typeof o.start === 'number' &&\n typeof o.end === 'number' &&\n o.start <= cand.start &&\n cand.end <= o.end &&\n (o.start < cand.start || cand.end < o.end),\n )\n parents.sort((a, b) => a.start - b.start || b.end - a.end)\n return parents\n}\n\n// ---------- 形参源码 ----------\n\n/**\n * 形参默认值源码:与其它形参分支同一道 stripTs → hasTsSyntax 复核,外加旧式\n * 尖括号断言 / 显式实例化的 AST 门(C-G6)。\n * 直接切片会让 `= 3 as number` / `= x!` / `= <Foo>x` / `= f<T>(x)` 这类 TS 专有形态原样\n * 进入产物(codegen 产物必须是纯 JS),默认值正是唯一被漏掉的入口。\n */\nfunction paramInitSource(init: any): string {\n const s = sliceNode(init)\n if (containsBlockedTsNode(init)) throw new SubExtractError(blockedTsText('回调形参默认值', s))\n const { stripped, tsHit } = stripTsChecked(s)\n if (tsHit) throw new SubExtractError(`回调形参默认值含 TS 语法:${s}`)\n return stripped\n}\n\nfunction paramsSource(fn: any): string[] {\n const out: string[] = []\n for (const p of fn.params ?? []) {\n const t = p.type\n if (t === 'Identifier') {\n out.push(p.name)\n } else if (t === 'AssignmentPattern') {\n const left = paramsPattern(p.left)\n out.push(p.init ? `${left} = ${paramInitSource(p.init)}` : left)\n } else if (t === 'RestElement') {\n out.push('...' + paramsPattern(p.argument))\n } else {\n const s = sliceNode(p)\n if (containsBlockedTsNode(p)) throw new SubExtractError(blockedTsText('回调形参', s))\n const { stripped, tsHit } = stripTsChecked(s)\n if (tsHit) throw new SubExtractError(`回调形参含 TS 语法:${s}`)\n out.push(stripped)\n }\n }\n return out\n}\n\nfunction paramsPattern(pat: any): string {\n if (!pat) return ''\n switch (pat.type) {\n case 'Identifier':\n return pat.name\n case 'ObjectPattern':\n case 'ArrayPattern': {\n const s = sliceNode(pat)\n if (containsBlockedTsNode(pat)) throw new SubExtractError(blockedTsText('回调解构形参', s))\n const { stripped, tsHit } = stripTsChecked(s)\n if (tsHit) throw new SubExtractError(`回调解构形参含 TS 语法:${s}`)\n return stripped\n }\n case 'AssignmentPattern': {\n const left = paramsPattern(pat.left)\n return pat.init ? `${left} = ${paramInitSource(pat.init)}` : left\n }\n case 'RestElement':\n return '...' + paramsPattern(pat.argument)\n default:\n throw new SubExtractError(`不支持的形参模式:${pat.type}`)\n }\n}\n\n// SOURCE 注入:切片依赖完整源码;collect 时通过 withSource 设置\nlet __source: string = ''\nfunction sliceNode(n: any): string {\n if (typeof n?.start !== 'number' || typeof n?.end !== 'number') {\n throw new SubExtractError('AST 节点缺少偏移,无法切片')\n }\n return __source.slice(n.start, n.end)\n}\n\n// ---------- 收集候选 ----------\n\ninterface CollectCtx {\n comp: ComponentAnalysis\n hAliases: Set<string>\n candidates: any[] // 未赋 subId 的裸 fn 节点\n seen: WeakSet<object>\n}\n\nfunction isDirectiveCall(node: any, comp: ComponentAnalysis): string | null {\n if (node.type !== 'CallExpression' || node.callee?.type !== 'Identifier') return null\n const imported = comp.compelemImports.get(node.callee.name)\n if (imported && COMpelem_DIRECTIVES.has(imported)) return imported\n // 外部指令(options.knownDirectives,如 outlet):同指令点语义\n if (comp.knownDirectives?.has(node.callee.name)) return node.callee.name\n return null\n}\n\nfunction collectFromArgs(ctx: CollectCtx, directive: string, args: any[]): void {\n const flags = partitionDirectiveArgs(directive, args)\n args.forEach((arg, i) => {\n if (!arg || typeof arg.type !== 'string') return\n const isTemplate = flags[i]\n if (isTemplate && isFnNode(arg)) {\n if (!ctx.candidates.includes(arg)) ctx.candidates.push(arg)\n walkCollect(ctx, arg)\n return\n }\n if (isTemplate && directive === 'when') {\n collectWhenCases(ctx, arg)\n return\n }\n // 模板位但不是字面量箭头(Identifier 引用 / 调用结果 / 条件表达式等):\n // 无法静态定位回调,也就无法分配 __subId。**构建期阻断** —— 旧实现静默放过,\n // 产物里该回调没有 __subId,运行时 resolveSubTemplateMeta 返回 undefined,\n // 分支悄悄渲染成空白。此处不报,等到运行期只会看到无源的空白区域。\n if (isTemplate) {\n throw new SubExtractError(\n `@${directive} 的第 ${i + 1} 个模板实参不是字面量函数(实参类型 ${arg.type})。` +\n `结构指令的模板回调必须是 render() 内直接书写的箭头函数/函数表达式:` +\n `变量引用、调用结果、条件表达式等都无法静态提取子模板。`,\n )\n }\n // 非模板实参:继续下钻找嵌套指令;但**函数体不下钻**(keyFn / show 回调等\n // 不是子模板位,其中的指令形态调用属运行期行为,收集会把用户回调错当\n // 子模板包装成死代码)\n if (isFnNode(arg)) return\n walkCollect(ctx, arg)\n })\n}\n\nfunction collectWhenCases(ctx: CollectCtx, cases: any): void {\n if (!cases || typeof cases.type !== 'string') return\n if (cases.type === 'ObjectExpression') {\n for (const prop of cases.properties ?? []) {\n if (prop.type === 'SpreadElement') {\n throw new SubExtractError(\n `when 的 cases 含展开运算符(…${prop.argument?.type ?? '未知'})。` +\n `展开进来的分支编译器看不到,无法分配 __subId;请把各分支改为显式键值对。`,\n )\n }\n const val = prop.value\n if (!isFnNode(val)) {\n throw new SubExtractError(\n `when 的 cases 键「${prop.key?.name ?? prop.key?.value ?? '?'}」的值不是字面量函数(${val?.type ?? '未知'})。` +\n `每个分支必须是 render() 内直接书写的箭头函数/函数表达式。`,\n )\n }\n if (!ctx.candidates.includes(val)) ctx.candidates.push(val)\n walkCollect(ctx, val)\n }\n return\n }\n if (cases.type === 'ArrayExpression') {\n for (const el of cases.elements ?? []) {\n if (!el) continue\n if (isFnNode(el)) {\n if (!ctx.candidates.includes(el)) ctx.candidates.push(el)\n walkCollect(ctx, el)\n continue\n }\n if (el.type === 'ArrayExpression') {\n // [condFn, tmplFn]\n const els = el.elements ?? []\n // 条件位不是子模板位:函数体不下钻(同 collectFromArgs 非模板实参)\n if (els[0] && !isFnNode(els[0])) walkCollect(ctx, els[0])\n const tmpl = els[1]\n if (!tmpl) continue\n if (!isFnNode(tmpl)) {\n throw new SubExtractError(\n `when 的 [条件, 模板] 数对里模板位不是字面量函数(${tmpl.type})。` +\n `模板回调必须是 render() 内直接书写的箭头函数/函数表达式。`,\n )\n }\n if (!ctx.candidates.includes(tmpl)) ctx.candidates.push(tmpl)\n walkCollect(ctx, tmpl)\n continue\n }\n throw new SubExtractError(\n `when 的 cases 数组元素既不是函数也不是 [条件, 模板] 数对(${el.type})。`,\n )\n }\n return\n }\n // 非字面量(Identifier / 条件表达式 / 调用结果等)→ 无法枚举分支,构建期阻断\n throw new SubExtractError(\n `when 的 cases 不是字面量(${cases.type})。` +\n `编译器必须看到完整的分支列表才能逐个分配 __subId;` +\n `变量引用、条件表达式、调用结果都无法静态提取,请改为内联对象/数组字面量。`,\n )\n}\n\nfunction walkCollect(ctx: CollectCtx, node: any): void {\n if (!node || typeof node.type !== 'string') return\n if (ctx.seen.has(node)) return\n ctx.seen.add(node)\n\n const directive = isDirectiveCall(node, ctx.comp)\n if (directive) {\n collectFromArgs(ctx, directive, node.arguments ?? [])\n return\n }\n\n // 普通嵌套继续下钻,但**函数体不下钻**:事件 handler、非模板位回调不是子模板\n // 位,其中的指令形态调用不应被收集(旧行为会把 handler 内的指令当子模板分配\n // __subId 并把回调体包装成死代码;不可达位置的非字面量 when cases 还会抛\n // SubExtractError 阻断整个组件)。模板位的函数体由 collectFromArgs /\n // collectWhenCases 对 fn 节点**显式**调用 walkCollect 进入(直接入参不受\n // 此处的子节点跳过影响),子模板分配语义不变。\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const c = node[key]\n if (Array.isArray(c)) {\n for (const x of c) if (!isFnNode(x)) walkCollect(ctx, x)\n } else if (c && typeof c === 'object' && typeof c.type === 'string' && !isFnNode(c)) {\n walkCollect(ctx, c)\n }\n }\n}\n\n// ---------- 回调解析:唯一 h`` + prelude + vars ----------\n\nfunction findTemplateHits(ctx: CollectCtx, fn: any): any[] {\n const hits: any[] = []\n const walk = (node: any): void => {\n if (!node || typeof node.type !== 'string') return\n if (\n node.type === 'TaggedTemplateExpression' &&\n node.tag?.type === 'Identifier' &&\n ctx.hAliases.has(node.tag.name)\n ) {\n hits.push(node)\n return\n }\n // 不把嵌套 h`` 的内部表达式算作额外命中(D7 已禁插值处嵌套模板)\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const c = node[key]\n if (Array.isArray(c)) for (const x of c) walk(x)\n else if (c && typeof c === 'object' && typeof c.type === 'string') walk(c)\n }\n }\n walk(fn.body)\n return hits\n}\n\nfunction buildCandidate(ctx: CollectCtx, fn: any): SubCandidate {\n const body = fn.body\n const isBlock = body?.type === 'BlockStatement'\n let hit: any\n let preludeStart = fn.start\n let preludeEnd = fn.start\n let preludeSrc = ''\n\n if (!isBlock) {\n const hits = findTemplateHits(ctx, fn)\n const bare = unwrapExpr(body)\n if (hits.length !== 1 || bare !== hits[0]) {\n throw new SubExtractError(\n `回调 @${fn.start} 需要唯一 h\\`\\` 模板(命中 ${hits.length} 个,表达式体须直接返回模板)`,\n )\n }\n hit = hits[0]\n } else {\n const rets = topLevelReturns(body.body)\n const retHits: any[] = []\n for (const r of rets) {\n const arg = unwrapExpr(r.argument)\n if (\n arg?.type === 'TaggedTemplateExpression' &&\n arg.tag?.type === 'Identifier' &&\n ctx.hAliases.has(arg.tag.name)\n ) {\n retHits.push(arg)\n }\n }\n const allHits = findTemplateHits(ctx, fn)\n if (allHits.length === 0) {\n throw new SubExtractError(`回调 @${fn.start} 内未找到 h\\`\\` 模板`)\n }\n if (allHits.length > 1) {\n throw new SubExtractError(`回调 @${fn.start} 内发现 ${allHits.length} 个 h\\`\\` 模板,codegen 要求唯一`)\n }\n if (retHits.length !== 1 || retHits[0] !== allHits[0]) {\n throw new SubExtractError(`回调 @${fn.start} 的 h\\`\\` 必须是函数体顶层 return 的直接参数`)\n }\n hit = retHits[0]\n // prelude = return 之前的全部顶层语句\n const retNode = rets.find((r) => unwrapExpr(r.argument) === hit)\n const stmts = body.body\n const retIdx = stmts.indexOf(retNode)\n if (retIdx > 0) {\n preludeStart = stmts[0].start\n preludeEnd = stmts[retIdx - 1].end\n preludeSrc = __source.slice(preludeStart, preludeEnd)\n for (let si = 0; si < retIdx; si++) {\n if (containsBlockedTsNode(stmts[si])) {\n throw new SubExtractError(\n blockedTsText(`子模板 @${fn.start} 的 prelude`, __source.slice(stmts[si].start, stmts[si].end)),\n )\n }\n }\n }\n }\n\n const quasi: any = hit.quasi\n // 与主模板同判据:cooked == null = 非法转义(如 `C:\\users`),静默取 '' 会丢字\n const strings: string[] = (quasi.quasis ?? []).map((q: any, qi: number) => {\n if (q.value?.cooked == null) {\n const raw = typeof q.start === 'number' && typeof q.end === 'number' ? __source.slice(q.start, q.end) : ''\n throw new SubExtractError(\n `子模板 @${fn.start} 的第 ${qi} 段静态文本含非法转义序列(偏移 ${q.start ?? '?'}):` +\n `\\`${raw}\\`;模板串里 \\\\u、\\\\x 后必须是合法转义(路径等请写 \\\\\\\\),否则该段文本无法取值`,\n )\n }\n return String(q.value.cooked)\n })\n const exprs: any[] = quasi.expressions ?? []\n const vars: TemplateVarInfo[] = exprs.map((e: any, index: number) => {\n const exprSource = __source.slice(e.start, e.end).trim()\n // `${html(CONST)}` 静态 HTML 常量:与主模板同一套判据(staticHtmlFragmentOf)。\n // 子模板的取值同样走 generateSubBuildVars,跳过规则一致 ⇒ 参数/取值下标对齐。\n const fragment = staticHtmlFragmentOf(e, ctx.comp)\n let isDirectiveCallFlag = false\n let directiveName: string | undefined\n let moduleBindingName: string | undefined\n // TAG 位指令(bind/show/model/classes/styles/html)需要 this 链供运行期回退:\n // 如 `model(this.foo,'select')` → directiveVarChain ['foo'],`model` 指令靠它算出\n // 回写路径(缺少时 path=undefined ⇒ 值写到 ctx['undefined'],双向绑定上行静默失效)。\n // 子模板必须与主模板(template-extract 同名逻辑)保持一致。\n let directiveVarChain: string[] | undefined\n if (e.type === 'CallExpression' && e.callee?.type === 'Identifier') {\n const imported = ctx.comp.compelemImports.get(e.callee.name)\n if (imported && COMpelem_DIRECTIVES.has(imported)) {\n isDirectiveCallFlag = true\n directiveName = imported\n if (TAG_ONLY_DIRECTIVES.has(imported)) {\n directiveVarChain = extractThisChainPaths(e.arguments ?? [])\n }\n } else if (ctx.comp.knownDirectives?.has(e.callee.name)) {\n // 外部指令(options.knownDirectives,如 outlet):同指令点语义\n isDirectiveCallFlag = true\n directiveName = e.callee.name\n } else if (ctx.comp.moduleBindings?.has(e.callee.name)) {\n // 同 template-extract:模块绑定只记名,指令判定交由标签位 codegen 放行\n moduleBindingName = e.callee.name\n }\n }\n return {\n index,\n exprSource,\n isDirectiveCall: isDirectiveCallFlag,\n directiveName,\n directiveVarChain,\n moduleBindingName,\n fragment,\n start: e.start,\n end: e.end,\n node: e,\n }\n })\n\n return {\n subId: -1,\n start: fn.start,\n end: fn.end,\n params: paramsSource(fn),\n preludeStart,\n preludeEnd,\n preludeSrc,\n strings,\n vars,\n }\n}\n\n/**\n * 收集组件 render() 内全部结构指令模板回调,按绝对 start 排序分配 subId。\n * 无主模板 / 无回调时返回 []。\n */\nexport function collectSubCandidates(comp: ComponentAnalysis, source: string): SubCandidate[] {\n if (!comp.renderBody) return []\n const hAliases = collectTemplateTagAliases(comp)\n if (!hAliases.size) return []\n\n const prevSource = __source\n __source = source\n try {\n const ctx: CollectCtx = {\n comp,\n hAliases,\n candidates: [],\n seen: new WeakSet<object>(),\n }\n const body = Array.isArray(comp.renderBody) ? comp.renderBody : [comp.renderBody]\n for (const stmt of body) walkCollect(ctx, stmt)\n if (!ctx.candidates.length) return []\n\n // 绝对 start 升序 → 稳定 subId\n const nodes = [...ctx.candidates].sort(\n (a, b) => (a.start ?? 0) - (b.start ?? 0) || (b.end ?? 0) - (a.end ?? 0),\n )\n return nodes.map((fn, i) => {\n const cand = buildCandidate(ctx, fn)\n cand.subId = i\n return cand\n })\n } catch (e) {\n if (e instanceof SubExtractError || e instanceof TemplateExtractError) throw e\n throw new SubExtractError(e instanceof Error ? e.message : String(e))\n } finally {\n __source = prevSource\n }\n}\n","/**\r\n * 模板源码级解析:h`` 模板字面量(strings + 插值)→ 节点树 IR(TNode)。\r\n *\r\n * 与运行时正则管线(parseTemplate/convertHTML/createTemplate)的**根本区别**:\r\n * 本模块解析的是**开发者源码**(见 docs/TEMPLATE-CODEGEN.md §3)——\r\n * 不做 innerHTML 解析、convertHTML、自动闭合与实体解码。\r\n * 相关容错行为在本层均为**编译错误**(静态编译唯一路径)。\r\n *\r\n * 占位符 token 与 compelem `src/constants.ts` 的 PLACEHOLDER 一致:\r\n * 解析时以 `⟬Ċ⟭N`(N = Template 序,即源码插值顺序)拼接 quasis,\r\n * 与运行时 parseTemplate 的编号空间相同 —— 保证 attrTmpl 生成物逐字节可比。\r\n */\r\n\r\n/** 与 compelem constants.ts PLACEHOLDER 完全一致(⟬ + Ċ + ⟭)。 */\r\nexport const PLACEHOLDER = '⟬Ċ⟭'\r\n\r\n/** 整段恰为单个占位符(纯插值判定);group1 = 插值序。消费方:template-dom NAME_TOKEN_RE、render-effect 纯 attr 判定。 */\r\nexport const PLACEHOLDER_ONLY_RE = new RegExp(`^${PLACEHOLDER}(\\\\d+)$`)\r\n/** 首个占位符(含前后文的本段混合模板);group1 = 插值序。 */\r\nexport const PLACEHOLDER_FIRST_RE = new RegExp(`${PLACEHOLDER}(\\\\d+)`)\r\nconst TOKEN_RE = new RegExp(`${PLACEHOLDER}(\\\\d+)`, 'g')\r\n\r\n/** HTML void 元素(不需要闭合标签)。 */\r\nexport const VOID_TAGS = new Set([\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr',\r\n])\r\n\r\nexport const SVG_NS = 'http://www.w3.org/2000/svg'\r\n\r\n// ---------- IR 数据结构 ----------\r\n\r\nexport interface TStaticPart { type: 'static'; text: string }\r\nexport interface TVarPart { type: 'var'; index: number }\r\nexport type TPart = TStaticPart | TVarPart\r\n\r\nexport interface TAttr {\r\n /** 源码属性名(保留前缀字符 . ? @ * 与大小写) */\r\n name: string\r\n /** 原始值(未解码);null = 无值属性(如布尔写法) */\r\n value: string | null\r\n /** 值按插值拆分 */\r\n parts: TPart[]\r\n}\r\n\r\nexport interface TElement {\r\n type: 'element'\r\n tag: string\r\n attrs: TAttr[]\r\n children: TNode[]\r\n ns: 'html' | 'svg'\r\n}\r\n\r\nexport interface TText {\r\n type: 'text'\r\n raw: string\r\n parts: TPart[]\r\n}\r\n\r\nexport interface TComment {\r\n type: 'comment'\r\n text: string\r\n}\r\n\r\nexport type TNode = TElement | TText | TComment\r\n\r\n/** 带源码位置的错误(偏移基于拼接后的 html 串)。 */\r\nexport class TemplateParseError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly pos: number,\r\n ) {\r\n super(message)\r\n }\r\n}\r\n\r\n// ---------- 拼接与拆分 ----------\r\n\r\n/** quasis + 插值 → 源码级 html 串(插值以 ⟬Ċ⟭N 占位)。 */\r\nexport function buildTemplateHTML(strings: readonly string[]): string {\r\n let html = ''\r\n for (let i = 0; i < strings.length; i++) {\r\n html += strings[i]\r\n if (i < strings.length - 1) html += PLACEHOLDER + i\r\n }\r\n return html\r\n}\r\n\r\n/** 把含占位符的字符串拆成 static/var 片段(每次调用重置 lastIndex,避免 /g 状态泄漏)。 */\r\nexport function splitParts(s: string): TPart[] {\r\n const parts: TPart[] = []\r\n let last = 0\r\n TOKEN_RE.lastIndex = 0\r\n let m: RegExpExecArray | null\r\n while ((m = TOKEN_RE.exec(s))) {\r\n if (m.index > last) parts.push({ type: 'static', text: s.slice(last, m.index) })\r\n parts.push({ type: 'var', index: parseInt(m[1]) })\r\n last = m.index + m[0].length\r\n }\r\n if (last < s.length) parts.push({ type: 'static', text: s.slice(last) })\r\n return parts\r\n}\r\n\r\n// ---------- 解析器 ----------\r\n\r\nexport interface TemplateTree {\r\n /** 根级节点 */\r\n root: TNode[]\r\n}\r\n\r\n/**\r\n * 空白即内容的标签(rawtext 系 + `pre`):这些标签下的空白/换行是**真内容**,\r\n * 既不能被\"纯排版空白\"裁剪,也不能在 codegen 里 trim。\r\n */\r\nexport const WS_SENSITIVE_TAGS: ReadonlySet<string> = new Set([\r\n 'script',\r\n 'style',\r\n 'textarea',\r\n 'title',\r\n 'xmp',\r\n 'listing',\r\n 'pre',\r\n])\r\n\r\n/**\r\n * 解析源码级模板串为节点树。\r\n *\r\n * 抛出 `TemplateParseError` 表示源码写法不受 codegen 支持(静态编译下不允许回退)。\r\n */\r\nexport function parseTemplateTree(\r\n html: string,\r\n varCount: number,\r\n): TemplateTree {\r\n const root: TNode[] = []\r\n const stack: OpenTag[] = []\r\n let inSvg = false\r\n let i = 0\r\n const n = html.length\r\n\r\n const err = (msg: string): never => {\r\n throw new TemplateParseError(msg, i)\r\n }\r\n\r\n while (i < n) {\r\n const parent = stack.length ? stack[stack.length - 1].node.children : root\r\n\r\n if (html.startsWith('<!--', i)) {\r\n const end = html.indexOf('-->', i + 4)\r\n if (end < 0) err('注释未闭合')\r\n const text = html.slice(i + 4, end)\r\n TOKEN_RE.lastIndex = 0 // /g 正则:.test() 会从上次残留的 lastIndex 续扫 ⇒ 漏报\r\n if (TOKEN_RE.test(text)) err('注释内不允许出现模板插值(会被静默丢弃)')\r\n parent.push({ type: 'comment', text })\r\n i = end + 3\r\n continue\r\n }\r\n\r\n if (html[i] === '<') {\r\n // 结束标签\r\n if (html[i + 1] === '/') {\r\n const m = /^<\\/\\s*([^\\s>]+)\\s*>/.exec(html.slice(i))\r\n if (!m) err('非法的结束标签')\r\n const lower = m![1].toLowerCase()\r\n let found = -1\r\n for (let k = stack.length - 1; k >= 0; k--) {\r\n if (stack[k].lower === lower) { found = k; break }\r\n }\r\n if (found < 0) err(`</${m![1]}> 没有对应的开始标签`)\r\n if (found !== stack.length - 1) {\r\n err(`<${stack[stack.length - 1].name}> 未闭合(不支持 HTML 自动闭合,请显式书写结束标签)`)\r\n }\r\n const popped = stack.pop()!\r\n if (popped.lower === 'svg') inSvg = false\r\n i += m![0].length\r\n continue\r\n }\r\n\r\n // 开始标签\r\n if (!/[a-zA-Z]/.test(html[i + 1] || '')) err(`'<' 后未跟标签名(如需文本请转义)`)\r\n const rest = html.slice(i)\r\n const nameMatch = /^<([^\\s/>]+?)(?=[\\s/>])/.exec(rest)\r\n if (!nameMatch) err('非法的标签名')\r\n const tag = nameMatch![1]\r\n const lower = tag.toLowerCase()\r\n // <svg> 自身也是 SVG 命名空间(对齐 innerHTML 语义)\r\n const el: TElement = {\r\n type: 'element',\r\n tag,\r\n attrs: [],\r\n children: [],\r\n ns: inSvg || lower === 'svg' ? 'svg' : 'html',\r\n }\r\n parent.push(el)\r\n\r\n // 属性区\r\n let j = i + 1 + tag.length\r\n let selfClosing = false\r\n while (j < n) {\r\n while (j < n && /\\s/.test(html[j])) j++\r\n if (j >= n) err(`标签 <${tag}> 未闭合`)\r\n if (html[j] === '>') { j++; break }\r\n if (html[j] === '/' && html[j + 1] === '>') { selfClosing = true; j += 2; break }\r\n let nameStart = j\r\n while (j < n && !/[\\s=/>]/.test(html[j])) j++\r\n if (j === nameStart) err(`标签 <${tag}> 的属性区非法(位置 ${j})`)\r\n const attrName = html.slice(nameStart, j)\r\n let attrValue: string | null = null\r\n let k = j\r\n while (k < n && /\\s/.test(html[k])) k++\r\n if (html[k] === '=') {\r\n k++\r\n while (k < n && /\\s/.test(html[k])) k++\r\n const q = html[k]\r\n if (q === '\"' || q === '\\'') {\r\n const endQ = html.indexOf(q, k + 1)\r\n if (endQ < 0) err(`属性 ${attrName} 的引号未闭合`)\r\n attrValue = html.slice(k + 1, endQ)\r\n j = endQ + 1\r\n } else {\r\n const vStart = k\r\n while (k < n && !/[\\s>]/.test(html[k])) k++\r\n attrValue = html.slice(vStart, k)\r\n j = k\r\n }\r\n }\r\n el.attrs.push({ name: attrName, value: attrValue, parts: attrValue == null ? [] : splitParts(attrValue) })\r\n }\r\n i = j\r\n\r\n // 属性区约束(静态编译硬约束)\r\n for (const a of el.attrs) {\r\n const nameParts = splitParts(a.name)\r\n const nameVars = nameParts.filter((p): p is TVarPart => p.type === 'var')\r\n if (nameVars.length > 1 || (nameVars.length === 1 && a.name !== PLACEHOLDER + nameVars[0].index)) {\r\n err(`属性名 ${a.name} 只允许整体为一个插值(标签位指令写法),不允许部分插值`)\r\n }\r\n const valVars = a.parts.filter((p): p is TVarPart => p.type === 'var').length\r\n if (valVars > 1) err(`属性 ${a.name} 的值最多允许一个插值(对齐 EXP_ATTR_CHECK)`)\r\n // 实体检查对静态/动态属性都生效(setAttribute 不解码,与 innerHTML 行为有差异 → 强制写明面字符)\r\n if (a.value != null && /&[a-zA-Z#0-9]+;/.test(a.value)) {\r\n err(`属性 ${a.name} 的值包含 HTML 实体;codegen 不做实体解码,请直接书写目标字符`)\r\n }\r\n }\r\n\r\n if (lower === 'svg' && !selfClosing) inSvg = true\r\n if (lower === 'foreignobject') err('foreignObject 暂不支持(v1)')\r\n\r\n if (!selfClosing && !VOID_TAGS.has(lower)) {\r\n stack.push({ name: tag, lower, node: el })\r\n }\r\n continue\r\n }\r\n\r\n // 文本节点:到下一个 '<' 为止(原样保留,含纯空白 —— 分裂/裁剪在 codegen 层做)\r\n let end = html.indexOf('<', i)\r\n if (end < 0) end = n\r\n const raw = html.slice(i, end)\r\n parent.push({ type: 'text', raw, parts: splitParts(raw) })\r\n i = end\r\n }\r\n\r\n if (stack.length) {\r\n err(`<${stack[stack.length - 1].name}> 未闭合(不支持 HTML 自动闭合,请显式书写结束标签)`)\r\n }\r\n\r\n // 插值槽完整性:每个 varIndex 必须在树里恰好出现一次\r\n const seen = new Set<number>()\r\n const visit = (nodes: TNode[]) => {\r\n for (const nd of nodes) {\r\n if (nd.type === 'text') {\r\n for (const p of nd.parts) if (p.type === 'var') seen.add(p.index)\r\n } else if (nd.type === 'element') {\r\n for (const a of nd.attrs) {\r\n for (const p of a.parts) if (p.type === 'var') seen.add(p.index)\r\n for (const p of splitParts(a.name)) if (p.type === 'var') seen.add(p.index)\r\n }\r\n visit(nd.children)\r\n }\r\n }\r\n }\r\n visit(root)\r\n for (let v = 0; v < varCount; v++) {\r\n if (!seen.has(v)) err(`插值槽 ${v} 未在模板结构中出现`)\r\n }\r\n if (seen.size !== varCount) err('模板中出现未知编号的插值槽')\r\n\r\n // 编译期剔除「仅排版用的空白文本」节点:源码换行/缩进会解析出不带占位符的\r\n // 纯空白 Text,它们在 innerHTML 路径里会变成空 Text 节点,白占 nodes[] 名额与\r\n // clone/effect 开销。判据:`raw` 全是空白(只含空格/Tab/换行)⇒ 纯排版空白。\r\n const RAWTEXT = WS_SENSITIVE_TAGS\r\n const prune = (nodes: TNode[], parentTag: string | null): TNode[] => {\r\n if (parentTag !== null && RAWTEXT.has(parentTag)) return nodes\r\n const kept: TNode[] = []\r\n for (let i = 0; i < nodes.length; i++) {\r\n const nd = nodes[i]\r\n if (nd.type === 'element') { nd.children = prune(nd.children, nd.tag.toLowerCase()) }\r\n if (nd.type !== 'text') { kept.push(nd); continue }\r\n // 纯空白(仅空格/Tab/换行且有非空内容的空白为分界)全部剔除——\r\n // 用户要求:</b> <span> 间的 \" \" 这种排版空白不留在 nodes[] 中。\r\n // 注意:两个内联元素间若依赖该空格做视觉分隔,需改在外层用 CSS gap/markup 表达。\r\n if (/^[ \\t\\r\\n]+$/.test(nd.raw)) continue\r\n kept.push(nd)\r\n }\r\n return kept\r\n }\r\n const pruned = prune(root, null)\r\n return { root: pruned }\r\n}\r\n\r\n/**\r\n * 清除出现在**属性名/属性值**里的静态 HTML 常量折叠标记。\r\n *\r\n * `staticHtmlFragmentOf` 只看表达式形态,不知道它落在文本位还是属性位;\r\n * 而折叠(inlineStaticFragments)只处理文本节点。属性位若保留 fragment 标记,\r\n * build-vars 会跳过该 varIndex,但 emitAttr 仍会为它创建 up ⇒ 内部不变量错位。\r\n * 属性位保留普通指令语义(TAG 位的 html 是合法用法;属性值位由 codegen 报错)。\r\n */\r\nexport function clearAttrFragments(\r\n nodes: TNode[],\r\n vars: ReadonlyArray<{ fragment?: string }>,\r\n): void {\r\n const clear = (idx: number) => {\r\n if (vars[idx]) vars[idx].fragment = undefined\r\n }\r\n const walk = (list: TNode[]) => {\r\n for (const nd of list) {\r\n if (nd.type !== 'element') continue\r\n for (const a of nd.attrs) {\r\n for (const p of a.parts) if (p.type === 'var') clear(p.index)\r\n for (const p of splitParts(a.name)) if (p.type === 'var') clear(p.index)\r\n }\r\n walk(nd.children)\r\n }\r\n }\r\n walk(nodes)\r\n}\r\n\r\ninterface OpenTag {\r\n name: string\r\n lower: string\r\n node: TElement\r\n}\r\n","/**\n * buildVars codegen:主模板插值表达式 → 运行时静态取值函数。\n *\n * 生成物形态(docs/TEMPLATE-CODEGEN.md §2 补充):\n *\n * function(__comp) { return [expr0, expr2, ...] }\n *\n * - 与 buildTemplate 的 varIndex 空间严格对齐。\n * - 表达式源码原样复制(module 作用域标识符、指令调用在组件源文件内可解析),\n * 仅做 `this` → `__comp` 改写(含字符串/模板字面量上下文感知的扫描)。\n * - 自由标识符校验:表达式内的自由标识符必须是模块绑定 / compelem 导入 /\n * 安全全局,否则返回 errors(组件不可编译)——\n * render() 局部变量无法在注入的静态函数作用域内解析。\n */\nimport { blockedTsText, containsBlockedTsNode, keyName, parseUncached } from '../utils/ast'\nimport { scanJsText, degradePrivateNames } from '../utils/js-text'\nimport { IMPURE_GLOBALS as IMPURE_GLOBAL_SET, KNOWN_GLOBALS } from '../utils/globals'\nimport type { ComponentAnalysis } from '../types'\nimport { type MainTemplate } from '../analyze/template-extract'\nimport { COMpelem_DIRECTIVES } from '../analyze/render-body'\nimport {\n applySubIdWraps,\n partitionDirectiveArgs,\n stripTsChecked,\n type SubCandidate,\n} from '../analyze/template-subs'\n\nexport interface BuildVarsResult {\n code: string | null\n errors: string[]\n /**\n * 自由标识符(解析成功但 filterFree 拒绝时)——供 C1 判断是否可闭包提升到父级。\n * 仅在 `code == null` 且因自由标识符失败时填充。\n */\n freeIds?: string[]\n /** C1:已闭包提升为回调实例 __bv(不写入 subs[]) */\n lifted?: boolean\n /**\n * 表达式脏依赖映射——根名 → 取值函数输出数组下标;特殊键 `''` 为\n * **常脏**下标(含动态 this / 未知 getter / 方法调用 / 不纯自由标识符\n * (Date/console/document/window/globalThis)/ 无法解析的表达式),任一视图\n * 更新都重算。与 guarded codegen 配对:取值函数只对 dirty 内下标求值,\n * 其余槽位返回占位值(区间扫描不读)。仅 verbose 依赖清单展示使用。\n */\n viewDepVarIndices?: Record<string, number[]>\n}\n\n/** generateBuildVars/generateSubBuildVars 可选项:C1 闭包提升 extras + 祖先形参白名单。 */\nexport interface BuildVarsOptions {\n /** subId → Object.assign 追加属性(`, __bv: function...`),由 applySubIdWraps 消费 */\n extras?: ReadonlyMap<number, string>\n /**\n * subId → 模块级 carrier 常量名(自洽子模板)。有 extras 的候选不消费它\n * (必须逐次新建才能捕获祖先形参);无 extras 时直接引用常量,\n * 省掉每次更新重跑 fx 工厂里的 `Object.assign` + 新建闭包。\n */\n carriers?: ReadonlyMap<number, string>\n /** 额外允许的自由标识符(C1:祖先回调形参,生成 __bv 时闭包捕获) */\n extraAllowed?: ReadonlySet<string>\n /**\n * U2:自由标识符校验结果缓存(同一 compileFile 内 comp 相同,fnRaw → free 集合)。\n * C1 两阶段会对同一子模板多次调用 generateSubBuildVars(初试/提升/regen),\n * 免重复 hash + walk。仅 freeIdentifiersInFn 消费;调用方只读返回集合。\n */\n freeCache?: Map<string, Set<string> | null>\n /**\n * verbose 依赖展示(DepSummary 的根名→var 映射)才需要 per-var 链分类:\n * 子模板路径每插值多一次字符串 parse,默认关闭(该映射仅 verbose/CE_DEPS_DEBUG 展示用)。\n */\n depsDisplay?: boolean\n}\n\n/** 允许的自由标识符白名单(表达式求值环境 = 模块作用域 + __comp 参数)。\n * 与 analyze/render-body 的 D3 判定**共用同一份**(utils/globals.ts):\n * 两处各持一份会导致 Map/Set/queueMicrotask 等通过 D3 却在 filterFree 被拒,\n * 且报错信息误称其为「render() 局部标识符」。 */\nconst SAFE_GLOBALS = KNOWN_GLOBALS\n\n/**\n * SAFE_GLOBALS 中**不纯**的子集:值依赖外部状态/时钟,脏依赖映射无法静态归因\n * → 引用它们的表达式整体归入常脏(任一视图更新都重算,与全量求值行为一致)。\n */\nconst IMPURE_GLOBALS = IMPURE_GLOBAL_SET\n\n/**\n * TS 专有 AST 键(值在 JS 里不存在):自由标识符 walk 一律不下钻。\n * 类型位上的标识符是**类型名**,编译期擦除后既不是依赖也不是可解析引用,\n * 收进自由集会给出「引用了 render() 局部标识符 'Foo'」这类无意义报错。\n */\nconst TS_ONLY_KEYS = new Set(['typeAnnotation', 'typeParameters', 'typeArguments', 'queryString', 'typeName'])\n\n// ---------- this 改写(字符串/模板字面量上下文感知) ----------\n\n/**\n * 把表达式源码中的 `this` 全部改写为 `thisName`(默认 `__comp`)。\n * 字符串/注释/正则字面量内容不改写;模板字面量 `${...}` 表达式属于 JS 上下文,\n * 其中的 this 一并改写(子视图模板经 tmplFn.call(component) 求值,语义等价)。\n * 返回 null 表示引号/模板/注释/正则不闭合(防御性返回)。\n *\n * `thisName`:buildVars 的形参名是 `__comp`;per-point effect 的形参是 `rc`。\n * 上下文识别统一在 `utils/js-text#scanJsText`。\n */\nexport function rewriteThis(src: string, thisName = '__comp'): string | null {\n const { mask, closed } = scanJsText(src)\n if (!closed) return null\n let out = ''\n let i = 0\n const n = src.length\n while (i < n) {\n if (mask[i] && src.startsWith('this', i)) {\n const prev = i > 0 ? src[i - 1] : ''\n const next = i + 4 < n ? src[i + 4] : ''\n const isWord = (ch: string) => /[A-Za-z0-9_$]/.test(ch)\n if (!isWord(prev) && !isWord(next)) {\n out += thisName\n i += 4\n continue\n }\n }\n out += src[i]\n i++\n }\n return out\n}\n\n// ---------- 自由标识符校验(AST 精确解析) ----------\n\n/** 表达式 this 链分类收集——roots 命中响应式字段的根名;uncertain 放弃静态分类。 */\ninterface ChainOut {\n roots: Set<string>\n uncertain: boolean\n}\n\n/**\n * 从 MemberExpression 沿非计算成员上溯分类:\n * - this 链且根 ∈ comp.fields → roots.add(根)(changed 键首段命中即重算,祖先键必达 ✓)\n * - this 链但根 ∉ fields(跨文件基类 prop/state/computed、方法、普通 getter)→ roots.add(根)\n * 同时 uncertain(内部依赖未知 → 常脏保底):按名建键让 viewDepVarIndices/依赖清单可见,\n * 常脏保证槽位每次更新都重求值(脏集是并集)\n * - `this[expr]` 动态访问 / `super.X` → uncertain\n * - 局部/形参/自由标识符起始 → 不记录(依赖已由产生它的表达式侧覆盖)\n * 从链中段与完整链各上溯一次仅造成 roots 重复(Set 去重),无副作用。\n */\nfunction classifyThisChain(node: any, out: ChainOut, comp?: ComponentAnalysis): void {\n const chain: string[] = []\n let cur: any = node\n while (cur && (cur.type === 'MemberExpression' || cur.type === 'OptionalMemberExpression')) {\n if (cur.computed) break\n const name = keyName(cur.property)\n if (!name) break\n chain.unshift(name)\n cur = cur.object\n }\n if (cur?.type === 'ThisExpression') {\n if (!chain.length) return // 裸 `this` 无依赖\n if (comp?.fields?.get(chain[0])) out.roots.add(chain[0])\n else {\n out.roots.add(chain[0])\n out.uncertain = true\n }\n } else if (cur?.type === 'Super') {\n out.uncertain = true\n } else if (node.object?.type === 'ThisExpression' && node.computed) {\n out.uncertain = true // this[expr]\n }\n}\n\n/**\n * 解析表达式并收集自由标识符(不在任何函数参数/局部声明、且非属性访问位置的)。\n * 解析失败返回 null(调用方放弃注入)。\n *\n * @param comp 提供 compelem 指令识别:模板回调实参整棵跳过(其自由标识符由子模板\n * freeIdentifiersInFn 单独校验),避免把回调闭包误报为主表达式依赖。\n * @param chainOut 可选——同时分类收集 this 链根名(与自由标识符同一次解析)。\n * @param prelude 主模板 render() 的前置语句:拼进 wrapper 只为「建作用域」,让\n * 插值里引用 prelude 局部变量时不被误判为自由标识符(见 collectFreeWalk)。\n * 它的私有名同样要降级 —— 漏了这一半就是 2026-10-21 的编译白屏。\n */\nfunction freeIdentifiers(\n expr: string,\n comp?: ComponentAnalysis,\n chainOut?: ChainOut,\n prelude?: string,\n): Set<string> | null {\n let fnBody: any\n try {\n const safe = degradePrivateNames(expr)\n // prelude 走同一降级:它和 expr 拼在同一个裸函数里,任何一侧残留 `#x` 都会\n // 让整个 wrapper parse 失败(错误文案只会指到「插值 #N」,不说是 prelude)。\n const safePrelude = prelude ? degradePrivateNames(prelude) : ''\n const wrapper = safePrelude\n ? `(function(){ ${safePrelude}\\nreturn (${safe}) })`\n : `(function(){ return (${safe}) })`\n const parsed = parseUncached(wrapper)\n fnBody = parsed.program?.body?.[0]?.expression?.body\n } catch {\n return null\n }\n if (!fnBody) return null\n // Walk the entire function body (including prelude) to establish scope,\n // then the return expression will find prelude-declared variables in scope.\n return collectFreeWalk(fnBody, comp, chainOut)\n}\n\n/**\n * U2:对模块 AST 中已解析的表达式节点直接收集(免 wrapper 重复 parse)。\n *\n * 语义等价性:wrapper 是无参空环境函数,walk 从 ReturnStatement.argument 起步,\n * wrapper 本身不贡献任何作用域——直接以同一初始 scope walk 模块节点逐字一致。\n * `wrapperRisky` 命中(await/yield 等会让非 async wrapper parse 失败、而模块侧\n * 合法的构造)时回退字符串路径(含 parse 失败 → null)。\n *\n * @param exprSource 该节点的原始源码切片——风险回退路径用\n */\nfunction freeIdentifiersFromNode(\n node: any,\n exprSource: string,\n comp?: ComponentAnalysis,\n chainOut?: ChainOut,\n prelude?: string,\n): Set<string> | null {\n if (!node || typeof node.type !== 'string' || wrapperRisky(node) || prelude) {\n return freeIdentifiers(exprSource, comp, chainOut, prelude)\n }\n return collectFreeWalk(node, comp, chainOut)\n}\n\n/**\n * 检测「wrapper parse 会失败、但模块 AST 合法」的构造:非嵌套函数内的\n * await/yield(wrapper 非 async/非 generator)。嵌套函数内部不下钻——\n * 其 await/yield 在两侧均合法(wrapper 亦然)。宁可多判:多判只回退\n * 字符串路径(行为不变),漏判会改变行为。\n */\nfunction wrapperRisky(node: any): boolean {\n let risky = false\n const visit = (n: any): void => {\n if (!n || typeof n.type !== 'string' || risky) return\n const t = n.type\n if (t === 'AwaitExpression' || t === 'YieldExpression') {\n risky = true\n return\n }\n if (\n t === 'FunctionExpression' ||\n t === 'FunctionDeclaration' ||\n t === 'ArrowFunctionExpression' ||\n t === 'MethodDefinition'\n ) {\n return\n }\n for (const k of Object.keys(n)) {\n if (k === 'type' || k === 'start' || k === 'end' || k === 'parent') continue\n const v = n[k]\n if (Array.isArray(v)) {\n for (const c of v) {\n visit(c)\n if (risky) return\n }\n } else if (v && typeof v === 'object' && typeof v.type === 'string') {\n visit(v)\n if (risky) return\n }\n }\n }\n visit(node)\n return risky\n}\n\n/** 自由标识符/this 链收集的共享 walk 体(string 解析路径与 node 直行走同一实现)。 */\nfunction collectFreeWalk(ret: any, comp?: ComponentAnalysis, chainOut?: ChainOut): Set<string> {\n const free = new Set<string>()\n const scopes: Set<string>[] = [new Set()]\n\n const inScope = (name: string) => scopes.some((s) => s.has(name))\n\n const collectParams = (fn: any): Set<string> => {\n const s = new Set<string>()\n for (const p of fn.params ?? []) addPatternNames(p, s)\n return s\n }\n const addPatternNames = (pat: any, s: Set<string>) => {\n if (!pat) return\n switch (pat.type) {\n case 'Identifier':\n s.add(pat.name)\n break\n case 'ObjectPattern':\n for (const p of pat.properties ?? []) {\n if (p.type === 'RestElement') addPatternNames(p.argument, s)\n else addPatternNames(p.value ?? p.key, s)\n }\n break\n case 'ArrayPattern':\n for (const el of pat.elements ?? []) addPatternNames(el, s)\n break\n case 'AssignmentPattern':\n addPatternNames(pat.left, s)\n break\n case 'RestElement':\n addPatternNames(pat.argument, s)\n break\n }\n }\n\n /** 解构默认值表达式求值(绑定名本身由 addPatternNames 入作用域)。 */\n const walkPatternDefaults = (pat: any): void => {\n if (!pat) return\n switch (pat.type) {\n case 'AssignmentPattern':\n walkPatternDefaults(pat.left)\n walk(pat.right, false)\n break\n case 'ObjectPattern':\n for (const p of pat.properties ?? []) {\n if (p.type === 'RestElement') walkPatternDefaults(p.argument)\n else walkPatternDefaults(p.value ?? p.key)\n }\n break\n case 'ArrayPattern':\n for (const el of pat.elements ?? []) walkPatternDefaults(el)\n break\n case 'RestElement':\n walkPatternDefaults(pat.argument)\n break\n }\n }\n\n const isDirectiveCallee = (node: any): string | null => {\n if (!comp) return null\n if (node.type !== 'CallExpression' || node.callee?.type !== 'Identifier') return null\n const imported = comp.compelemImports.get(node.callee.name)\n if (imported && COMpelem_DIRECTIVES.has(imported)) return imported\n // 自定义指令(moduleBindings 内的模块级函数调用)\n if (comp.moduleBindings?.has(node.callee.name)) return node.callee.name\n return null\n }\n\n const walk = (node: any, isPropPos: boolean): void => {\n if (!node || typeof node.type !== 'string') return\n switch (node.type) {\n case 'Identifier':\n if (!isPropPos && !inScope(node.name)) free.add(node.name)\n return\n case 'ThisExpression':\n case 'Super':\n return\n case 'MemberExpression':\n if (chainOut) classifyThisChain(node, chainOut, comp)\n walk(node.object, false)\n walk(node.property, !node.computed)\n return\n case 'Property':\n walk(node.key, !node.computed)\n walk(node.value, false)\n return\n case 'FunctionExpression':\n case 'FunctionDeclaration':\n case 'ArrowFunctionExpression': {\n const s = collectParams(node)\n // 参数默认值在参数作用域内求值\n for (const p of node.params ?? []) walkIn(p, s)\n scopes.push(s)\n walk(node.body, false)\n scopes.pop()\n return\n }\n case 'CatchClause': {\n const s = new Set<string>()\n if (node.param) addPatternNames(node.param, s)\n scopes.push(s)\n walk(node.body, false)\n scopes.pop()\n return\n }\n case 'VariableDeclaration': {\n const scope = scopes[scopes.length - 1]\n for (const d of node.declarations ?? []) {\n addPatternNames(d.id, scope)\n walkPatternDefaults(d.id)\n walk(d.init, false)\n }\n return\n }\n case 'CallExpression': {\n const directive = isDirectiveCallee(node)\n if (directive) {\n const args: any[] = node.arguments ?? []\n const flags = partitionDirectiveArgs(directive, args)\n walk(node.callee, true)\n args.forEach((arg, i) => {\n const isTmpl = flags[i]\n const isFn =\n arg && (arg.type === 'ArrowFunctionExpression' || arg.type === 'FunctionExpression')\n if (isTmpl && isFn) return\n walk(arg, false)\n })\n return\n }\n break\n }\n }\n for (const k of Object.keys(node)) {\n if (k === 'type' || k === 'start' || k === 'end' || k === 'parent') continue\n // TS 专有键:值在剥离后不存在,其中的标识符是**类型名**(编译期即擦除),\n // 收进自由集会既漏又误报 —— `<T>x` / `f<T>()` 里的 T 不是运行期引用。\n if (TS_ONLY_KEYS.has(k)) continue\n const v = (node as any)[k]\n if (Array.isArray(v)) for (const c of v) walk(c, false)\n else if (v && typeof v === 'object' && typeof v.type === 'string') walk(v, false)\n }\n }\n const walkIn = (node: any, s: Set<string>) => {\n scopes.push(s)\n walk(node, false)\n scopes.pop()\n }\n\n walk(ret, false)\n return free\n}\n\n/**\n * 对完整子模板函数源码做自由标识符校验(params/prelude 入 scope 后检查 exprs)。\n * U2:`cache`(同一 compileFile 内 comp 恒定)命中时免重复 hash+walk——C1 两阶段\n * 对同一 fnRaw 多次调用(初试/提升/regen)全部命中。缓存与返回值互不共享可变引用。\n */\nfunction freeIdentifiersInFn(\n fnSrc: string,\n comp: ComponentAnalysis,\n cache?: Map<string, Set<string> | null>,\n): Set<string> | null {\n if (!cache) return freeIdentifiers(fnSrc, comp)\n const hit = cache.get(fnSrc)\n if (hit !== undefined) return hit === null ? null : new Set(hit)\n const r = freeIdentifiers(fnSrc, comp)\n cache.set(fnSrc, r === null ? null : new Set(r))\n return r\n}\n\nfunction filterFree(\n free: Set<string> | null,\n comp: ComponentAnalysis,\n label: string,\n extraAllowed?: ReadonlySet<string>,\n): string[] | null {\n if (free == null) return [`${label} 无法解析为 AST,放弃 buildVars 注入`]\n for (const name of free) {\n if (comp.moduleBindings.has(name) || comp.compelemImports.has(name) || SAFE_GLOBALS.has(name))\n continue\n if (extraAllowed?.has(name)) continue\n return [\n `${label} 引用了 render() 局部标识符 '${name}',无法在静态 buildVars 作用域内解析`,\n ]\n }\n return null\n}\n\n/** filterFree 失败时收集未通过的名字(C1 闭包提升判定用)。 */\nfunction collectRejectedFree(\n free: Set<string> | null,\n comp: ComponentAnalysis,\n): string[] {\n if (!free) return []\n const out: string[] = []\n for (const name of free) {\n if (comp.moduleBindings.has(name) || comp.compelemImports.has(name) || SAFE_GLOBALS.has(name))\n continue\n out.push(name)\n }\n return out\n}\n\nconst BV_OK = '__ce_bv_ok__'\n\n/**\n * 生成 buildVars 函数源码。任一插值无法安全静态化 → 返回 errors(调用方放弃注入)。\n *\n * @param source 原始源文件全文(子模板 wraps 用;缺省时跳过 wraps)\n * @param candidates 子模板候选(与 source 配对)\n */\nexport function generateBuildVars(\n tmpl: MainTemplate,\n comp: ComponentAnalysis,\n source?: string,\n candidates?: SubCandidate[],\n opts?: BuildVarsOptions,\n): BuildVarsResult {\n const exprs: string[] = []\n const depsDisplay = opts?.depsDisplay === true\n const hasWraps = source != null && !!candidates?.length\n const extras = opts?.extras\n // 根名/'' → 输出下标脏映射;'' 收集常脏(uncertain/不纯)表达式\n const biMap: Record<string, number[]> = {}\n const alwaysDirty: number[] = []\n\n // ---- prelude:stripTs → TS 复检(仅门禁;产物 prelude 由 render-effect 另路注入)----\n const rawPrelude = tmpl.preludeSrc ?? ''\n if (rawPrelude && stripTsChecked(rawPrelude).tsHit) {\n return { code: null, errors: [`prelude 含 TS 专有语法(as/satisfies/非空断言),放弃注入`] }\n }\n\n for (const v of tmpl.vars) {\n const label = `插值 #${v.index}`\n // `${CONST}` 静态片段:该节点在编译期已被折进建树序列,没有运行期取值。\n // 与 template-dom 的 emitText 共用 `fragment` 标记,两边同跳 ⇒ varIndex 对齐。\n if (v.fragment) continue\n // 顺序:raw free-check(跳过模板回调)→ wraps → stripTs → TS 复检 → super 改写 → this 改写\n // 根名分类仅供 verbose 依赖清单展示;默认跳过,省每个插值一次链分类。\n const chainOut: ChainOut | null = depsDisplay ? { roots: new Set(), uncertain: false } : null\n // U2:模块 AST 节点直达(免 wrapper 重 parse);节点缺失(手工构造 vars)回退字符串路径\n const free = v.node\n ? freeIdentifiersFromNode(v.node, v.exprSource, comp, chainOut ?? undefined, rawPrelude)\n : freeIdentifiers(v.exprSource, comp, chainOut ?? undefined, rawPrelude)\n const freeErr = filterFree(free, comp, label, opts?.extraAllowed)\n if (freeErr) {\n return { code: null, errors: freeErr, freeIds: collectRejectedFree(free, comp) }\n }\n // 自由标识符纯度——不纯全局(Date.now/document/window 等)→ 常脏\n let impureFree = false\n if (free) {\n for (const name of free) {\n if (IMPURE_GLOBALS.has(name)) {\n impureFree = true\n break\n }\n }\n }\n\n let src = v.exprSource\n if (hasWraps && typeof v.start === 'number' && typeof v.end === 'number') {\n src = applySubIdWraps(v.start, v.end, source!, candidates!, extras, opts?.carriers)\n }\n const c = stripTsChecked(src)\n if (c.tsHit) {\n return { code: null, errors: [`${label} 含 TS 专有语法(as/satisfies/非空断言),放弃注入`] }\n }\n const rw = rewriteThis(c.stripped)\n if (rw == null) {\n return { code: null, errors: [`${label} 的 this 改写失败(引号上下文异常)`] }\n }\n const outIdx = exprs.length\n if (depsDisplay && chainOut) {\n if (chainOut.uncertain || impureFree) {\n alwaysDirty.push(outIdx)\n }\n // 按名映射与常脏**双写**(脏集是并集,行为不变):uncertain 表达式里的已知/未声明根\n // 同样建键 → 依赖清单能按变量展示其槽位与 updater('' 常脏仅作保底)。\n if (chainOut.roots.size) {\n for (const r of chainOut.roots) {\n let arr = biMap[r]\n if (!arr) biMap[r] = arr = []\n arr.push(outIdx)\n }\n }\n }\n exprs.push(rw)\n }\n if (depsDisplay && alwaysDirty.length) biMap[''] = alwaysDirty\n const hasBi = depsDisplay && Object.keys(biMap).length > 0\n return {\n code: BV_OK,\n errors: [],\n viewDepVarIndices: hasBi ? biMap : undefined,\n }\n}\n\n/**\n * 生成子模板 buildVars:`function(__comp, ...params) { prelude; return [exprs] }`。\n * prelude 与 exprs 均做 wraps(嵌套回调标 __subId)→ stripTs → TS 复检 → this 改写。\n */\nexport function generateSubBuildVars(\n cand: SubCandidate,\n source: string,\n comp: ComponentAnalysis,\n allCandidates: readonly SubCandidate[],\n opts?: BuildVarsOptions,\n): BuildVarsResult {\n const label = `子模板 sub#${cand.subId}`\n const paramsCode = cand.params.length ? `, ${cand.params.join(', ')}` : ''\n const extras = opts?.extras\n\n // ---- raw free-check(wraps 前,带指令模板回调跳过)----\n const rawPrelude = cand.preludeSrc\n const rawExprs = cand.vars.map((v) => v.exprSource)\n // prelude 与 return 之间必须有换行:prelude 可能以 `!`(非空断言)结尾,\n // 同行 `return` 不会触发 ASI,直接语法错误。\n const fnRaw = `function(__comp${paramsCode}) { ${rawPrelude}\\nreturn [${rawExprs.join(', ')}] }`\n const free = freeIdentifiersInFn(fnRaw, comp, opts?.freeCache)\n const freeErr = filterFree(free, comp, label, opts?.extraAllowed)\n if (freeErr) {\n return { code: null, errors: freeErr, freeIds: collectRejectedFree(free, comp) }\n }\n\n // ---- prelude:wraps → stripTs → TS 复检(仅门禁;sub 产物 prelude 由 buildSubInliner 另路处理)----\n if (rawPrelude) {\n const wrapped = applySubIdWraps(cand.preludeStart, cand.preludeEnd, source, allCandidates, extras, opts?.carriers)\n if (stripTsChecked(wrapped).tsHit) {\n return { code: null, errors: [`${label} prelude 含 TS 专有语法,放弃注入`] }\n }\n }\n\n// ---- exprs ----\n// 展示用根名分类:子模板取值函数恒全量求值,此映射仅供依赖清单的更新映射展示\n// —— 默认跳过(省每插值一次字符串 parse + 链分类),仅 depsDisplay(verbose)时计算\nconst depsDisplay = opts?.depsDisplay === true\nconst biMap: Record<string, number[]> = {}\nconst alwaysDirty: number[] = []\nconst exprsOut: string[] = []\nfor (const v of cand.vars) {\n // `${CONST}` 静态片段:不参与取值(与主模板 generateBuildVars 的跳过规则一致)\n if (v.fragment) continue\n // C-G6②:子插值 AST 直达——旧式尖括号断言 / 显式实例化不被支持(与主模板 ① 同源)。\n if (v.node && containsBlockedTsNode(v.node)) {\n return { code: null, errors: [blockedTsText(`${label} 插值 #${v.index}`, v.exprSource)] }\n }\n let src =\n typeof v.start === 'number' && typeof v.end === 'number'\n ? applySubIdWraps(v.start, v.end, source, allCandidates, extras, opts?.carriers)\n : v.exprSource\n let chainOut: ChainOut | null = depsDisplay ? { roots: new Set(), uncertain: false } : null\n if (chainOut) freeIdentifiers(src, comp, chainOut)\n const c = stripTsChecked(src)\n if (c.tsHit) {\n return { code: null, errors: [`${label} 插值 #${v.index} 含 TS 专有语法,放弃注入`] }\n }\n const rw = rewriteThis(c.stripped)\n if (rw == null) {\n return { code: null, errors: [`${label} 插值 #${v.index} 的 this 改写失败`] }\n }\n exprsOut.push(rw)\n if (chainOut) {\n const outIdx = exprsOut.length - 1\n if (chainOut.uncertain) alwaysDirty.push(outIdx)\n // 与主 buildVars 同构:按名映射与常脏双写(sub 运行时恒全量求值,纯展示)\n if (chainOut.roots.size) {\n for (const r of chainOut.roots) {\n let arr = biMap[r]\n if (!arr) biMap[r] = arr = []\n arr.push(outIdx)\n }\n }\n }\n }\n if (alwaysDirty.length) biMap[''] = alwaysDirty\n\n return {\n code: BV_OK,\n errors: [],\n viewDepVarIndices: depsDisplay && Object.keys(biMap).length ? biMap : undefined,\n }\n}\n","/**\n* per-point effect codegen:UpOut 描述符 → effect 工厂函数源码。\n *\n * 主模板:每个更新点一个工厂 `(rc, nodes) => effectFn`,读 `rc.__s[root].value`。\n * 子模板:整个子模板**合并成一个**工厂 `(rc, nodes, __ceGet, __ceDep) => effectFn`,\n * 内部逐点守卫写 DOM(见 generateSubRenderEffect)。\n *\n * 守卫一律写作 `值 !== 旧值 || rc.__f`:`rc.__f` 是 CompElem 的强制刷新标志,\n * 由 `forceUpdate()` 在重跑本组件全部 view effect 期间置位 —— 纯信号模型下\n * 值未变就没有别的强制重渲染通道,靠它让各点重新落盘。常态下它只是一个布尔\n * 字段读取,`||` 短路后无额外开销。\n *\n * **写入步一律 emit 成模块级自由函数调用(`wText(...)` 等),不内联函数体,也不走 `rc._wXxx(...)`。**\n * `_t2s` 的转换逻辑、`if (t !== n.textContent)` 这类幂等守卫、`setAttribute` 的\n * 字符串拼接,全部由运行时**模块级**写入器 `wText/wAttr/wAttrT/wProp/wToggleProp/wCssVars`\n * 承担(`wProp`/`wCssVars` 首参显式传宿主 `rc`;render.ts 的解释路径共用同一批实现)。\n * 而 `classes(...)`/`styles(...)`/`bind(...)` 这类 TAG 位指令没有专用写入器——它们 emit 成\n * `execDir(rc, ...)`,由指令自身在运行期写 DOM(见 RC_INTERNAL 上方说明)。\n * 产物里每个点因此只留「取哪个信号、写哪个节点、什么形态」三个信息,逻辑单点可改 ——\n * 内联时同一段逻辑要按点数复制,且静态路径与解释路径会各自漂移出不同语义。\n * 抽象的**边界**就在守卫处:每个点仍各自订阅各自那一个根信号、取值仍内联\n * `rc.__s.<k>.value`,per-point 粒度与内联取值都不受影响;写入调用只发生在\n * 值真的变了之后。\n */\nimport type { UpOut } from './template-dom'\nimport { PLACEHOLDER_FIRST_RE, PLACEHOLDER_ONLY_RE } from '../analyze/template-tree'\nimport { applySubIdWraps, stripTsChecked, type SubCandidate } from '../analyze/template-subs'\nimport { varsByUpIndex, type TemplateVarInfo } from '../analyze/template-extract'\nimport { rewriteThis } from './build-vars'\nimport { stringify } from '../utils/ast'\n\n\n/**\n * 正则元字符转义:prelude 名字是合法标识符,可含 `$`(如 `price$`)——\n * 未转义直接内插进 `new RegExp` 会让 `$` 变成尾锚点 ⇒ 边界断言永不匹配 ⇒\n * prelude 不注入 ⇒ 运行期 ReferenceError 且零诊断。稳妥起见按通用元字符集转义。\n */\nconst escapeRe = (s: string): string => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n/** prelude 名 → 词边界匹配正则(名字已转义,见 escapeRe)。 */\nconst preludeNameRe = (name: string): RegExp =>\n new RegExp(`(?<![\\\\w$])${escapeRe(name)}(?![\\\\w$])`)\n\n/**\n * ⚠️⚠️ **工厂隐式形参名必须不可能与用户标识符撞名。**\n *\n * 工厂体里内联的是**用户源码**(只把 `this` 重写成 `rc`,其余原样保留),因此用户\n * 完全可以在模板插值里调用模块级函数。历史形态把第 3/4 个形参命名为 `get` / `dep`:\n *\n * ```ts\n * // 用户源码\n * import { get } from 'myfx'\n * h`<span title=\"${this.labelMap.get(f) + ' - ' + get(data, [f])}\"></span>`\n *\n * // 旧 codegen 产物(形参 get 与模块级 get 同名 ⇒ 用户那次调用被解析成形参)\n * pe: [(rc, nodes, get, dep, ov, f) => () => { const a5 = rc.labelMap.get(f) + ' - ' + get(data, [f]); … }]\n * ```\n *\n * JS 词法作用域下那个 `get(data, [f])` 绑到**形参**,而运行期在子视图路径上第 3/4\n * 实参**恒为 `undefined`**(`render.ts` 的 `registerSubViewEffects`:\n * `(curPe[0])(component, nodes, undefined, undefined, ov, …)`)⇒ 首次求值即\n * `TypeError: get is not a function`。经 esbuild 做作用域改名后报错变成\n * `get4 is not a function`,且模块里的 `import { …, get, … }` 会被判定「未被引用」\n * 而删掉 —— 现象上完全看不出与「形参撞名」有关(2026-10-09 实测于 `Board.ts` /\n * `BoardBar.ts`,esbuild 产物里 0 处 `get4` 声明)。\n *\n * 这两个形参**从未被运行期赋过真值**:`render.ts` / `buildStaticView` 的注释原话是\n * 「每个点的取值表达式都内联在 fx 工厂里,工厂不需要额外的取值解析实参」,保留它们\n * 只为与运行期调用点保持**位置**稳定(第 1/2/5 位才是 rc / nodes / ov)。因此改名\n * 是纯粹的 codegen 内部行为,不触及任何运行期约定。\n *\n * 运行时 helper(`wText`/`execDir`/…)与 `rc` / `nodes` / `ov` 三个真正被生成的代码\n * 读写的名字不动:它们紧邻形参表前部,用户回调形参排在后面(`paramsCode` 追加),\n * 真要撞就是**重复形参名**(ES module 严格模式下直接 SyntaxError),早就在构建期暴露。\n */\nconst P_GET = '__ceGet'\nconst P_DEP = '__ceDep'\n\n/**\n * ⚠️⚠️ **工厂体内生成的局部名同样必须不可撞名。**\n *\n * 与上面形参名同一类事故,但更隐蔽(2026-10-22 审查 C-1 实证):\n *\n * ```ts\n * render() { const a = this.n; return h`<div>${show(a > 0)}</div>`; }\n * // 产物:const a = rc.n; ← prelude 原样注入\n * // const a = (show(a > 0)); ← 指令工厂的局部名\n * // ⇒ SyntaxError: Identifier 'a' has already been declared(整模块加载失败)\n *\n * render() { const ov = this.n; return h`<div>${ov.length}</div>`; }\n * // 产物:let ov; … const ov = rc.n; ← 用户 prelude 遮蔽了旧值槽\n * // ⇒ 守卫比的是 `ov.length` 与 `ov`;末尾 `ov = nv` 给 const 赋值\n * // ⇒ 每轮 effect 抛 TypeError,文本永不更新(异常被隔离,最难查)\n * ```\n *\n * 注意 `const ov` 这一类**不会被形参表暴露**:prelude 注入在 effect **体内**,\n * 而 `ov` 声明在工厂体外层,属于\"内层遮蔽外层\"——不报重复声明,只是静默用错。\n * 因此三处局部名(旧值 / 新值 / 点值)一律走 `__ce` 前缀。\n */\nconst L_OLD = '__ceOv'\nconst L_NEW = '__ceNv'\n/** 点值局部名(子模板按点序号编号,避免同一函数体内重复声明)。 */\nconst lA = (i: number | string): string => `__ceA${i}`\n\nexport interface RenderEffectGen {\n /** `pointEffects:` 右侧完整数组表达式(只有「会随信号变化」的点) */\n arrayExpr: string\n /**\n * `fx:` 右侧完整数组表达式 —— 与 `ups` **逐项 1:1**。\n *\n * 每个工厂签名统一为 `(rc, nodes, __ceGet) => …`,按点的种类返回不同的东西:\n * - 值点(text / attr / prop / toggle):返回 effect 函数\n * - 指令点:返回 `DirectiveInstance`(供 renderTemplate 首屏执行)\n * - 事件 / ref / refAttr 点:返回 handler / `createRef()` 对象 / 属性值\n *\n * 事件与 ref 点没有 effect(不订阅任何信号),但仍在 fx 占位,\n * 从而 pointEffects 与 ups 保持 1:1、可按下标互查(ups 用 `ux` 直接索引 fx)。\n */\n fxExpr: string\n /**\n * 产物里是否出现了 `get(varIndex)` 回退路径。\n *\n * 这是**编译期硬报错信号**:compile.ts 看到 `usedGet` 即写入 `tmplErrors`,\n * 随后抛 `StaticAnalysisError`。主模板每个更新点都必须把表达式内联进 fx /\n * pointEffects 工厂;出现回退说明该表达式含无法静态化的语法(render() 局部\n * 标识符 / TS 专有残留),应在构建期暴露。\n */\n usedGet: boolean\n /**\n * 本次 emit 用到的**模块级**写入器 / 分派入口名\n * (`wText` / `wAttr` / `wAttrT` / `wProp` / `wToggleProp` / `wCssVars` /\n * `execDir` / `execEach` / `execCond` …)。\n *\n * compile.ts 据此把名字并进 compelem 的 helper import —— 只注入实际用到的,\n * 产物里不会出现「import 了但没用」的写入器。\n */\n writers: WriterSet\n}\n\n/** 纯 `this.a` / `this.a.b` 链:可安全改写成 `rc.__s.a.value[.b]` */\nconst THIS_CHAIN_RE = /^this((?:\\.[A-Za-z_$][\\w$]*)+)$/\n\n/**\n * varIndex → 读取表达式。\n *\n * 两级策略(见 signalExprFor / inlineExprFor):\n * 1. 纯 `this.a` / `this.a.b` 链(`THIS_CHAIN_RE`)→ 内联 `rc.__s.a.value[.b]`。\n * 值与根信号**严格同一**,可直接建链,省掉一次访问器调用。\n * 2. 其余一切(算术 / 三元 / 比较 / 方法调用 / 混合模板属性…)→ 把原始表达式\n * 内联进 effect 体(`this`→`rc`);无法内联时退回 `get(varIndex)`,\n * 由 `usedGet` 触发构建期报错。\n *\n * 决不能按 `varIndexToRoot` 内联**裸根信号**(`rc.__s.<root>.value`):\n * `varIndexToRoot` 只说明「该 var **依赖**此根信号」,并不说明「该 var 的**值**\n * 就是此根信号」—— 于是 `${this.n > 0 ? 'pos' : 'neg'}` 会把数字写进文本节点\n * (正确值是 `'pos'`),`${this.a + this.b}` 还会把 `b` 整个从依赖里丢掉。\n */\n/**\n * 内联所需的额外上下文。缺任何一项都退化为「只做 this 改写、不套 wraps」。\n */\nexport interface InlineCtx {\n /** 完整源文件文本(wraps 靠绝对偏移切片) */\n source?: string\n /** 子模板候选(`applySubIdWraps` 据此定位要包 `__subId` 的回调) */\n candidates?: readonly SubCandidate[]\n /** C1 闭包提升的附加属性片段(`, __bv: function(...){}`) */\n extras?: ReadonlyMap<number, string>\n /** subId → 模块级 carrier 常量名(自洽子模板,省每次更新的 Object.assign + 闭包) */\n carriers?: ReadonlyMap<number, string>\n /** varIndex → 源码绝对区间 [start, end) */\n ranges?: Map<number, [number, number]>\n /**\n * 主模板 prelude(render() 中 return h`` 之前的顶层语句)——已完成\n * stripTs / TS 复检 / rewriteThis('rc') 的注入版本。\n * 引用了 prelude 局部变量的工厂会把 prelude 注入 effect 体内(每轮重算,\n * 与 render() 每次执行重算局部变量的语义一致;读 `rc.route` getter 即订阅信号)。\n */\n prelude?: string\n /** prelude 顶层声明的局部变量名(含解构 pattern),`usesPrelude` 据此判断注入点 */\n preludeNames?: ReadonlySet<string>\n}\n\n/**\n * 把一个 var 的原始表达式**内联**进 effect 工厂(`this` → `rc`)。\n *\n * 管线(顺序不能换):`applySubIdWraps` → `stripTs` → TS 专有语法复检 → `rewriteThis`。\n *\n * 为什么指令点也能内联:`applySubIdWraps` 是纯文本拼接,只依赖\n * `source` / `candidates` / `extras`。若因反引号拒绝内联,指令点的 `__subId` 会丢失,\n * `resolveSubTemplateMeta` 返回 undefined 的 tmplM,运行时直接崩。\n *\n * 失败返回 null(引号上下文异常 / TS 语法残留),调用方退回 `get(varIndex)`\n * 并由 `usedGet` 触发构建期报错。\n */\nexport function inlineExprFor(\n varIndex: number,\n varIndexToExpr?: Map<number, string>,\n ctx?: InlineCtx,\n): string | null {\n let src = varIndexToExpr?.get(varIndex)\n const range = ctx?.ranges?.get(varIndex)\n if (typeof range?.[0] === 'number' && ctx?.source) {\n src = applySubIdWraps(range[0], range[1], ctx.source, ctx.candidates ?? [], ctx.extras, ctx.carriers)\n }\n if (src == null) return null\n // C-G6⑤:本函数处理的是**主模板**插值(varIndexToExpr 来自主 ups),其旧式尖括号断言 /\n // 显式实例化已在 template-extract ①(AST 节点直达)拦下;wraps 只做纯文本拼接、不会\n // 新引入 TS 专有语法。故这里只需与 ① 同源的 as/satisfies/非空断言复检——复用\n // stripTsChecked 的全局 memo(与 build-vars 处理同一 wrapped 串,命中即省一次 strip+recheck)。\n const c = stripTsChecked(src)\n if (c.tsHit) return null\n return rewriteThis(c.stripped, 'rc')\n}\n\nexport function signalExprFor(\n varIndex: number,\n varIndexToExpr?: Map<number, string>,\n signalKeys?: Set<string>,\n): string {\n const expr = varIndexToExpr?.get(varIndex)\n if (expr && signalKeys) {\n const m = THIS_CHAIN_RE.exec(expr.trim())\n if (m) {\n // m[1] 以 '.' 开头(\".a.b\"),先去掉再切分,否则 root 会变成空串\n const segs = m[1].slice(1).split('.')\n // ⚠️ 根必须是**真信号键**。`__s` 只装 @prop/@state/@computed 的键\n // (field-extract 注入的 fieldInits)+ 框架自带的 `slots`;普通实例字段、\n // `@query` 查询属性都不在其中。对它们内联出 `rc.__s.x.value` 会在\n // effect 首次执行时抛 `Cannot read properties of undefined (reading 'value')`,\n // 且因 field-extract 视其为「保守收录」而无任何诊断。\n // 非信号根一律退回 `get(i)`,由访问器按真实语义取值。\n if (segs.length && segs[0] && signalKeys.has(segs[0])) {\n const root = segs[0]\n const rest = segs.slice(1)\n return `rc.__s.${root}.value${rest.map((s) => '.' + s).join('')}`\n }\n }\n }\n return `get(${varIndex})`\n}\n\n/** 单个更新点拆成「取值 / 守卫 / 写」三段,供主模板与子模板两种装配方式复用。 */\ninterface Point {\n /** 与旧值比较的表达式,形如 `nv !== ov` / `a3 !== ov[3]` */\n guard: string\n /** 写 DOM 的语句串(引用 `${val}` 与 `${node}`) */\n write: (val: string, node: string) => string\n /** 节点表达式;null 表示该点不需要节点(无) */\n node: string | null\n /** 旧值赋值语句 */\n store: (val: string, old: string) => string\n}\n\n/**\n * 产物写入器的 emit 名(compelem 运行时**模块级**函数)。\n *\n * **为什么 emit 成自由函数调用而不是 `rc._wXxx(...)`**:这些写入器不碰 ES 私有\n * 字段(需要的状态早已下沉到 `CompElemHelper` / `UpdatePointMeta` / 公开字段),\n * 做成实例方法只会在 `CompElem` 的公开类型面上多出一批「产物专用」的成员(作者的\n * 类型提示里挨着 `_execDir`),而产物本来就是在类体**之外**调用它们 —— 每次调用还\n * 多一次属性查找。emit 成 `wText(n, v)` 后作者的组件类型面上一个写入器都不剩,\n * 产物也更短。\n *\n * 需要实例参数的(`wProp`/`wCssVars`/`execDir`)由 emit 点显式传 `rc`。\n */\nconst RC_INTERNAL = {\n /** 通用指令分派:TAG 位指令 / slot() / 第三方自定义指令(模块级,首参 rc) */\n execDir: 'execDir',\n /** forEach 专用分派:多一条 UPDATE(keyed diff) */\n execEach: 'execEach',\n /** 条件类专用分派:ifTrue / ifElse / when,三者 tag 空间相同 */\n execCond: 'execCond',\n /** 写函数名(模块级) */\n wText: 'wText',\n wAttr: 'wAttr',\n wAttrT: 'wAttrT',\n /** prop / toggle 点:模块级,首参是宿主 rc(slot 分支要写宿主 slot 映射) */\n wProp: 'wProp',\n wToggleProp: 'wToggleProp',\n /** cssVars 宿主镜像:模块级,首参是宿主 rc */\n wCssVars: 'wCssVars',\n} as const\n\n/**\n * 按指令名选运行时分派入口。\n *\n * 结构指令的 tag 空间是互斥的:只有 forEach 需要 keyed diff(UPDATE),\n * ifTrue / ifElse / when 只会 REFRESH / REMOVE / REPLACE / NONE。给它们发各自\n * 瘦一层的入口,运行期就不必为一堆用不到的分支付代价。\n *\n * 判据是 `up.directiveName`(模板解析期就确定的真名),**不是** `directiveType`\n * —— 后者只是锚点位置('text' | 'slot'),与指令种类无关。\n */\nfunction dirEntryOf(up: UpOut): string {\n const kind = up.directiveName || ''\n if (kind === 'forEach') return RC_INTERNAL.execEach\n if (kind === 'ifTrue' || kind === 'ifElse' || kind === 'when') return RC_INTERNAL.execCond\n return RC_INTERNAL.execDir\n}\n\n/** 本次生成实际 emit 到的模块级写入器名(并集后由 compile.ts 走 compelem import 注入) */\nexport type WriterSet = Set<string>\n\n/**\n * 生成主模板的 per-point effect 工厂数组。\n * @param ups 更新点描述符\n * @param varIndexToExpr varIndex → 该 var 的原始表达式(判纯 `this` 链,决定能否内联)\n */\nexport function generateRenderEffect(\n ups: UpOut[],\n varIndexToExpr?: Map<number, string>,\n signalKeys?: Set<string>,\n inlineCtx?: InlineCtx,\n): RenderEffectGen {\n // 两类点分开装配:\n //\n // A. 能内联成 `rc.__s.<k>.value` 的点 —— 值与根信号严格同一,**每点一个工厂**。\n // 这是 per-point 粒度的核心:只订阅自己那一个信号,改 A 不唤醒 B。\n // B. 复杂表达式点(算术/三元/方法调用/模块级函数)—— **把表达式内联进 effect 体**\n // (`this`→`rc`)。\n //\n // 内联后不再有 get 的缓存分桶问题,慢点与快点一样可以一点一个工厂;\n // 改写失败时仍退回 `get(varIndex)`,那种情况并入末尾的合并工厂。\n const fast: string[] = []\n /** fx:与 ups 1:1 的工厂数组(见 RenderEffectGen.fxExpr) */\n const fx: string[] = []\n /** 是否退回过 get(vi)(见 RenderEffectGen.usedGet) */\n let usedGet = false\n /** 本次 emit 到的模块级写入器名(供 compile.ts 注入 import) */\n const writers: WriterSet = new Set()\n const ictx: InlineCtx | undefined = inlineCtx\n // 主模板 prelude 注入支持:表达式引用了 prelude 局部变量的工厂,\n // 在 effect 体(每轮重算处)注入 prelude;表达式形态工厂(fx 的\n // prop/directive/event 返回值)则块体化后注入。未引用的工厂零开销。\n const fxPrelude = ictx?.prelude\n // 预编译一次:否则每个 point 的每次 usesPrelude 都要为每个 prelude 名 new RegExp。\n const preludeRes = fxPrelude && ictx?.preludeNames?.size\n ? [...ictx.preludeNames].map((n) => preludeNameRe(n))\n : undefined\n const usesPrelude = (src: string): boolean =>\n !!preludeRes && preludeRes.some((re) => re.test(src))\n /** 表达式形态工厂块体化:引用 prelude 变量时注入声明,否则原样返回。 */\n const exprFx = (inst: string): string =>\n usesPrelude(inst) ? `(rc) => { ${fxPrelude}\\nreturn (${inst}) }` : `(rc) => (${inst})`\n /** effect 体工厂的内层取值前缀:引用 prelude 变量时注入声明。 */\n const bodyPrelude = (src: string): string => (usesPrelude(src) ? fxPrelude + '\\n' : '')\n let n = 0\n const nodeOf = (up: UpOut) => `nodes[${up.nodeSn}]`\n for (const up of ups) {\n // 占位点(event/ref/refAttr)不读任何信号 → **不注册 effect**,但仍要在 fx 里\n // 占位保持 1:1(事件 handler / ref 对象 / refAttr 值由 fx 交给 renderTemplate)。\n if (up.isEvent || up.isRef || up.isRefAttr) {\n const inst = inlineExprFor(up.varIndex, varIndexToExpr, ictx)\n if (inst) fx.push(exprFx(inst))\n else {\n fx.push(`(rc, nodes, ${P_GET}) => ${P_GET}(${up.varIndex})`)\n usedGet = true\n }\n continue\n }\n // 指令点(含 TAG 位 show/classes/styles/bind/model):var 的值是 DirectiveInstance\n // 而非内层信号,必须交回运行时按指令语义执行 —— 内联写法会把内层信号当值用。\n // fx[i] 返回 DirectiveInstance 供 renderTemplate 首屏执行;updates 里另有一个\n // `execDir` effect 负责后续变更 —— 一个点两处,这是「只 emit 不写本地」之外的\n // 又一处「工厂要同时满足首屏与更新」的需求,故 pointEffects 仍是 fx 的真子集。\n if (up.isDirective) {\n const inst = inlineExprFor(up.varIndex, varIndexToExpr, ictx)\n const val = inst ?? `${P_GET}(${up.varIndex})`\n if (!inst) usedGet = true\n const entry = dirEntryOf(up)\n writers.add(entry)\n // 第 5 实参传完整 DirectiveInstance:同一元素可叠多个 TAG 指令(classes+styles+show),\n // __dirNodeMap 按 node 反查会互相覆盖,运行时据实例的 diFn 挑回正确的 UpdatePoint\n const f = `(rc, nodes, ${P_GET}) => { let ${L_OLD}; return () => { ${bodyPrelude(val)}const ${lA('')} = (${val}); if (${lA('')}[1][0] !== ${L_OLD} || rc.__f) { ${entry}(rc, ${nodeOf(up)}, ${lA('')}[1][0], ${L_OLD}, ${lA('')}); ${L_OLD} = ${lA('')}[1][0] } } }`\n fast.push(f)\n // fx 返回 DirectiveInstance 供 renderTemplate 首屏执行(与 pointEffects 共用工厂源码)\n fx.push(exprFx(val))\n continue\n }\n const value = signalExprFor(up.varIndex, varIndexToExpr, signalKeys)\n // ⚠️ 只在 signalExprFor 退回 `get(vi)` 时才需要内联。若它已经给出\n // `rc.__s.<k>.value`,就必须用那个 —— 访问器 `rc.a` 只差一次调用,但\n // signalExprFor 里那道根信号校验(普通实例字段 / @query 不在 __s 里,\n // 内联出 __s 会抛 undefined.value)就不能生效了。\n // 顺带省掉一次源码切片与改写(内联不是廉价的)。\n const usesGet = value.startsWith('get(')\n const inlined = usesGet ? inlineExprFor(up.varIndex, varIndexToExpr, ictx) : null\n // 退回 get(vi) 时**必须**置位:用于触发构建期报错;漏置位会产出含未解析\n // get(vi) 的产物,运行期静默不更新。\n if (usesGet && inlined == null) usedGet = true\n const src = inlined ?? value\n const p = buildPoint(up, L_NEW, L_OLD, writers)\n if (p === undefined) {\n // buildPoint 拆不出静态形态 → 该点无 effect,但 fx 仍要占位保持 1:1\n fx.push(`() => undefined`)\n n++\n continue\n }\n const factory = `(rc, nodes, ${P_GET}) => { let ${L_OLD}; return () => { ${bodyPrelude(src)}const ${L_NEW} = ${src}; if (${p.guard} || rc.__f) { ${p.write(L_NEW, p.node!)}; ${p.store(L_NEW, L_OLD)} } } }`\n // prop 点:fx 必须返回**值**而不是 effect 工厂。\n //\n // 原因在 renderTemplate:子组件首帧还是 wrapper(见\n // ComponentUninitializedWrapperComponentMap),此时 `_setProp` 写不进去 ——\n // 值只认 `addUninitializedSubComponentProp` 的 props 通道。所以 prop 初值必须\n // 在 renderTemplate 当场就有值;effect 那次求值只负责之后的变更。\n // 代价是首帧把表达式算两遍(fx 一次、effect 首 run 一次):prop 点都是跨组件\n // 边界那一跳,本就不是热路径,而漏掉初值的症状是「子组件停在默认值」,很难查。\n if (up.isProp) {\n fast.push(factory)\n fx.push(usesPrelude(src)\n ? `(rc, nodes, ${P_GET}) => { ${fxPrelude}\\nreturn (${src}) }`\n : `(rc, nodes, ${P_GET}) => (${src})`)\n } else {\n // 去重:值点工厂在 pointEffects 与 fx 各 emit 一份相同源码,minifier 无法\n // 去重数组字面量里的函数体。pointEffects 存 fx 下标(运行时按 typeof 解引用),\n // 工厂源码只 emit 一份,effect 注入块体积近半。\n const fxIdx = fx.length\n fx.push(factory)\n fast.push(String(fxIdx))\n }\n n++\n }\n return {\n arrayExpr: `[${fast.join(',')}]`,\n fxExpr: `[${fx.join(',')}]`,\n usedGet,\n writers,\n }\n}\n\n/**\n * 子模板内联器。产出一个「varIndex → 已内联取值表达式」+ prelude 的构造器。\n *\n * 管线与 `generateSubBuildVars` **逐字同构**(顺序都不能换):\n* `applySubIdWraps` → `stripTs` → TS 专有语法复检 → `rewriteThis('rc')`。\n * `this` 改写目标为 `rc`(另一条取值函数生成路径改写为 `__comp`,两者须同构)。\n *\n * 为什么 prelude **也必须**做 `rewriteThis('rc')`(2026-10-14 回归修复):prelude 会被\n * `generateSubInlinedEffect` 原样注入 `__ce_static__` **静态上下文**里的 pointEffects/fx\n * 工厂 `(rc, nodes, …) => …`,该处 `this` 词法绑定到**类本身** —— 不改写则 `this.xxx`\n * 编译成 `ClassName.xxx`(恒 undefined),运行期当场抛(白屏,例:`d.rowId` on\n * undefined);且 prelude 里的 `void this.sig` 依赖注册同样静默失效(子模板冻结在首帧,\n * 右栏面板停在第 0 行)。旧 buildVars 路径的 prelude 在 `function(__comp…)` 里经\n * `.call(component)` 求值所以 `this` 可用 —— 不能把那个假设照搬到内联路径。\n */\nexport function buildSubInliner(\n cand: SubCandidate,\n source: string,\n candidates: readonly SubCandidate[],\n extras: ReadonlyMap<number, string> | undefined,\n carriers: ReadonlyMap<number, string> | undefined,\n): { val: (vi: number) => string | null; prelude: string | null } {\n // 键必须是 **ups 序**(= 非片段 var 的序号),不是 `v.index`:`${html(CONST)}`\n // 片段不占 varIndex,两序会错开,把 varIndex 解到片段 var 上(见 varsByUpIndex)。\n const byIndex = new Map<number, TemplateVarInfo>()\n const upsVars = varsByUpIndex(cand.vars)\n for (let vi = 0; vi < upsVars.length; vi++) byIndex.set(vi, upsVars[vi])\n const val = (vi: number): string | null => {\n const v = byIndex.get(vi)\n if (!v) return null\n let src: string | null =\n typeof v.start === 'number' && typeof v.end === 'number'\n ? applySubIdWraps(v.start, v.end, source, candidates, extras, carriers)\n : v.exprSource\n if (src == null) return null\n // C-G6:子插值的旧式尖括号断言 / 显式实例化已在 generateSubBuildVars ②(AST 直达)拦下;\n // 此处 wrapped 串与 ② 完全同一 ⇒ stripTsChecked memo 命中,只做同源的 as/satisfies/非空复检。\n const c = stripTsChecked(src)\n if (c.tsHit) return null\n return rewriteThis(c.stripped, 'rc')\n }\n let prelude: string | null = ''\n if (cand.preludeSrc) {\n const out0 = applySubIdWraps(cand.preludeStart, cand.preludeEnd, source, candidates, extras, carriers)\n const c = stripTsChecked(out0)\n if (c.tsHit) prelude = null\n // this → rc:注入点在 __ce_static__ 静态上下文(见函数头注释的回归说明)。\n // rewriteThis 仅在做引号配对复检失败时返回 null(合法 JS 不可能出现),\n // 与 TS 语法失败同一语义:prelude = null ⇒ 调用方构建期报错,不产出静默坏产物。\n else prelude = rewriteThis(c.stripped, 'rc')\n }\n return { val, prelude }\n}\n\n/** 结构指令点语句(内联取值版)。与 get 版 dirStmt 语义一致,只是 value 由调用方给出。 */\nfunction dirStmtVal(up: UpOut, a: string, value: string, old: string, writers: WriterSet): string {\n const entry = dirEntryOf(up)\n const node = `nodes[${up.nodeSn}]`\n writers.add(entry)\n return (\n `const ${a} = ${value}; ` +\n `if (${a}[1][0] !== ${old} || rc.__f) { ${entry}(rc, ${node}, ${a}[1][0], ${old}, ${a}); ${old} = ${a}[1][0] }`\n )\n}\n\n/**\n * **自洽子模板**的 effect/fx 生成(把取值表达式内联进工厂,不产 `get(vi)`)。\n *\n * - 自洽子模板(表达式只引用自身形参 + `this` + 模块名)→ 本函数,内联。\n * - 跨层子模板(表达式引用祖先回调形参,如 `row[c]`)→ 顶层工厂无法解析,走 `__fx`\n * 闭包路径(在祖先作用域物化,见 compile.ts)。\n *\n * 工厂签名 `(rc, nodes, __ceGet, __ceDep<params>)`:前四个是运行时统一形参,`<params>` 为回调\n * 原始形参(运行时按 (v,k,i) 位置传参)。\n * 自洽子模板下 `__ceGet`/`__ceDep` 不被读,保留只为与运行时调用点保持位置稳定 ——\n * **命名必须防撞**(详见文件顶部 `P_GET`/`P_DEP` 的长注释)。\n *\n * fx 与 ups **逐项 1:1**:指令点返回 DirectiveInstance,prop 点返回值,事件/ref 点位;\n * 值点只在 fx 占位(`undefined`),其值由合并 effect 的首次 run 写入(deferValueFill)。\n */\nexport function generateSubInlinedEffect(\n ups: UpOut[],\n inlineVal: (vi: number) => string | null,\n prelude: string,\n paramsCode: string,\n preludeNames?: Set<string>,\n): RenderEffectGen {\n const stmts: string[] = []\n const fx: string[] = []\n let usedGet = false\n const writers: WriterSet = new Set()\n let n = 0\n const fxSig = `(rc, nodes, ${P_GET}, ${P_DEP}${paramsCode})`\n // 合并 effect 工厂额外多一个**外部传入**的旧值槽数组 ov:工厂在 effect 体**每轮**被\n // 调用(item 实参读 cell.value → 订阅 + 当前值),ov 必须跨轮持久,由运行时提供。\n // ⚠️ 形参名必须不可撞名(见 `L_OLD` 注释):子模板回调形参由 `paramsCode` 追加在\n // 后面,叫 `ov` 的用户形参会让整个合并工厂直接 SyntaxError(重复形参)。\n const peSig = `(rc, nodes, ${P_GET}, ${P_DEP}, ${L_OLD}${paramsCode})`\n /**\n * 表达式是否引用 `prelude` 里声明的局部变量。\n *\n * 子模板回调体可以带**前置语句**(`forEach(list, k, (item) => { const x = f(item); return h`…` })`),\n * 编译期把它们原样保留为 prelude。`pointEffects` 的工厂体每轮开头注入 prelude,所以\n * `const a0 = svgName;` 这类 `stmts` 没问题;但 **`fx` 工厂是另一份独立函数**,\n * 历史实现**没有**注入 prelude ⇒ 表达式里的 `svgName` 在 fx 作用域里根本不存在。\n *\n * 症状(2026-10-09 实测于 compelem-ui-website 的 `IconPage.ts`):\n * ```ts\n * ${forEach(this.filteredIcons, n => n, (name) => {\n * const svgName = toSvgName(name) // ← prelude\n * return h`<button title=\"${svgName}\" …>`\n * })}\n * ```\n * 产物:`pe` 有 `const svgName = toSvgName(name);`,`fx` 却是\n * `(rc, nodes, __ceGet, __ceDep, name) => (svgName)` ⇒ `renderTemplate` 的\n * `callFx` 当场求值即 `ReferenceError: svgName is not defined`,**整页不渲染**\n * (加载期异常,`setup()` 直接抛出)。\n */\n const preludeRes = prelude && preludeNames?.size\n ? [...preludeNames].map((nm) => preludeNameRe(nm))\n : undefined\n const usesPrelude = (src: string): boolean =>\n !!preludeRes && preludeRes.some((re) => re.test(src))\n /**\n * `fx` 工厂体化:表达式引用 prelude 变量时把 prelude 注入工厂体再 `return`。\n *\n * ⚠️ 必须写成**块体**(`{ prelude; return (expr) }`)而不是默认参数或逗号表达式 ——\n * prelude 是多语句声明序列(`const` 必须处于块作用域),且事件点形态\n * `() => navigator.clipboard?.writeText(svgName)` 需要靠这层块作用域让内层箭头\n * **闭包捕获** `svgName`(否则点击时同样 ReferenceError)。\n * 未引用 prelude 的工厂保持原样(单表达式箭头),不引入多余块作用域。\n */\n const fxOf = (sig: string, body: string): string =>\n usesPrelude(body) ? `${sig} => { ${prelude}\\nreturn (${body}) }` : `${sig} => (${body})`\n for (const up of ups) {\n if (up.isEvent || up.isRef || up.isRefAttr) {\n const inst = inlineVal(up.varIndex)\n if (inst == null) {\n usedGet = true\n fx.push('() => undefined')\n } else fx.push(fxOf(fxSig, inst))\n continue\n }\n const inlined = inlineVal(up.varIndex)\n if (inlined == null) usedGet = true\n const value = inlined ?? `${P_GET}(${up.varIndex})`\n if (up.isDirective) {\n fx.push(inlined == null ? '() => undefined' : fxOf(fxSig, value))\n if (inlined != null) stmts.push(dirStmtVal(up, lA(n), value, `${L_OLD}[${n}]`, writers))\n n++\n continue\n }\n if (up.isProp) fx.push(inlined == null ? '() => undefined' : fxOf(fxSig, value))\n // 值点:fx 占位;值由合并 effect 首次 run 写入\n else fx.push('() => undefined')\n if (inlined == null) {\n n++\n continue\n }\n const p = buildPoint(up, lA(n), `${L_OLD}[${n}]`, writers)\n if (p === undefined) {\n n++\n continue\n }\n stmts.push(\n `const ${lA(n)} = ${value}; if (${p.guard} || rc.__f) { ${p.write(lA(n), p.node!)}; ${p.store(\n lA(n),\n `${L_OLD}[${n}]`,\n )} }`,\n )\n n++\n }\n const pe = stmts.length\n ? `[${peSig} => () => { ${prelude ? prelude + '\\n' : ''}${stmts.join(' ')} }]`\n : '[]'\n return { arrayExpr: pe, fxExpr: `[${fx.join(',')}]`, usedGet, writers }\n}\n\n/**\n * 把一个 UpOut 拆成「守卫 + 写」;形态无法静态化时返回 undefined(该点不生成 effect)。\n * @param value 取值表达式\n * @param old 旧值记号:主模板为闭包标量 `ov`,子模板为该点槽位 `ov[n]`\n */\nfunction buildPoint(up: UpOut, value: string, old: string, writers: WriterSet): Point | undefined {\n const node = `nodes[${up.nodeSn}]`\n const store = (v: string, o: string) => `${o} = ${v}`\n\n // 模块级写入器(纯 DOM 写,emit 成自由函数调用;见 RC_INTERNAL 上方说明)\n const w = (name: string, write: (v: string, nd: string) => string) => {\n writers.add(name)\n return write\n }\n\n // 本函数**只处理非指令点**。指令点在两个调用方(generateRenderEffect /\n // generateSubInlinedEffect)里都已先行 `continue`:结构指令走 dirEntryOf 选定的\n // exec*/TAG 位指令走各自的内联 emit,两处都带完整 DirectiveInstance。\n //\n // 这里早前还留着一份指令分支(forEach/if*/show/bind/classes/styles…),已经不可达,\n // 且 emit 的是**过期的 4 参形态** `execDir(rc, nd, v, old)` —— 新签名下 inst 为\n // undefined,运行期首行 `if (!inst) return` 会让该点静默不响应且零报错。\n // 保留它等于埋雷:谁把某个调用方的 continue 去掉,指令就会「安静地坏掉」。\n if (up.isDirective) return undefined\n\n if (up.isText) {\n return {\n guard: `${value} !== ${old}`,\n node,\n write: w(RC_INTERNAL.wText, (v, nd) => `${RC_INTERNAL.wText}(${nd}, ${v})`),\n store,\n }\n }\n if (up.isToggleProp) {\n const attr = stringify(up.attrName!)\n return {\n guard: `(!!${value}) !== ${old}`,\n node,\n write: w(RC_INTERNAL.wToggleProp, (v, nd) => `${RC_INTERNAL.wToggleProp}(${nd}, ${attr}, !!${v})`),\n store,\n }\n }\n if (up.isProp) {\n const attr = stringify(up.attrName!)\n return {\n guard: `${value} !== ${old}`,\n node,\n write: w(RC_INTERNAL.wProp, (v, nd) => `${RC_INTERNAL.wProp}(rc, ${nd}, ${attr}, ${v})`),\n store,\n }\n }\n if (up.attrName != null) {\n // attr(含纯插值与混合模板)\n const name = stringify(up.attrName)\n const tmpl = up.attrTmpl\n const isPure = !!up.isPureTmpl || !tmpl || PLACEHOLDER_ONLY_RE.test(tmpl)\n if (isPure) {\n return { guard: `${value} !== ${old}`, node, write: w(RC_INTERNAL.wAttr, (v, nd) => `${RC_INTERNAL.wAttr}(${nd}, ${name}, ${v})`), store }\n }\n // 混合模板:切分 pre/post\n const m = tmpl!.match(PLACEHOLDER_FIRST_RE)\n if (m) {\n const idx = tmpl!.indexOf(m[0])\n const pre = stringify(tmpl!.slice(0, idx))\n const post = stringify(tmpl!.slice(idx + m[0].length))\n return {\n guard: `${value} !== ${old}`,\n node,\n write: w(RC_INTERNAL.wAttrT, (v, nd) => `${RC_INTERNAL.wAttrT}(${nd}, ${name}, ${pre}, ${post}, ${v})`),\n store,\n }\n }\n return undefined\n }\n return undefined\n}\n","/**\n * 模板属性名归一(编译期)。\n *\n * html 命名空间下,含大写的属性名转为 kebab-case —— 与运行期 html() 指令的\n * convertHTML(compelem/src/directives/Html.ts)同一语义、同一函数(myfx kebabCase),\n * 补齐编译期 h`` 模板对 camelCase prop 写法的支持(如 headerHeight → header-height)。\n * 运行期全链路已支持 kebab 属性名(#initProps 的 kebabCaseCached 查表 /\n * attributeChangedCallback 的 camelCaseCached 反查 / up.attrName → setAttribute)。\n *\n * 明确排除(调用点保证,本函数不管):\n * - 事件名(@ev):事件名是全小写单词(scroll / contextmenuselect / cellactive…),\n * 旧 toLowerCase 行为正好匹配,kebab 化反而破坏 —— 事件走 lowerName;\n * - *refAttr:自带 :camel/:kebab/:snake 显式格式控制;\n * - `.prop` 绑定:直接写 JS 属性,大小写天然保留。\n *\n * ⚠️ **kebab 只对自定义/组件标签生效**(2026-10-22 审查 C-5)。\n *\n * 理由:kebab 化的目的只有一个 —— 让 CompElem 的 camelCase **prop** 能通过\n * attribute 写(`headerHeight` → `header-height`,运行期 `kebabCaseCached` 反查回 prop)。\n * 原生标签没有这种 prop 通道,浏览器认的属性名是小写:`maxLength` 被 kebab 成\n * `max-length`、`tabIndex` → `tab-index` 之后**属性直接失效且零诊断** ——\n * 用户按 DOM property 习惯写(React 式)必然踩。原生标签回落 `toLowerCase()`\n * 至少能让 `colSpan` → `colspan`、`readOnly` → `readonly` 正确落地。\n *\n * `tagLower` 缺省时按\"组件标签\"处理(保持旧行为,兼容尚未补传的调用点)。\n */\nimport { kebabCase } from 'myfx'\n\nexport function normalizeAttrName(\n ns: 'html' | 'svg',\n name: string,\n tagLower?: string,\n knownTags?: { has(name: string): boolean },\n): string {\n if (ns !== 'html') return name\n // 无大写:与旧 toLowerCase 行为恒等(产物零 diff),快速返回\n if (!/[A-Z]/.test(name)) return name\n const custom =\n tagLower === undefined ? true : !!knownTags?.has(tagLower) || tagLower.includes('-') || tagLower === 'slot'\n return custom ? kebabCase(name) : name.toLowerCase()\n}\n","/**\r\n * innerHTML 快路径序列化(模板树 → HTML 串)。\r\n *\r\n * 生成的 buildTemplate 改为:`template.innerHTML = \"<html>\"` 一次性建树,\r\n * 再由通用 split/collect walk 编号(见 template-dom.ts 的 WALK)。\r\n * 纯编译期逻辑;DOM 契约与 createElement 路径等价是硬前提——\r\n * 任何 HTML 树构造会重构/搬迁/丢弃的结构都必须走回退路径。\r\n *\r\n * 等价性来源(与 createElement 路径逐项对照):\r\n * - 文本:序列化转义 `&`/`<`(script/style 不转义)→ 解析期实体解码 → 还原原文;\r\n * `\\r` 会被预处理归一为 `\\n` → 含 CR 的文本/属性一律回退。\r\n * - 属性:静态属性按源顺序写入 → setAttribute 同序同值;动态/事件/ref/slot-props\r\n * 属性不写入(不 setAttribute)。属性值源码禁实体(parse 约束)→ 转义往返无损。\r\n * - 注释:原样往返(会破坏往返的写法回退);注释不计 nodeSn(walk 跳过)。\r\n * - nodeSn:walk 按文档序(元素先入列再入子)编号,与 codegen 的\r\n * emitElement/emitText 序号严格一致——这是回退判定保守的根本原因。\r\n */\r\nimport { PLACEHOLDER_FIRST_RE, VOID_TAGS, type TAttr, type TElement, type TNode } from '../analyze/template-tree'\r\nimport { normalizeAttrName } from './attr-name'\r\n\r\n/** HTML 树构造会重构/搬迁/丢弃的标签——出现即回退 createElement 路径。 */\r\nconst HARD_UNSAFE = new Set([\r\n // 表格族:隐式 tbody/colgroup 包装、foster parenting\r\n 'table', 'tbody', 'thead', 'tfoot', 'tr', 'td', 'th', 'col', 'colgroup', 'caption',\r\n // 模板内容搬进 .content;noscript 受 scripting 标志影响\r\n 'template', 'noscript',\r\n // 文档级上下文标签\r\n 'html', 'head', 'body', 'frameset', 'frame', 'plaintext',\r\n // xmp 内容按纯文本解析(元素子级会变文本)\r\n 'xmp',\r\n])\r\n\r\n/** `<p>` 的起始标签会隐式关闭 p 的元素集合(HTML \"in body\" 规则)。 */\r\nconst P_BLOCK_CLOSE = new Set([\r\n 'address', 'article', 'aside', 'blockquote', 'center', 'details', 'dialog', 'dir',\r\n 'div', 'dl', 'dt', 'dd', 'fieldset', 'figcaption', 'figure', 'footer', 'form',\r\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hgroup', 'hr', 'li', 'main',\r\n 'menu', 'nav', 'ol', 'p', 'pre', 'section', 'summary', 'table', 'ul', 'xmp',\r\n 'listing', 'plaintext',\r\n])\r\n\r\n/** li/dd/dt 起始标签回溯时的终止集(special 但非 div/p/address → 直接插入,安全)。 */\r\nconst CHAIN_SAFE_STOP = new Set([\r\n 'html', 'body', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl',\r\n 'pre', 'listing', 'blockquote', 'fieldset', 'table', 'button', 'hr', 'xmp',\r\n 'article', 'aside', 'details', 'dialog', 'dir', 'footer', 'header', 'hgroup',\r\n 'main', 'menu', 'nav', 'section', 'figure', 'figcaption', 'center', 'plaintext',\r\n])\r\n\r\n/** script/style/textarea/title:子级必须纯文本(元素/注释子级会被解析成文本)。 */\r\nconst RAWTEXT_TAGS = new Set(['script', 'style', 'textarea', 'title'])\r\n\r\n/** select 在 \"in select\" 模式下会忽略的元素子级(除白名单外)。 */\r\nconst SELECT_CHILDREN_OK = new Set(['option', 'optgroup', 'hr', 'script'])\r\n\r\nconst H_SET = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])\r\n\r\nfunction hasVar(s: string): boolean {\r\n return PLACEHOLDER_FIRST_RE.test(s)\r\n}\r\n\r\n/**\r\n * 模板树能否安全走 innerHTML 路径(保守判定:任何不确定 → false 回退)。\r\n */\r\nexport function canUseInnerHTML(root: TNode[]): boolean {\r\n return checkNodes(root, [])\r\n}\r\n\r\nfunction checkNodes(nodes: TNode[], chain: TElement[]): boolean {\r\n for (const nd of nodes) {\r\n if (nd.type === 'text') {\r\n if (nd.raw.includes('\\r')) return false\r\n continue\r\n }\r\n if (nd.type === 'comment') {\r\n if (nd.text.includes('\\r')) return false\r\n if (nd.text.includes('--') || nd.text.startsWith('>') || nd.text.startsWith('->') || nd.text.endsWith('-')) {\r\n return false\r\n }\r\n continue\r\n }\r\n if (!checkElement(nd, chain)) return false\r\n }\r\n return true\r\n}\r\n\r\nfunction checkElement(el: TElement, chain: TElement[]): boolean {\r\n const t = el.tag.toLowerCase()\r\n if (HARD_UNSAFE.has(t)) return false\r\n if (!/^[a-zA-Z]/.test(el.tag)) return false\r\n // HTML 上下文专属(foreign content 无隐式闭合/adoption agency)\r\n if (t === 'image' && el.ns === 'html') return false\r\n\r\n for (const a of el.attrs) {\r\n if (a.value != null && a.value.includes('\\r')) return false\r\n }\r\n\r\n // rawtext/RCDATA:子级必须纯文本;textarea 首行 \\n 被解析器剥离\r\n if (RAWTEXT_TAGS.has(t)) {\r\n for (const c of el.children) {\r\n if (c.type !== 'text') return false\r\n if (c.raw.includes('\\r')) return false\r\n }\r\n if (t === 'textarea' && el.children[0]?.type === 'text' && el.children[0].raw.startsWith('\\n')) {\r\n return false\r\n }\r\n return checkNodes(el.children, [...chain, el])\r\n }\r\n\r\n // pre/listing 首行 \\n 被解析器剥离(createElement 不会)\r\n if ((t === 'pre' || t === 'listing') && el.children[0]?.type === 'text' && el.children[0].raw.startsWith('\\n')) {\r\n return false\r\n }\r\n\r\n if (el.ns === 'html') {\r\n // 祖先链禁令:a/form/button 嵌套自身、h* 嵌套 h*(adoption agency / 隐式闭合)\r\n if (t === 'a' || t === 'form' || t === 'button') {\r\n for (const p of chain) if (p.ns === 'html' && p.tag.toLowerCase() === t) return false\r\n }\r\n if (H_SET.has(t)) {\r\n for (const p of chain) if (p.ns === 'html' && H_SET.has(p.tag.toLowerCase())) return false\r\n }\r\n\r\n // li/dd/dt 起始标签的隐式闭合回溯(祖先链上命中同族 → 重构)\r\n if (t === 'li' && chainHits(chain, new Set(['li']))) return false\r\n if ((t === 'dd' || t === 'dt') && chainHits(chain, new Set(['dd', 'dt']))) return false\r\n\r\n // option/optgroup 嵌套:内层成为兄弟(option 内容仅纯文本)\r\n if (t === 'option' || t === 'optgroup') {\r\n for (const c of el.children) {\r\n if (c.type === 'element') {\r\n if (t === 'option') return false\r\n const ct = c.tag.toLowerCase()\r\n if (ct !== 'option' && ct !== 'optgroup') return false\r\n }\r\n }\r\n const parent = chain.length ? chain[chain.length - 1] : null\r\n if (parent && parent.ns === 'html') {\r\n const pt = parent.tag.toLowerCase()\r\n if (t === 'option' && pt === 'option') return false\r\n if (t === 'optgroup' && pt === 'optgroup') return false\r\n }\r\n }\r\n\r\n // p 子树含会关闭 p 的元素 → 隐式闭合重构\r\n if (t === 'p' && subtreeHas(el.children, P_BLOCK_CLOSE)) return false\r\n\r\n // select 子级白名单(其余在 \"in select\" 模式下被直接忽略)\r\n if (t === 'select') {\r\n for (const c of el.children) {\r\n if (c.type === 'element' && !SELECT_CHILDREN_OK.has(c.tag.toLowerCase())) return false\r\n if (c.type === 'comment') return false\r\n }\r\n }\r\n }\r\n\r\n return checkNodes(el.children, [...chain, el])\r\n}\r\n\r\n/**\r\n * li/dd/dt 起始标签的回溯判定(祖先链由外到内):从最近祖先向上,\r\n * 命中目标 → true(重构,不安全);命中终止集 → false(直接插入,安全);到根 → false。\r\n */\r\nfunction chainHits(chain: TElement[], targets: Set<string>): boolean {\r\n for (let i = chain.length - 1; i >= 0; i--) {\r\n const el = chain[i]\r\n if (el.ns !== 'html') continue\r\n const t = el.tag.toLowerCase()\r\n if (targets.has(t)) return true\r\n if (CHAIN_SAFE_STOP.has(t)) return false\r\n }\r\n return false\r\n}\r\n\r\nfunction subtreeHas(nodes: TNode[], set: Set<string>): boolean {\r\n for (const nd of nodes) {\r\n if (nd.type === 'element' && nd.ns === 'html') {\r\n if (set.has(nd.tag.toLowerCase())) return true\r\n if (subtreeHas(nd.children, set)) return true\r\n }\r\n }\r\n return false\r\n}\r\n\r\n/** 序列化可写入 HTML 的静态属性(与 emitAttr 静态分支同口径)。 */\r\nfunction seriableAttr(a: TAttr): boolean {\r\n const name = a.name\r\n if (name === 'slot-props' || name === 'ref') return false\r\n if (name[0] === '.' || name[0] === '?' || name[0] === '*' || name[0] === '@') return false\r\n if (hasVar(name)) return false\r\n if (a.value != null && hasVar(a.value)) return false\r\n return true\r\n}\r\n\r\nfunction escText(s: string): string {\r\n return s.replace(/&/g, '&').replace(/</g, '<')\r\n}\r\n\r\nfunction escAttr(s: string): string {\r\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/\"/g, '"')\r\n}\r\n\r\n\r\n/** script/style 文本不转义(rawtext 内不可能含 `<`——源解析器在此截断)。 */\r\nfunction isRawtextTag(tag: string): boolean {\r\n const t = tag.toLowerCase()\r\n return t === 'script' || t === 'style'\r\n}\r\n\r\n/**\r\n * 模板树 → innerHTML 串。仅在 canUseInnerHTML(root) 为 true 时调用。\r\n * 属性按源顺序输出(DOM attr 插入序一致);动态属性省略(不写)。\r\n */\r\nexport function serializeTemplateHTML(root: TNode[]): string {\r\n let out = ''\r\n for (const nd of root) out += serNode(nd, null)\r\n return out\r\n}\r\n\r\nfunction serNode(nd: TNode, parent: TElement | null): string {\r\n if (nd.type === 'text') {\r\n return parent && isRawtextTag(parent.tag) ? nd.raw : escText(nd.raw)\r\n }\r\n if (nd.type === 'comment') return `<!--${nd.text}-->`\r\n return serElement(nd)\r\n}\r\n\r\nfunction serElement(el: TElement): string {\r\n let attrs = ''\r\n for (const a of el.attrs) {\r\n if (!seriableAttr(a)) continue\r\n // 与 createElement 路径同规则归一属性名(camelCase → kebab,svg 保留),\r\n // 否则 innerHTML 解析器小写化会把驼峰名变成既不匹配 prop 观测、也不匹配\r\n // createElement 路径产物的第三种形态\r\n const name = normalizeAttrName(el.ns, a.name, el.tag.toLowerCase())\r\n attrs += a.value == null ? ` ${name}` : ` ${name}=\"${escAttr(a.value)}\"`\r\n }\r\n const open = `<${el.tag}${attrs}>`\r\n if (VOID_TAGS.has(el.tag.toLowerCase())) return open\r\n let inner = ''\r\n for (const c of el.children) inner += serNode(c, el)\r\n return `${open}${inner}</${el.tag}>`\r\n}\r\n","/**\n * buildTemplate codegen:模板节点树 IR → 生成的 DOM 构建函数源码。\n *\n * 生成物形态(docs/TEMPLATE-CODEGEN.md §2)——两条路径:\n *\n * 1. **innerHTML 快路径(默认,canUseInnerHTML 判定)**:\n * 编译期把树序列化为 HTML 串(template-html.ts),运行时\n * `template.innerHTML = \"...\"` 一次性建树,再由通用 walk 文档序收集 nodes\n * 并对变量文本做 split(对齐 emitText 的 trim/丢空语义)。body 只含\n * ee/tc 行 + walk + ups 字面量——无逐点 createElement。\n * 2. **createElement 路径(风险树回退 / forceCreate)**:\n * `const d = document; const f = d.createDocumentFragment(); ...`\n * 逐点 createElement / createTextNode / appendChild / ee[sn] = [...]。\n *\n * 两路径的 nodeSn 编号、ups、emptyEvents、nodes 顺序完全一致(契约不变)。\n *\n * - **零依赖**:只用 document 全局与字面量,不 import compelem 内部类。\n * - 以普通函数生成,运行时以 `buildTemplate.call(首实例)` 调用 —— `this` 用于\n * 首实例求值(首实例冻结语义)。\n * - nodeSn 由生成器在输出树上按文档序静态编号(元素 + 文本;注释不计号,\n * 即 SHOW_ELEMENT|SHOW_TEXT 过滤)。\n * - `nodes` 与 nodeSn 同步 push(创建即入列,父先于子),运行时可 O(1) 取\n * `nodes[sn]`,免去 cloneNode + collectNodes 回扫。\n * - `ups` 为 body 末尾一次性字面量(免逐点 `ups.push` 调用)。\n * - varIndex 为 upm 序。\n */\nimport { COMpelem_DIRECTIVES } from '../analyze/render-body'\nimport { normalizeAttrName } from './attr-name'\nimport { varsByUpIndex, type TemplateVarInfo } from '../analyze/template-extract'\nimport {\n PLACEHOLDER,\n PLACEHOLDER_ONLY_RE,\n SVG_NS,\n WS_SENSITIVE_TAGS,\n parseTemplateTree,\n splitParts,\n TemplateParseError,\n type TAttr,\n type TElement,\n type TNode,\n type TText,\n type TVarPart,\n} from '../analyze/template-tree'\nimport { camelCase, kebabCase, snakeCase } from 'myfx'\nimport { isCustomTag, stringify } from '../utils/ast'\nimport { canUseInnerHTML, serializeTemplateHTML } from './template-html'\n\nconst BUILTIN_DIRECTIVES = COMpelem_DIRECTIVES\n\nexport interface CodegenOptions {\n className: string\n /** 已注册 CompElem 标签(小写)—— SLOT 判定与 prop 位置校验 */\n knownTags: Set<string>\n /** 强制 createElement 路径(默认走 innerHTML 快路径,风险树自动回退) */\n forceCreate?: boolean\n}\n\nexport interface CodegenResult {\n /** 生成函数源码(`function() {...}`);errors 非空时为 null */\n code: string | null\n errors: string[]\n /** 与 ups.push 序一致的描述符数组(供 pointEffects codegen 消费);errors 非空时为 undefined */\n ups?: UpOut[]\n /** nodeSn → 节点名(元素为 tag、文本为 '#text'),与运行时 nodes 数组同序;errors 非空时为 undefined */\n nodeNames?: string[]\n /** 构建路径:html = template.innerHTML 一次性建树;create = 逐点 createElement(风险回退) */\n mode?: 'create' | 'html'\n}\n\n\n/** 生成的 UpdatePoint 描述符(与运行时 UpdatePointMeta 字段同构)。 */\nexport interface UpOut {\n varIndex: number\n nodeSn: number\n slotNodeSn?: number\n /**\n * 本 up 在 `ups` 数组里的下标 —— **运行时需要**。\n *\n * `renderTemplate` 是按「node × 该 node 的 upms」遍历的,不是线性扫 `ups`,\n * 所以要拿到某个 up 在 `fx`(与 ups 1:1 的工厂数组)里的位置,必须显式带索引。\n * Q2 若把元数据整体挂到工厂上,这个字段会被 `ups: [{ pe }]` 的精简形态取代。\n */\n ux?: number\n attrName?: string\n attrTmpl?: string\n isPureTmpl?: boolean\n isText?: boolean\n isDirective?: boolean\n directiveType?: string\n /** 指令真名(forEach/ifTrue/show/...)。directiveType 只是锚点类型(text|slot),\n * 不能用来判断指令种类——之前 render-effect 正是因此把所有结构指令都判成未知。 */\n directiveName?: string\n isProp?: boolean\n isToggleProp?: boolean\n isEvent?: boolean\n isRef?: boolean\n isRefAttr?: boolean\n /** TAG 指令的 this 链全前缀路径(运行时 varChain 空时回退) */\n directiveVarChain?: string[]\n}\n\ninterface Ctx {\n L: string[]\n nodeSn: number\n varIndex: number\n tmp: number\n slotStack: number[]\n errors: string[]\n vars: TemplateVarInfo[]\n opts: CodegenOptions\n /** 与 ups.push 同序的描述符收集(供 pointEffects codegen) */\n ups: UpOut[]\n /** nodeSn → 节点名(下标 = sn,与 nodes 数组同序) */\n nodeNames: string[]\n /** innerHTML 快路径(序列化进 HTML 串,body 只发射 ee/tc 行与 walk) */\n html: boolean\n /**\n * nodeSn → 从 fragment 根到该节点的 childNodes 下标链(编译期静态计算)。\n *\n * html 与 create 两条建树路径的**最终** DOM 结构一致,故路径唯一:html 快路径的\n * 文本占位符拆分(walkSplitText)产出的分段数,与 emitText 的 nodeSn 分配严格一一对应。\n * 只有 `needed` 集合里的路径会进产物(其余编译期丢弃,避免产物膨胀)。\n */\n paths: Map<number, number[]>\n /**\n * 运行时 renderTemplate 需**逐点访问**的 nodeSn(A+B):有 up 的节点、有 emptyEvents\n * 的节点、CompElem / `<slot>` 结构节点、被 up 引用的 slotNodeSn。\n * 产物里发射为同序的 `updateSns` + `updatePaths`;运行时只遍历它,免去对全部节点做\n * `upmMap[nodeSn]` 查表,也免去对整棵克隆树 collectNodes 回扫。\n */\n needed: Set<number>\n /** var.index(模板序)→ varIndex(ups 序);由 varsByUpIndex 建,见 Ctx 初始化 */\n upIndexOf: Map<number, number>\n}\n\nfunction err(ctx: Ctx, msg: string) {\n ctx.errors.push(`[${ctx.opts.className}] ${msg}`)\n}\n\nfunction lowerName(ctx: Ctx, el: TElement, name: string): string {\n return el.ns === 'html' ? name.toLowerCase() : name\n}\n\nfunction varPartsOf(a: TAttr): TVarPart[] {\n return a.parts.filter((p): p is TVarPart => p.type === 'var')\n}\n\n/** attrTmpl:token 保留 Template 序编号(编号无语义影响)。 */\nfunction attrTmplOf(a: TAttr): string {\n return a.parts.map(p => (p.type === 'static' ? p.text : PLACEHOLDER + p.index)).join('')\n}\n\nexport function generateBuildTemplate(\n root: TNode[],\n vars: TemplateVarInfo[],\n opts: CodegenOptions,\n): CodegenResult {\n // `${html(CONST)}` 静态 HTML 常量:先改树,再决定建树路径。\n // 顺序不能反 —— canUseInnerHTML / serializeTemplateHTML 都读这棵树,\n // 片段必须在它们看到之前就已经是树的一部分(见 inlineStaticFragments 的两条理由)。\n const fragRes = inlineStaticFragments(root, vars)\n if (fragRes.errors.length) {\n return { code: null, errors: fragRes.errors.map((m) => `[${opts.className}] ${m}`) }\n }\n const html = !opts.forceCreate && canUseInnerHTML(root)\n const upsVars = varsByUpIndex(vars)\n const upIndexOf = new Map<number, number>()\n for (let i = 0; i < upsVars.length; i++) upIndexOf.set(upsVars[i].index, i)\n const ctx: Ctx = {\n L: [],\n nodeSn: 0,\n varIndex: 0,\n tmp: 0,\n slotStack: [],\n errors: [],\n vars,\n opts,\n ups: [],\n nodeNames: [],\n html,\n paths: new Map(),\n needed: new Set(),\n upIndexOf,\n }\n\n const rootPath: number[] = []\n const rootSib = { i: 0 }\n for (const nd of root) emitNode(ctx, nd, 'f', rootPath, rootSib)\n\n // 不变式自检:**每个非片段 var 恰好产生一个 up,且 varIndex ≡ ups 下标**。\n // 这条是 compile.ts / build-vars 取值表达式的对齐依据(varIndex 空间 = ups 序);\n // 一旦被打破,varIndex 会解到别的 var 上(取值错 + 读不到信号),故此处直接报错,\n // 不让错位流到产物里。\n // 已经有具体 codegen 错误时不再追加“不变量自检”噪声(例如属性位误用指令)。\n if (!ctx.errors.length) {\n if (ctx.varIndex !== ctx.ups.length || ctx.ups.some((u, i) => u.varIndex !== i)) {\n ctx.errors.push(\n `[${opts.className}] varIndex 空间错位(varIndex 计数 ${ctx.varIndex} / ups ${ctx.ups.length})`,\n )\n } else if (upsVars.length !== ctx.ups.length) {\n ctx.errors.push(\n `[${opts.className}] 插值槽与更新点数量不一致(插值 ${upsVars.length} / 更新点 ${ctx.ups.length})`,\n )\n }\n }\n\n if (ctx.errors.length) return { code: null, errors: ctx.errors }\n\n // U3:ups 收集完毕后一次性字面量折叠\n const upsFields = ctx.ups.map(serializeUp)\n // A+B:按「需访问的 nodeSn 升序」发射 updateSns + 同序 updatePaths(运行时 resolvePath 解析)。\n const sns = [...ctx.needed].sort((a, b) => a - b)\n const updateSnsField = `const updateSns = [${sns.join(', ')}];`\n const updatePathsField = `const updatePaths = [${sns.map(sn => `[${(ctx.paths.get(sn) ?? []).join(', ')}]`).join(', ')}];`\n const bodyLines = [...ctx.L]\n if (html) bodyLines.push(...WALK_LINES)\n bodyLines.push(`const ups = [${upsFields.join(', ')}];`)\n bodyLines.push(updateSnsField)\n bodyLines.push(updatePathsField)\n const body = bodyLines.map(l => ' ' + l).join('\\n')\n //U6:document 别名提升到函数头(每实例一次,节点创建免全局对象属性链查找)\n const ret = ` return { fragment: f, ups: ups, emptyEvents: ee, nodes: nodes, updateSns: updateSns, updatePaths: updatePaths };\\n}`\n const code = html\n ? `function() {\n const d = document;\n const t = d.createElement('template');\n t.innerHTML = ${stringify(serializeTemplateHTML(root))};\n const f = t.content;\n const ee = {};\n const nodes = [];\n${body}\n${ret}`\n : `function() {\n const d = document;\n const f = d.createDocumentFragment();\n const ee = {};\n const nodes = [];\n${body}\n${ret}`\n return { code, errors: [], ups: ctx.ups, nodeNames: ctx.nodeNames, mode: html ? 'html' : 'create' }\n}\n\n/**\n * innerHTML 快路径的文本拆分 + 文档序收集。\n *\n * 这段约 1.2 KB 的自包含 walk 若**逐模板内联**生成(主模板 + 每个子模板各一份),\n * 是产物体积最大的单项浪费(实测 10 组件 × 3 子模板 = 20 份完全相同、minifier 无法去重的\n * 函数体,合计占产物 34.5%)。故提到运行时 `render.ts` 的 `walkSplitText`,\n * 产物只剩一行调用。\n *\n * `buildTemplate` / `subViews[id].buildTemplate` 均以 `.call(component)` 调用,\n * 故 `this` 恒为组件实例,用实例方法 `_ceWalkSplit` 转发,产物无需引入自由标识符。\n *\n * ⚠️ 位置敏感:walk 必须排在 `ups` 字面量折叠之前、且 push 序与编译期分配的 `nodeSn`\n * 严格一一对应(这是 `canUseInnerHTML` 保守性的依据)。改动请勿调整调用位置。\n */\nconst WALK_LINES: string[] = ['this._ceWalkSplit(f, nodes);']\n\n// ---------- 节点发射 ----------\n\nfunction emitNode(\n ctx: Ctx,\n nd: TNode,\n parentVar: string,\n parentPath: number[],\n sib: { i: number },\n parentTag?: string,\n) {\n if (nd.type === 'element') emitElement(ctx, nd, parentVar, parentPath, sib)\n else if (nd.type === 'text') emitText(ctx, nd, parentVar, parentPath, sib, parentTag)\n else emitComment(ctx, nd, parentVar, parentPath, sib)\n}\n\n/**\n * `${html(CONST)}` 静态 HTML 常量:把该串**解析成节点、就地拼进建树前的模板树**。\n *\n * ## 为什么是「改树」而不是「在运行期 splice」\n * `html` 快路径的产物是 `t.innerHTML = serializeTemplateHTML(root)` —— 序列化的是\n * **树**。若只在运行期 `anchor.before(fragment)`:\n * ① innerHTML 串里没有它 ⇒ 该模式下整块消失;\n * ② `updatePaths`(childNodes 下标链)会因插入的兄弟节点整体错位。\n * 在建树前就成为树的一部分,则 canUseInnerHTML / serializeTemplateHTML / nodeSn /\n * paths / nodes 全部照常派生,**两条建树路径(html / create)自动都正确**。\n *\n * 未命中的常量(跨文件 / 含大写 / 非 const)根本不进这里 —— 它照常是 `html` 指令点,\n * 走运行期 `Html` 指令,语义与折叠路径等价(折叠子集限定为无大写,见 analyze 侧论证)。\n *\n * ## 编号契约\n * 片段节点是普通静态节点(占 nodeSn、进 nodes[]);但它**不占 varIndex、不产生\n * ups / fx / pointEffects** —— 静态串无绑定,运行期无任何事要做。\n * build-vars 同步跳过该 var(两边共用 `fragment` 标记)⇒ `exprs` 与 `ups` 仍 1:1。\n *\n * ## 顺带的文本分裂\n * 含插值的文本节点在这里按 `emitText` 的同一套规则先分裂(静态段 trim、纯空白段丢弃),\n * 使下游 `emitText` 见到的是「无插值」或「单插值」的文本节点 —— 与原路径产生的\n * nodeSn / paths / sib 序列完全一致,空白静态段也照原样丢弃(不会多出空文本节点)。\n *\n * @returns 是否发生了折叠;`errors` 非空时调用方应中止生成。\n */\nfunction inlineStaticFragments(\n root: TNode[],\n vars: TemplateVarInfo[],\n): { folded: boolean; errors: string[] } {\n const errors: string[] = []\n let folded = false\n\n const inlineText = (nd: TText): TNode[] | undefined => {\n if (!nd.parts.some((p: any) => p.type === 'var')) return undefined\n const parts = splitParts(nd.raw.trim())\n const out: TNode[] = []\n let sawFragment = false\n for (const p of parts) {\n if (p.type === 'static') {\n const t = p.text.trim()\n if (!t) continue\n out.push({ type: 'text', raw: t, parts: [{ type: 'static', text: t }] })\n continue\n }\n const frag = vars[p.index]?.fragment\n if (frag !== undefined) {\n sawFragment = true\n try {\n // varCount = 0:静态串内不可能有插值(否则就是模块常量而非 html 实参)\n out.push(...parseTemplateTree(frag, 0).root)\n } catch (e) {\n errors.push(\n `静态 HTML 常量(插值 #${p.index})解析失败:${e instanceof TemplateParseError ? e.message : String(e)}`,\n )\n }\n continue\n }\n out.push({ type: 'text', raw: PLACEHOLDER + p.index, parts: [{ type: 'var', index: p.index }] })\n }\n return sawFragment ? out : undefined\n }\n\n /** 就地替换 children 里的文本节点。返回是否改动。 */\n const walkChildren = (children: TNode[]): boolean => {\n let changed = false\n for (let i = 0; i < children.length; i++) {\n const nd = children[i]\n if (nd.type === 'element') {\n if (walkChildren(nd.children)) changed = true\n continue\n }\n if (nd.type !== 'text') continue\n const rep = inlineText(nd)\n if (!rep) continue\n children.splice(i, 1, ...rep)\n i += rep.length - 1\n changed = true\n }\n return changed\n }\n\n folded = walkChildren(root)\n return { folded, errors }\n}\n\nfunction emitComment(ctx: Ctx, nd: { type: 'comment'; text: string }, parentVar: string, _parentPath: number[], sib: { i: number }) {\n // 注释不计 nodeSn、不入 nodes(按元素/文本过滤),但**占一个 childNodes 位**\n // (html 串里保留 → 解析后仍在原位;create 路径同样 appendChild 一个注释节点)\n sib.i++\n // html 模式:注释已序列化进 HTML 串,无需创建行(parentVar 未用)\n if (ctx.html) return\n ctx.L.push(`${parentVar}.appendChild(d.createComment(${stringify(nd.text)}));`)\n}\n\nfunction emitElement(ctx: Ctx, el: TElement, parentVar: string, parentPath: number[], sib: { i: number }) {\n const idx = sib.i\n sib.i = idx + 1\n const sn = ctx.nodeSn++\n ctx.nodeNames.push(el.tag)\n const myPath = parentPath.concat(idx)\n ctx.paths.set(sn, myPath)\n\n // isCompElemNode 判定先于属性处理 → CompElem 自身的属性 up 也带 slotNodeSn(=自身 nodeSn)\n // C3:自定义元素名恒含 `-`——跨包标签(本文件 knownTags 未登记但运行时已注册)的\n // 子插值同样是 slot 内容,slotStack 必须 push,否则其内 `${slot(...)}` 锚不到本节点、\n // 与 template-rules 的 slot 位判定不一致(跨包 E-DIRECTIVE-SCOPE 误报即源于此)。\n const isComp = isCustomTag(el.tag.toLowerCase(), ctx.opts.knownTags)\n if (isComp) ctx.slotStack.push(sn)\n // B:CompElem / `<slot>` / 跨包自定义元素需在渲染期注册 wrapper / 绑定插槽 ——\n // 即使该节点没有任何 up;多余命中由运行时的 isCompElemNode 过滤。\n if (isComp) ctx.needed.add(sn)\n\n const childSib = { i: 0 }\n if (ctx.html) {\n // 元素已在 HTML 串中:只走编号/属性 up 收集,不发射创建与 append 行\n for (const a of el.attrs) emitAttr(ctx, el, a, sn, '')\n for (const c of el.children) emitNode(ctx, c, parentVar, myPath, childSib, el.tag.toLowerCase())\n if (isComp) ctx.slotStack.pop()\n return\n }\n\n const v = `n${ctx.tmp++}`\n const create =\n el.ns === 'svg'\n ? `d.createElementNS(${stringify(SVG_NS)}, ${stringify(el.tag)})`\n : `d.createElement(${stringify(el.tag)})`\n ctx.L.push(`const ${v} = ${create};`)\n ctx.L.push(`nodes.push(${v});`)\n\n for (const a of el.attrs) emitAttr(ctx, el, a, sn, v)\n\n ctx.L.push(`${parentVar}.appendChild(${v});`)\n\n for (const c of el.children) emitNode(ctx, c, v, myPath, childSib, el.tag.toLowerCase())\n if (isComp) ctx.slotStack.pop()\n}\n\nfunction emitText(\n ctx: Ctx,\n nd: { type: 'text'; raw: string; parts: any[] },\n parentVar: string,\n parentPath: number[],\n sib: { i: number },\n parentTag?: string,\n) {\n const hasVar = nd.parts.some((p: any) => p.type === 'var')\n\n // 无插值:原样保留(含纯空白;parts<2 → 原样保留但占号)\n if (!hasVar) {\n const sn = ctx.nodeSn++\n ctx.nodeNames.push('#text')\n ctx.paths.set(sn, parentPath.concat(sib.i++))\n if (ctx.html) return\n const v = `n${ctx.tmp++}`\n ctx.L.push(`const ${v} = d.createTextNode(${stringify(nd.raw)});`)\n ctx.L.push(`nodes.push(${v});`)\n ctx.L.push(`${parentVar}.appendChild(${v});`)\n return\n }\n\n // 有插值:整体 trim 后分裂(静态片段 trim、空白片段丢弃、占位符为空文本节点)。\n // 每个分段占一个 childNodes 位;分段数与运行时 walkSplitText 严格一致(见 canUseInnerHTML 契约)。\n //\n // ⚠️ rawtext 系 / `<pre>` 下**不能 trim**(2026-10-22 审查 C-7):那里的空白与换行\n // 就是内容本身。此前无条件 trim ⇒ `h`<pre>\\n line1\\n ${n}\\n line3\\n</pre>`` 的\n // 缩进换行全丢(产物只剩 \"line1\" / \"\" / \"line3\"),而 parse 阶段的 prune 明写\n // \"rawtext 系空白是真内容、一律不动\" —— 两个阶段口径必须一致。\n const preserveWs = !!parentTag && WS_SENSITIVE_TAGS.has(parentTag)\n let whole = preserveWs ? nd.raw : nd.raw.trim()\n if (preserveWs) {\n // HTML 解析器在 <pre>/<textarea> 起始标签后会吃掉**一个**换行;\n // create 路径没有解析器,这里手动对齐,保证两条建树路径产物一致。\n if (whole.startsWith('\\r\\n')) whole = whole.slice(2)\n else if (whole.startsWith('\\n')) whole = whole.slice(1)\n }\n const parts = splitParts(whole)\n\n for (const p of parts) {\n if (p.type === 'static') {\n const t = preserveWs ? p.text : p.text.trim()\n if (!t) continue\n const sn = ctx.nodeSn++\n ctx.nodeNames.push('#text')\n ctx.paths.set(sn, parentPath.concat(sib.i++))\n if (ctx.html) continue\n const v = `n${ctx.tmp++}`\n ctx.L.push(`const ${v} = d.createTextNode(${stringify(t)});`)\n ctx.L.push(`nodes.push(${v});`)\n ctx.L.push(`${parentVar}.appendChild(${v});`)\n continue\n }\n // 占位符\n const sn = ctx.nodeSn++\n ctx.nodeNames.push('#text')\n ctx.paths.set(sn, parentPath.concat(sib.i++))\n if (!ctx.html) {\n const v = `n${ctx.tmp++}`\n ctx.L.push(`const ${v} = d.createTextNode('');`)\n ctx.L.push(`nodes.push(${v});`)\n ctx.L.push(`${parentVar}.appendChild(${v});`)\n }\n const info = ctx.vars[p.index]\n if (!info) {\n err(ctx, `插值槽 #${p.index} 未声明(内部错误)`)\n continue\n }\n const up: UpOut = { varIndex: ctx.varIndex++, nodeSn: sn, isText: true }\n if (info.isDirectiveCall) {\n up.isDirective = true\n // directiveType 必须与运行时 EnterPointType 枚举值一致(小写)\n up.directiveType = ctx.slotStack.length ? 'slot' : 'text'\n // 指令真名单独记录:directiveType 只是锚点类型,render-effect 需要真名来分派\n up.directiveName = info.directiveName\n if (ctx.slotStack.length) up.slotNodeSn = ctx.slotStack[ctx.slotStack.length - 1]\n }\n pushUp(ctx, up)\n }\n}\n\n// ---------- 属性发射(判定顺序见 CODEGEN §3.2) ----------\n\nfunction emitAttr(ctx: Ctx, el: TElement, a: TAttr, sn: number, elVar: string) {\n const name = a.name\n const vps = varPartsOf(a)\n\n // 1. 标签位指令(属性名整体为占位符)\n const tok = PLACEHOLDER_ONLY_RE.exec(name)\n if (tok) {\n const info = ctx.vars[+tok[1]]\n if (!info) { err(ctx, `插值槽 #${tok[1]} 未声明`); return }\n if (!info.isDirectiveCall) {\n // 自定义指令(directive() 工厂产物):callee 是模块绑定的函数调用,extract 已记 moduleBindingName。\n // 若连模块绑定都不是(如表达式非直接 Identifier 调用),按字面量形态兜底放行 identifier(...)。\n if (!info.moduleBindingName && !/^[A-Za-z_$][\\w$]*\\s*\\(/.test(info.exprSource.trim())) {\n err(ctx, `标签位插值 \\${${info.exprSource}} 必须是指令调用(bind/show/classes/styles/model 等),` +\n `否则运行时 varIndex 将错位`)\n return\n }\n }\n const up: UpOut = { varIndex: ctx.varIndex++, nodeSn: sn, isDirective: true, directiveType: 'tag' }\n // directiveName 是 render-effect 判分派/结构性的唯一依据,缺了它 TAG 位指令会退化成\n // `rc._execDir(\"\", …)`,且在**子模板**里 isStructural 判定恒假 → 该点不生成任何语句。\n if (info.directiveName) up.directiveName = info.directiveName\n else if (info.moduleBindingName) up.directiveName = info.moduleBindingName\n if (info.directiveVarChain && info.directiveVarChain.length) up.directiveVarChain = info.directiveVarChain\n if (ctx.slotStack.length) up.slotNodeSn = ctx.slotStack[ctx.slotStack.length - 1]\n pushUp(ctx, up)\n return\n }\n\n // 2. slot-props:内部保留属性,忽略\n if (name === 'slot-props') {\n if (vps.length) err(ctx, `slot-props 不允许插值`)\n return\n }\n\n // 3. 事件\n if (name[0] === '@') {\n if (vps.length === 1) {\n const info = ctx.vars[vps[0].index]\n if (info?.isDirectiveCall) {\n err(ctx, `事件 ${name} 的插值不应是指令调用`)\n return\n }\n const up: UpOut = { varIndex: ctx.varIndex++, nodeSn: sn, isEvent: true, attrName: lowerName(ctx, el, name.slice(1)) }\n pushUp(ctx, up)\n return\n }\n if (vps.length === 0) {\n if ((a.value ?? '').trim() === '') {\n const ev = lowerName(ctx, el, name.slice(1))\n ctx.L.push(`(${eeGet(ctx, sn)}).push(${stringify(ev)});`)\n return\n }\n err(ctx, `事件 ${name} 的静态值会被丢弃(legacy 行为),请绑定函数`)\n return\n }\n err(ctx, `事件 ${name} 的值最多一个插值`)\n return\n }\n\n // 4. ref\n if (name === 'ref') {\n if (vps.length === 1) {\n const up: UpOut = { varIndex: ctx.varIndex++, nodeSn: sn, isRef: true }\n pushUp(ctx, up)\n return\n }\n err(ctx, `静态 ref=\"${a.value ?? ''}\" 会被 legacy 静默丢弃;请使用 createRef 绑定`)\n return\n }\n\n // 5. 尾点属性(propPerfix,跨框架兼容):不产生 up、不消耗槽\n if (name.endsWith('.')) {\n if (vps.length) err(ctx, `尾点属性 ${name} 的插值在 legacy 中不消耗槽位(会引发 varIndex 错位),不支持`)\n return\n }\n\n // 6. 带插值的属性\n if (vps.length === 1) {\n const info = ctx.vars[vps[0].index]\n // 仅拒绝内置指令误用在属性值位;自定义指令/普通模块函数调用(map/format 等)是合法值表达式\n if (info?.isDirectiveCall && info.directiveName && BUILTIN_DIRECTIVES.has(info.directiveName)) {\n err(ctx, `属性 ${name} 的插值 \\${${info.exprSource}} 是指令调用,但该位置只接受值;指令应写在标签位 <el \\${...}>`)\n return\n }\n const up: UpOut = { varIndex: ctx.varIndex++, nodeSn: sn }\n if (ctx.slotStack.length) up.slotNodeSn = ctx.slotStack[ctx.slotStack.length - 1]\n if (name[0] === '.') {\n // prop:目标必须是已注册 CompElem / `<slot>` / 跨包自定义元素。\n // C3:与 B 段共用 isCustomTag——knownTags 只有编译器登记过的标签,跨包自定义元素\n // (运行期才 define)不在表内,但合法自定义元素名必含 `-`(customElements.define\n // 硬约束),多余命中由运行期 isCompElemNode 过滤兜底。\n if (!isCustomTag(el.tag.toLowerCase(), ctx.opts.knownTags)) {\n err(ctx, `Prop ${name} 只能设置在 CompElem 或 <slot> 上(<${el.tag}> 未注册)`)\n }\n up.isProp = true\n up.attrName = name.slice(1)\n } else if (name[0] === '?') {\n up.isToggleProp = true\n up.attrName = normalizeAttrName(el.ns, name.slice(1), el.tag.toLowerCase(), ctx.opts.knownTags)\n } else if (name[0] === '*') {\n // refAttr:*name[:camel|:kebab|:snake]\n const spec = lowerName(ctx, el, name.slice(1))\n const colon = spec.indexOf(':')\n const refName = colon < 0 ? spec : spec.slice(0, colon)\n const fmt = colon < 0 ? '' : spec.slice(colon + 1)\n let converted = refName\n if (fmt === 'camel') converted = camelCase(refName)\n else if (fmt === 'kebab') converted = kebabCase(refName)\n else if (fmt === 'snake') converted = snakeCase(refName)\n else if (fmt !== '') err(ctx, `*${name.slice(1)} 的格式后缀仅支持 :camel/:kebab/:snake,收到 ':${fmt}'`)\n up.isRefAttr = true\n up.attrName = converted\n } else {\n up.attrName = normalizeAttrName(el.ns, name, el.tag.toLowerCase(), ctx.opts.knownTags)\n up.attrTmpl = attrTmplOf(a)\n // isPureTmpl:value === PLACEHOLDER + varIndex(upm 序严格相等)。\n // ⚠️ 比较的是 var 的**ups 序**下标,不是 `vps[0].index`(模板序):\n // 片段 var(`${html(CONST)}`)不占 varIndex,两序会错开。\n up.isPureTmpl = a.parts.length === 1 && ctx.upIndexOf.get(vps[0].index) === up.varIndex\n }\n pushUp(ctx, up)\n return\n }\n if (vps.length > 1) {\n err(ctx, `属性 ${name} 的值最多一个插值`)\n return\n }\n\n // 7. 纯静态属性\n if (name[0] === '.' || name[0] === '?' || name[0] === '*') {\n err(ctx, `前缀属性 ${name} 不允许静态值(无插值);legacy 中该属性会被原样残留在 DOM`)\n return\n }\n // html 模式:静态属性已序列化进 HTML 串(不产生创建期 setAttribute 行)\n if (ctx.html) return\n ctx.L.push(`${elVar}.setAttribute(${stringify(normalizeAttrName(el.ns, name, el.tag.toLowerCase(), ctx.opts.knownTags))}, ${stringify(a.value ?? '')});`)\n}\n\nfunction eeGet(ctx: Ctx, sn: number): string {\n // B:空事件写法(`@ev` 无值)的节点没有任何 up,但渲染期需注册 noop 监听 → 必须进 updateSns 表。\n ctx.needed.add(sn)\n return `ee[${sn}] ?? (ee[${sn}] = [])`\n}\n\nfunction pushUp(ctx: Ctx, up: UpOut) {\n up.ux = ctx.ups.length\n ctx.ups.push(up)\n // B:有 up 的节点(及其 slotNodeSn 锚点)必须在运行时被逐点访问。\n ctx.needed.add(up.nodeSn)\n if (up.slotNodeSn !== undefined && up.slotNodeSn > -1) ctx.needed.add(up.slotNodeSn)\n}\n\n/**\n * **仅供编译期消费、运行时从不读取**的 up 字段 —— 不写进 `ups` 字面量。\n *\n * `directiveName`:render-effect 靠它区分结构指令 / 判 show/classes/… 形态,但那是在\n * codegen 阶段读 `UpOut` 对象本身(同一进程内),产物里的 `ups` 用不到 ——\n * compelem 运行时对 `directiveName` 的引用数为 **0**。\n *\n * 该键名长且**不会被 minifier 压缩**(对象字面量键在产物里是数据)。\n *\n * 注:`isPureTmpl` 同样是运行时未读字段,但它属于 `ups` 的既有形状契约\n * (template-codegen-e2e 的 A7/A8/C3/H4 断言它),此处保留。\n */\nconst CODEGEN_ONLY_UP_KEYS = new Set(['directiveName'])\n\n/**\n * 单个 up 描述符 → 对象字面量源码。\n *\n * **`ux` / `varIndex` 恒等于该条目在 `ups` 数组里的下标**(`ux` 由 `pushUp` 写\n * `ctx.ups.length`,`varIndex` 由 `ctx.varIndex++`,两者与 push 严格配对),因此\n * 这两个字段是纯冗余 —— 全量实测 145/145 条成立。省掉它们可减产物约 4%。\n *\n * **自守卫**:只在 `=== idx` 时才省,一旦哪天不变量被破坏(例如将来出现不经过\n * `pushUp` 的 ups 路径),就显式写出,不会静默错位。运行期\n * `hydrateBuiltTemplate` 按下标回填,对**显式带值**的产物同样兼容。\n */\nfunction serializeUp(up: UpOut, idx: number): string {\n const fields = Object.entries(up)\n .filter(([k, v]) => {\n if (v === undefined || CODEGEN_ONLY_UP_KEYS.has(k)) return false\n // 恒等于下标的两个字段:剔除(renderTemplate 用 `fx[upm.ux]`、\n // UpdatePoint 构造用 `upm.varIndex`,两者都在 hydrate 时由下标补齐)\n if (k === 'ux') return up.ux !== idx\n if (k === 'varIndex') return up.varIndex !== idx\n return true\n })\n .map(([k, v]) => `${k}: ${typeof v === 'number' ? v : stringify(v)}`)\n return `{ ${fields.join(', ')} }`\n}\n","/**\n * 编译器主流程:单文件 → 注入 `__ce_static__` 后的源码。\n */\nimport { analyzeFile, collectLocalClasses, collectModuleBindings, isCompelemSource, isMyfxSource } from './analyze/component'\nimport { checkConventions, collectModuleConsts, collectModuleFunctions, collectStringConsts } from './analyze/conventions'\nimport { extractComputedDeps, extractCssDeps } from './analyze/deps-extract'\nimport { extractFieldAccessors, RUNTIME_HELPERS } from './analyze/field-extract'\nimport { inlineTemplateMethodsWithEdits, type Edit as InlineEdit } from './analyze/inline-template-methods'\nimport { extractMethodDecos } from './analyze/method-deco-extract'\nimport { analyzeRender } from './analyze/render-body'\nimport { assertStaticAnalysis, StaticAnalysisError } from './analyze/static-gate'\nimport { extractMainTemplate, TemplateExtractError, varsByUpIndex } from './analyze/template-extract'\nimport { checkDirectiveArgs, checkTemplateRules } from './analyze/template-rules'\nimport { collectSubCandidates, enclosingCandidates, paramBaseNames, stripTsChecked, SubExtractError } from './analyze/template-subs'\nimport { buildTemplateHTML, clearAttrFragments, parseTemplateTree, TemplateParseError } from './analyze/template-tree'\nimport { extractWatchers, generateWatchEffects, type WatchEntry } from './analyze/watch-extract'\nimport { generateBuildVars, generateSubBuildVars, rewriteThis, type BuildVarsOptions } from './codegen/build-vars'\nimport { buildStaticLiteral, emitFamily, emitWatchEffects, injectInto, planCtorInsert, type CtorInsertPlan } from './codegen/inject'\nimport { buildSubInliner, generateRenderEffect, generateSubInlinedEffect } from './codegen/render-effect'\nimport { generateBuildTemplate, type UpOut } from './codegen/template-dom'\nimport type { CompilerOptions, ComponentAnalysis } from './types'\nimport { DEBUG_DIV } from './types'\nimport { collectPatternNames, parse, parseUncached, unwrapExpr } from './utils/ast'\nimport { degradePrivateNames } from './utils/js-text'\n\n/** 方法装饰器(@debounced/@throttled/@onced)前移所需的 myfx helper,与 RUNTIME_HELPERS 共用别名机制。 */\nconst MYFX_HELPERS = ['debounce', 'throttle', 'once'] as const\n\n/**\n * 收集 prelude 里**在函数作用域内可见**的声明名\n */\nfunction collectPreludeDeclNames(rawPrelude: string, out: Set<string>): void {\n if (!rawPrelude) return\n let body: any\n try {\n const parsed = parseUncached(`(function(){ ${degradePrivateNames(rawPrelude)} })`)\n body = parsed.program?.body?.[0]?.expression?.body\n } catch {\n return\n }\n if (!body) return\n\n /**\n * @param top 是否处于函数体顶层(顶层 let/const/function/class 才可见)\n */\n const walkStmts = (stmts: any[] | undefined, top: boolean): void => {\n for (const stmt of stmts ?? []) if (stmt) walkStmt(stmt, top)\n }\n\n const walkStmt = (stmt: any, top: boolean): void => {\n switch (stmt.type) {\n case 'VariableDeclaration': {\n // var 提升到函数作用域(任意深度可见);let/const 只有顶层那份可见。\n if (stmt.kind === 'var' || top) {\n for (const d of stmt.declarations ?? []) collectPatternNames(d.id, out)\n }\n return\n }\n case 'FunctionDeclaration':\n case 'ClassDeclaration':\n // 严格模式下块级函数是块级作用域 ⇒ 只收顶层。\n if (top && stmt.id?.name) out.add(stmt.id.name)\n return\n case 'BlockStatement':\n walkStmts(stmt.body, false)\n return\n case 'IfStatement':\n walkStmt(stmt.consequent, false)\n if (stmt.alternate) walkStmt(stmt.alternate, false)\n return\n case 'ForStatement':\n // `for (var i = 0; …)` 的 i 也是函数作用域(init 是表达式时 walkStmt 落到 default 直接返回)\n if (stmt.init) walkStmt(stmt.init, false)\n walkStmt(stmt.body, false)\n return\n case 'ForInStatement':\n case 'ForOfStatement':\n if (stmt.left?.type === 'VariableDeclaration') walkStmt(stmt.left, false)\n walkStmt(stmt.body, false)\n return\n case 'WhileStatement':\n case 'DoWhileStatement':\n case 'LabeledStatement':\n case 'WithStatement':\n walkStmt(stmt.body, false)\n return\n case 'TryStatement':\n walkStmt(stmt.block, false)\n if (stmt.handler) walkStmt(stmt.handler.body, false)\n if (stmt.finalizer) walkStmt(stmt.finalizer, false)\n return\n case 'SwitchStatement':\n for (const c of stmt.cases ?? []) walkStmts(c.consequent, false)\n return\n default:\n return\n }\n }\n\n walkStmts(body.body, true)\n}\n\n/**\n * inline 预变换后的 offset → 原始源码 offset。\n *\n * 偏移落在替换文本内部时只能映射到替换起点(无法精确还原),用于诊断/sourcemap\n * 足够;替换区间边界映射到原区间端点。\n */\nfunction mapInlineOffset(offset: number, edits: readonly InlineEdit[]): number {\n if (!edits.length) return offset\n let cum = 0\n for (const e of edits) {\n const tStart = e.start + cum\n const tEnd = tStart + e.text.length\n if (offset < tStart) break\n if (offset < tEnd) return e.start\n if (offset === tEnd) return e.end\n cum += e.text.length - (e.end - e.start)\n }\n return offset - cum\n}\n\n/** 把最终产物里的 edit 描述整体映射回原始源码坐标。 */\nfunction mapEditToOriginal(edit: any, inlineEdits: readonly InlineEdit[]): any {\n const map = (n: number) => mapInlineOffset(n, inlineEdits)\n return {\n ...edit,\n comp: {\n ...edit.comp,\n start: map(edit.comp.start),\n end: map(edit.comp.end),\n bodyStart: map(edit.comp.bodyStart),\n renderBodyStart: map(edit.comp.renderBodyStart),\n renderBodyEnd: map(edit.comp.renderBodyEnd),\n },\n removals: edit.removals?.map((r: { start: number; end: number }) => ({ start: map(r.start), end: map(r.end) })),\n ctor: edit.ctor ? { ...edit.ctor, pos: map(edit.ctor.pos) } : undefined,\n }\n}\n\n/** 静态编译完成后的组件依赖清单(`options.verbose` 时打印;结构化字段供工具/survey 消费)。 */\nexport interface DepSummary {\n kind: 'normal' | 'noView' | 'skipInjection'\n /** 主视图响应式依赖(仅 verbose 依赖清单展示,不注入产物) */\n viewDeps: string[]\n /** cssVars getter 依赖;undefined = 未提取到 */\n cssDeps?: string[]\n /** @computed getter 依赖;undefined = 未提取到(该类全部 key 由运行时全根兜底) */\n computedDeps?: Record<string, string[]>\n /** 结构指令子视图依赖(subId → 路径);undefined = 未提取到 */\n subViewDeps?: Record<number, string[]>\n /** @watch 编译期解析产物(sources 即监视依赖) */\n watchers?: Array<{ name: string; sources: string[] }>\n /** 主视图更新映射:每根变量 → 取值槽位 → 更新点下标 → DOM 点位(normal 组件且 verbose 展示时) */\n varMap?: VarMapEntry[]\n /** 子视图更新映射:subId → 每根路径的槽位/updater/DOM */\n subVarMap?: Record<number, VarMapEntry[]>\n}\n\nexport interface CompileResult {\n code: string\n map: any\n /** 本次编译的诊断信息(组件级) */\n diagnostics: Array<{\n className: string\n viewDeps: number\n /**\n * 约定错误(emit/@prop/@computed/@csscope 静态校验)。\n */\n conventionErrors: Array<{ start: number; end: number; message: string; severity?: 'warn' }>\n /** 静态依赖清单(每组件无条件填充;options.verbose 时输出人类可读格式) */\n deps?: DepSummary\n }>\n /** 是否发生了源码改动 */\n changed: boolean\n /** 本次编译从源码删除的 span(装饰器/字段成员/静态准入组件的 render 体,原始偏移;供最小侵入校验还原比对) */\n removals?: Array<{ start: number; end: number }>\n /** 本次编译新增的源码片段(注入的 import 片段 / 构造体写入语句;供最小侵入校验剥离) */\n additions?: string[]\n}\n\n/** 单个根变量的更新映射(依赖清单展示):根 → 取值槽位 → 更新点下标 → DOM 点位。 */\nexport interface VarMapEntry {\n /** 根名(`''` = 常脏:动态 this / 不纯 / 未分类表达式) */\n root: string\n /** 根类别:已知字段 kind / 自有 getter / 自有方法 / 跨文件未声明(基类 prop、state、@computed 等) */\n kind?: 'prop' | 'state' | 'computed' | 'getter' | 'method' | 'unknown'\n /** 该根驱动的取值槽位下标(脏集,仅对脏槽求值) */\n vars: number[]\n /** 消费这些槽位的更新点:updater = ups 数组下标(与 ups 同序),dom = 节点名 + 点位 */\n updates: Array<{ updater: number; dom: string }>\n}\n\n/** 编译期更新映射(debug 依赖清单展示用,注入产物中不出现)。 */\ninterface UpdateMeta {\n varMap?: VarMapEntry[]\n subVarMap?: Record<number, VarMapEntry[]>\n}\n\n/** up 描述符 → 人可读 DOM 点位:`<span class>` / `<ce-button @click>` / `#text [dir:text]`。 */\nfunction domLabel(up: UpOut, nodeNames: string[] | undefined): string {\n const node = (nodeNames && nodeNames[up.nodeSn]) || `#${up.nodeSn}`\n if (up.isEvent) return `<${node} @${up.attrName}>`\n if (up.isRef) return `<${node} ref>`\n if (up.isProp) return `<${node} .${up.attrName}>`\n if (up.isToggleProp) return `<${node} ?${up.attrName}>`\n if (up.isRefAttr) return `<${node} *${up.attrName}>`\n if (up.isDirective) {\n return up.directiveType === 'tag' ? `<${node} [dir]>` : `${node} [dir:${up.directiveType}]`\n }\n if (up.isText) return node\n if (up.attrName) return `<${node} ${up.attrName}>`\n return `<${node}>`\n}\n\n/** biMap + ups → 每根变量的 vars/updater/DOM 映射(无 biMap 或无更新点返回 undefined)。 */\nfunction makeVarMap(\n comp: ComponentAnalysis,\n biMap: Record<string, number[]> | undefined,\n ups: UpOut[] | undefined,\n nodeNames: string[] | undefined,\n): VarMapEntry[] | undefined {\n if (!biMap || !ups?.length) return undefined\n const entries: VarMapEntry[] = []\n for (const root of Object.keys(biMap)) {\n const vars = biMap[root]\n const varSet = new Set(vars)\n const updates: VarMapEntry['updates'] = []\n for (let i = 0; i < ups.length; i++) {\n if (varSet.has(ups[i].varIndex)) updates.push({ updater: i, dom: domLabel(ups[i], nodeNames) })\n }\n const kind: VarMapEntry['kind'] =\n root === ''\n ? undefined\n : comp.fields.get(root)?.kind ??\n (comp.ownGetters.has(root) ? 'getter' : comp.ownMethods.has(root) ? 'method' : 'unknown')\n entries.push({ root, kind, vars, updates })\n }\n return entries\n}\n\n/**\n * 默认的参与编译判定:`.ts` 且源码里出现 `extends CompElem` 或 `@tag`\n */\nexport function defaultInclude(id: string, code: string): boolean {\n const clean = id.split('?')[0]\n if (!/\\.tsx?$/.test(clean)) return false\n if (clean.endsWith('.d.ts')) return false\n if (clean.includes('node_modules')) return false\n if (code.includes('extends CompElem') || /@tag\\s*\\(/.test(code)) return true\n return /@(prop|state|computed|query|queryAll)\\b/.test(code)\n}\n\n/** 无 import 时插入 helper/carrier 的锚点:跳过 'use client' 等指令序言。 */\nfunction firstCodeStart(program: any): number {\n const body = program?.body ?? []\n let i = 0\n while (i < body.length) {\n const s = body[i]\n const e = s?.expression\n if (\n s?.type === 'ExpressionStatement' &&\n e?.type === 'Literal' &&\n typeof e.value === 'string'\n ) {\n i++\n continue\n }\n break\n }\n return body[i]?.start ?? 0\n}\n\n/** 构建组件依赖清单(4 处 diagnostics.push 统一入口)。 */\nfunction buildDeps(\n kind: DepSummary['kind'],\n ra: { viewDeps: string[] },\n cssDeps: string[] | undefined,\n computedDeps: Record<string, string[]> | undefined,\n subViewDeps: Record<number, string[]> | undefined,\n watchEntries: WatchEntry[] | undefined,\n meta?: UpdateMeta,\n): DepSummary {\n const deps: DepSummary = { kind, viewDeps: ra.viewDeps }\n if (cssDeps !== undefined) deps.cssDeps = cssDeps\n if (computedDeps !== undefined) deps.computedDeps = computedDeps\n if (subViewDeps !== undefined && Object.keys(subViewDeps).length) deps.subViewDeps = subViewDeps\n if (watchEntries?.length) deps.watchers = watchEntries.map((w) => ({ name: w.name, sources: w.sources }))\n if (meta?.varMap) deps.varMap = meta.varMap\n if (meta?.subVarMap && Object.keys(meta.subVarMap).length) deps.subVarMap = meta.subVarMap\n return deps\n}\n\n/** 根类别 → 展示标签。 */\n/** 模板方法内联预变换的快速门控:文件里没有 render( 就不必做预扫描 */\nconst hRenderRe = /\\brender\\s*\\(/\n\n// own 静态对象会遮蔽父类整个 __ce_static__;normal/noView 子类没有 own cssVars 时\n// 必须显式别名父类 cssEffect,否则继承来的 CSS 变量永远不会被写。\nconst PARENT_CSS_EFFECT = 'Reflect.getPrototypeOf(this).__ce_static__?.cssEffect'\n\nconst KIND_LABEL: Record<string, string> = {\n prop: 'prop',\n state: 'state',\n computed: 'computed',\n getter: 'getter',\n method: 'method',\n unknown: '跨文件/未声明',\n}\n\n/** 一行一个根变量:`'x' (kind) vars[槽位] → up[下标] → DOM 点位`。 */\nfunction formatVarLines(entries: VarMapEntry[], indent: string): string[] {\n return entries.map((e) => {\n const label = e.root === '' ? `'' (常脏)` : `'${e.root}' (${KIND_LABEL[e.kind ?? 'unknown'] ?? e.kind})`\n const vars = `vars[${e.vars.join(',')}]`\n const ups = e.updates.length\n ? `up[${e.updates.map((u) => u.updater).join(',')}] → ${e.updates.map((u) => u.dom).join(', ')}`\n : '—'\n return `${indent}${label} ${vars} → ${ups}`\n })\n}\n\n/** deps → 人类可读多行文本(单次 console.log,便于测试拦截)。 */\nfunction formatDeps(id: string, d: CompileResult['diagnostics'][number]): string {\n const deps = d.deps!\n const tag = deps.kind === 'skipInjection' ? 'skipInjection(继承父类)' : deps.kind\n const head = `[compelem/compiler] ${id} :: ${d.className} 依赖清单 [${tag}]`\n const lines = [head]\n lines.push(` viewDeps(${deps.viewDeps.length}): ${JSON.stringify(deps.viewDeps)}`)\n // 主视图更新映射:每变量 → 取值槽位 → 更新点下标 → DOM 点位\n if (deps.varMap) {\n lines.push(' updates:')\n lines.push(...formatVarLines(deps.varMap, ' '))\n } else if (deps.kind === 'normal') {\n lines.push(' updates: —')\n }\n lines.push(` cssDeps: ${deps.cssDeps !== undefined ? JSON.stringify(deps.cssDeps) : '—'}`)\n lines.push(` computedDeps: ${deps.computedDeps !== undefined ? JSON.stringify(deps.computedDeps) : '—'}`)\n if (deps.subViewDeps) lines.push(` subViewDeps: ${JSON.stringify(deps.subViewDeps)}`)\n if (deps.subVarMap) {\n for (const subId of Object.keys(deps.subVarMap)) {\n lines.push(` sub#${subId} updates:`)\n lines.push(...formatVarLines(deps.subVarMap[Number(subId)], ' '))\n }\n }\n if (deps.watchers) lines.push(` watchers: ${JSON.stringify(deps.watchers)}`)\n return lines.join('\\n')\n}\n\n/** 编译单个文件。解析失败时原样返回;静态分析/模板 codegen 失败会抛 StaticAnalysisError。 */\nexport function compileFile(code: string, id: string, options: CompilerOptions = {}): CompileResult {\n const include = options.include ?? defaultInclude\n if (!include(id, code)) return { code, map: null, diagnostics: [], changed: false }\n\n // verbose 依赖展示开关(显式 options.verbose 或环境变量 CE_DEPS_DEBUG):\n // 开启时才做 per-var 根名分类(DepSummary 映射),关闭时省去该开销\n const envDebug = typeof process !== 'undefined' ? process.env?.CE_DEPS_DEBUG : undefined\n const depsDisplay = options.verbose === true || (envDebug !== undefined && envDebug !== '' && envDebug !== '0')\n\n let parsed\n try {\n parsed = parse(code, id)\n } catch {\n return { code, map: null, diagnostics: [], changed: false }\n }\n\n // 模板方法内联预变换:`r => this.renderRow(r)` / `ifTrue(c, this.header())` \n const originalCode = code\n let inlineEdits: InlineEdit[] = []\n if (hRenderRe.test(code)) {\n try {\n const inlined = inlineTemplateMethodsWithEdits(code, parsed)\n if (inlined.code !== code) {\n inlineEdits = inlined.edits\n code = inlined.code\n parsed = parse(code, id)\n }\n } catch {\n /* 预变换失败不阻断:交由主管线对原始源码给出原有诊断 */\n }\n }\n\n const comps = analyzeFile(code, id, parsed)\n // 外部指令注册表:options.knownDirectives 注入到每个组件分析对象,\n // 供 template-extract / template-subs 把「模块绑定指令调用」分类为指令点\n const fileDirectives = options.knownDirectives ? new Set<string>(options.knownDirectives) : undefined\n if (fileDirectives) for (const c of comps) c.knownDirectives = fileDirectives\n if (!comps.length) return { code, map: null, diagnostics: [], changed: false }\n\n const edits: Array<{\n comp: ComponentAnalysis\n literal: string\n removals?: Array<{ start: number; end: number }>\n /** prop/state 初始值 → 构造体写入(字段已整体删除) */\n fieldInits?: Array<{ name: string; initText: string; computed?: boolean }>\n /** 构造体插入点计划(无初始值时缺省) */\n ctor?: CtorInsertPlan\n /** 方法装饰器(@debounced/@throttled/@onced)构造体注入语句 */\n methodDecoCtor?: string\n /** 方法装饰器 destroy 注入语句 */\n methodDecoDestroy?: string\n /** 本组件访问器所需的运行时函数(已定名)——文件级 import 注入取并集 */\n helpers?: string[]\n /** 本组件方法装饰器所需的 myfx 函数(debounce/throttle/once)——走 myfx 通道注入 */\n myfxHelpers?: string[]\n }> = []\n // per-point 写入器:emit 成 compelem 的模块级自由函数(`render/write.ts`),而不是\n // `rc._wText(...)` 实例方法 —— 作者的组件类型面上不留任何内部 writer。\n // 收集文件内实际用到的名字,随 compelem helper 通道做文件级 import 注入。\n const writers = new Set<string>()\n const diagnostics: CompileResult['diagnostics'] = []\n // render 体清空候选(静态准入组件的 render 是死代码 —— 静态路径下无任何运行时消费)。\n const renderStrips: Array<{ edit: (typeof edits)[number]; start: number; end: number }> = []\n\n // 标签注册表:同文件 @tag + options.knownTags(跨文件由 vite 插件累积注入,见 TEMPLATE-CODEGEN.md §4)\n const fileTags = new Set<string>()\n for (const c of comps) if (c.tagName) fileTags.add(c.tagName.toLowerCase())\n if (options.knownTags) for (const t of options.knownTags) fileTags.add(t.toLowerCase())\n\n // 约定检查上下文(emit 校验 / @prop / @computed / @csscope 目标检查)\n const convCtx = {\n localClasses: collectLocalClasses(parsed),\n stringConsts: collectStringConsts(parsed.program),\n moduleConsts: collectModuleConsts(parsed.program),\n moduleFunctions: collectModuleFunctions(parsed.program),\n importedLocals: new Set(parsed.imports.keys()),\n code,\n }\n\n // 运行时函数(RUNTIME_HELPERS)的模块定名:默认原名,与模块既有绑定冲突时\n // 改用 __ce_ 前缀别名(文件级统一,访问器与 import 注入共用)\n const moduleBindings = collectModuleBindings(parsed)\n const helperBindings: Record<string, string> = {}\n // compelem 的访问器 helper 与方法装饰器注入的 myfx helper 共用同一套\n // “模块绑定冲突 → __ce_ 别名”机制。别名必须同时记录原始导出名,\n // 注入 import 时生成 `signal as __ce_signal`,否则会 import 一个不存在的名字。\n for (const canon of [...RUNTIME_HELPERS, ...MYFX_HELPERS]) {\n if (!moduleBindings.has(canon)) continue\n let alias = '__ce_' + canon\n let n = 1\n while (moduleBindings.has(alias)) alias = `__ce${n++}_${canon}`\n helperBindings[canon] = alias\n }\n\n // 文件级累加器:类名 → 该类实际生成的访问器行。供 extractFieldAccessors 剔除\n // 「同文件祖先已提供、且逐字节相同」的行(子类重新声明同名 prop/state/computed\n // 只为覆盖默认值时,访问器与祖先完全相同)。同文件内 super 必须先于子类声明\n // (否则运行时 TDZ),故单趟前向即可;祖先若因族级 all-or-nothing 失败则没有条目,\n // 此时不剔除 —— 最坏只是多留一行死代码。\n // 必须建在**组件循环之外**:每个组件一份 Map 等于完全不共享。\n const inheritedAccessors = new Map<string, string[]>()\n /**\n * 文件级 carrier 常量声明(模块级 `const __ce_tN = Object.assign(function(){}, {__subId: N})`)。\n * 子视图回调体是死代码(运行时只读 __subId/__fx/__bv,DOM 来自 subs[N].buildTemplate),\n * 而原包装写在 fx 工厂体内 —— 每次更新都要重跑一次 Object.assign + 新建闭包。\n * 自洽子模板(无 extras)的 carrier 提到模块级,更新路径变为单次绑定读取。\n */\n const carrierDecls: string[] = []\n let carrierSeq = 0\n\n for (const comp of comps) {\n // 约定检查独立于静态分析闸门与模板 codegen,三者都执行、不短路。\n // 错误经 `compileResult.diagnostics` 的 `conventionErrors` 出口,由 vite 插件按\n // `conventions` 力度上报。\n let conventionErrors = checkConventions(comp, convCtx)\n\n // @watch 编译期解析(watch 前移):解析成功 → 删装饰器 + 注入 watchers;\n // 有 E-WATCH-ARG → 整体放弃(不删不注),运行时装饰器路径兜底。\n // watch 前移产物与模板加速字段不同:与视图无关,必须注入。\n const watchRes = extractWatchers(comp, code, convCtx)\n conventionErrors.push(...watchRes.errors)\n let watchEffectsCode: string | undefined\n let watchRemovals: Array<{ start: number; end: number }> = []\n if (!watchRes.errors.length && watchRes.entries.length) {\n watchRemovals = watchRes.removals\n watchEffectsCode = generateWatchEffects(watchRes.entries)\n // watch 回调 emit 成 `untrack(() => this.m(...))`(作者方法体对 codegen 是\n // 黑盒,只能在调用点整体关闭依赖收集,否则方法体里的读会被误收成本 watch 的\n // 依赖)。`untrack` 是 compelem 的模块级函数 —— 走同一条 compelem 注入通道。\n if (watchEffectsCode.includes('untrack(')) writers.add('untrack')\n }\n\n // 五族访问器前移(@prop/@state/@computed/@query/@queryAll):逐族 all-or-nothing,\n // 与 @watch 同构(装饰器删除 + 访问器/元数据注入)。任一成员不可静态解析 →\n // E-XXX-ARG / E-DECO-COEXIST 报错(error 级阻断;@prop 运行时已无定义路径)。\n // skipInjection 类照常参与——其注入字面量在下方以\n // `...父类.__ce_static__` spread 继承视图字段 + own 家族覆盖。\n const fieldRes = extractFieldAccessors(comp, code, convCtx, helperBindings, inheritedAccessors)\n conventionErrors.push(...fieldRes.errors)\n\n // 方法装饰器前移(@debounced/@throttled/@onced):直接生成构造体直线注入语句\n // (`this.onScroll = throttle(this.onScroll, 100)` 形态),**不引入计划表**。\n // 与五族同规格:逐族 all-or-nothing,失败即 E 码阻断。装饰器只删前缀、方法体保留。\n const mdRes = extractMethodDecos(comp, code, convCtx)\n conventionErrors.push(...mdRes.errors)\n const mdHelpers = mdRes.runtimeHelpers.map((n) => helperBindings[n] ?? n)\n\n const allRemovals: Array<{ start: number; end: number }> = [\n ...watchRemovals,\n ...fieldRes.removals,\n ...mdRes.removals,\n ]\n const fieldCodes = {\n props: fieldRes.propsCode,\n states: fieldRes.statesCode,\n computedGetters: fieldRes.computedCode,\n accessors: fieldRes.accessors || undefined,\n }\n // prop/state 初始值构造写入 + 访问器所需运行时函数(并集供文件级 import 注入)\n const needCtor = fieldRes.fieldInits.length > 0 || !!mdRes.ctorStmts\n const ctorPlan = needCtor\n ? planCtorInsert(comp, comp.cls ?? convCtx.localClasses.get(comp.className), code)\n : undefined\n // super 在分支/嵌套结构内 → 初始值写入退到构造体末尾,走 W 通道提示时序取舍\n if (ctorPlan?.warn) {\n conventionErrors.push({ start: comp.start, end: comp.end, message: ctorPlan.warn, severity: 'warn' })\n }\n const fieldHelpers = fieldRes.runtimeHelpers.map((n) => helperBindings[n] ?? n)\n const fieldExtras = {\n fieldInits: fieldRes.fieldInits.length ? fieldRes.fieldInits : undefined,\n ctor: ctorPlan ?? undefined,\n // 方法装饰器需要构造体插入点(无 fieldInits 时也可能需要)——单独算一份\n methodDecoCtor: mdRes.ctorStmts || undefined,\n methodDecoDestroy: mdRes.destroyStmts || undefined,\n // 五族访问器要的是 **compelem** 的运行时函数;per-point 写入器(`wText`/`wAttr`…)\n // 同样是 compelem 的模块级自由函数 —— 走同一通道,文件级取并集。\n //\n // ⚠️ 用 **getter** 而非快照:`writers` 要到后面的模板 codegen 才被填上\n // (generateRenderEffect / generateSubInlinedEffect 跑完才有名字),而本对象\n // 在 noView / skipInjection 分支是**提前** spread 走的。取快照会永远拿到空集\n // → 产物 emit 了 `wText(...)` 却没有 import → 运行期 ReferenceError。\n // getter 在 `...fieldExtras` 展开(即 edits.push)时才求值,那时 codegen 已完成。\n get helpers() {\n const all = [...fieldHelpers, ...writers]\n return all.length ? [...new Set(all)] : undefined\n },\n // 方法装饰器前移要的是 **myfx** 的 debounce/throttle/once —— 走 myfx 通道,\n // 不塞进 compelem 的 import(compelem 不为它们开出口)。\n myfxHelpers: mdHelpers.length ? [...mdHelpers] : undefined,\n }\n\n // U5:单 walk——analyzeRender 顺带收集主模板 h`` 节点(免 extractMainTemplate 重扫)\n const mainHits: any[] = []\n const ra = analyzeRender(comp, { mainHits })\n // 闸门:命中即抛 StaticAnalysisError(不合规就报错,无产物可接)\n assertStaticAnalysis(comp, ra)\n\n // ---- cssDeps / computedDeps 静态提取(候选4/候选3,无视图也尝试)----\n const cssDeps = extractCssDeps(comp, convCtx.localClasses)\n // computedDeps 只进 verbose 依赖清单;默认不算(避免每个 getter 一次 alias fixpoint)。\n const computedDeps = depsDisplay ? extractComputedDeps(comp, convCtx.localClasses) : undefined\n let cssEffectCode: string | undefined\n // 空依赖也要生成 effect:cssVars 可能只返回常量,首轮仍需 wCssVars 落盘。\n if (cssDeps !== undefined && comp.cssVarsBody && comp.cssVarsBody.length) {\n /**\n * `__s` **只按信号根键存放**(`CompElem.ts` `#slotsSig()` / 各 `__s[key]` 访问),\n * 故这里必须做两件事:\n *\n * 1. **只取根**。`deps-extract.record` 会同时记下完整链与根\n * (`this.list.length` → `'list.length'` + `'list'`),完整链只供 verbose\n * 依赖清单展示。把完整链当 `__s` 下标会得到 `rc.__s.list.length.value` ——\n * `SignalNode` 只有 `value`/`peek`(`signal.ts:8-12`),`.length` 是 undefined,\n * 再取 `.value` **首轮即 TypeError**。\n * 2. **可选链**。`@query`/`@queryAll` 字段不是信号,不落在 `__s` 上\n * (`deps-extract.ts` ② 级把它们记为「死条目」),直取同样 TypeError。\n * `?.` 使其退化为 `undefined`:`Object.is(undefined, undefined)` 为真 ⇒\n * 永不触发,符合「非响应式本就无依赖可订阅」的语义。\n */\n const roots = [...new Set(cssDeps.map((d) => d.split('.')[0]))]\n const signalReads = roots.map((r) => `rc.__s.${r}?.value`).join(', ')\n // cssDeps 是已知信号根的扁平数组:逐元素 Object.is 比较,免去每次触发\n // 两侧各一次 JSON.stringify(序列化整个依赖数组)\n // `wCssVars` 是 compelem 的模块级自由函数(首参 rc):作者可见的 CompElem\n // 类型面上不留这批「产物专用」成员。\n writers.add('wCssVars')\n cssEffectCode = `(rc) => { let ov; return () => { const nv = [${signalReads}]; let changed = ov === undefined; if (!changed) { for (let i = 0; i < nv.length; i++) { if (!Object.is(nv[i], ov[i])) { changed = true; break } } } if (changed) { wCssVars(rc); ov = nv } } }`\n } else if (cssDeps === undefined && comp.cssVarsBody && comp.cssVarsBody.length) {\n /**\n * ⚠️ **依赖提取失败 ⇒ 「全根兜底」,而不是「什么都不生成」。**\n\n */\n writers.add('wCssVars')\n cssEffectCode =\n `(rc) => { let ov, ks; return () => { const s = rc.__s; if (!ks) ks = Object.keys(s); const nv = []; ` +\n `for (let i = 0; i < ks.length; i++) { const c = s[ks[i]]; if (c) nv.push(c.value) } ` +\n `let changed = ov === undefined || nv.length !== ov.length; ` +\n `if (!changed) { for (let i = 0; i < nv.length; i++) { if (!Object.is(nv[i], ov[i])) { changed = true; break } } } ` +\n `if (changed) { wCssVars(rc); ov = nv } } }`\n }\n // subViewDeps:ra.subViewDeps 的 key 是回调 start 偏移,需映射为 subId\n // (collectSubCandidates 在 codegen 分支内执行;有主模板时才有 subId)\n // 仅用于 debug 依赖清单输出(不注入 __ce_static__)\n let subViewDepsRec: Record<number, string[]> | undefined\n\n // ---- 无视图组件(noView):无 render / render 返回 null / 继承链终点 CompElem ----\n if (comp.noView) {\n edits.push({\n comp,\n literal: buildStaticLiteral({ noView: true }, {\n ...fieldCodes,\n cssEffect: cssEffectCode ?? PARENT_CSS_EFFECT,\n watchEffects: watchEffectsCode,\n inlinedWatchAncestors: watchRes.inlinedAncestors,\n }),\n removals: allRemovals,\n ...fieldExtras,\n })\n diagnostics.push({\n className: comp.className,\n viewDeps: 0,\n conventionErrors,\n deps: buildDeps('noView', ra, cssDeps, computedDeps, subViewDepsRec, watchRes.entries),\n })\n continue\n }\n\n // ---- 跳过注入(同文件继承链上有 render 的祖先,继承其 __ce_static__)----\n if (comp.skipInjection) {\n // 五族前移照常参与(必须注入访问器/元数据),watchEffects 同前。\n // 视图字段整体 spread 继承祖先(buildTemplate/subs/…——本类无 render,\n // 视图即祖先的视图)。视图字段是**整体继承**语义(own 一律覆盖,不参与合并);\n // 家族字段则相反 —— 必须逐张表浅替换叠加,见 inject.ts emitFamily。\n const hasOwnField =\n !!fieldRes.accessors ||\n fieldRes.propsCode !== undefined ||\n fieldRes.statesCode !== undefined ||\n fieldRes.computedCode !== undefined ||\n // 只有 cssVars 覆写、没有其他家族成员的中间类也必须注入自己的 cssEffect\n !!cssEffectCode\n if (hasOwnField || watchEffectsCode) {\n // super 表达式改由 emitFamily 内部的 `Reflect.getPrototypeOf(this)` 解析:\n // 原先 `code.slice(superNode.start, superNode.end)` 重放 extends 子句源码,\n // 遇到 `extends Mixin(CompElem)` 会**二次调用 mixin 工厂**取到另一个类。\n const mk = (label: string, body: string) => `${DEBUG_DIV} ${label}\\n${body}`\n const parts = [\n mk('inherits', `...Reflect.getPrototypeOf(this).__ce_static__`),\n mk('props', `props: ${emitFamily('props', fieldRes.propsCode)}`),\n mk('states', `states: ${emitFamily('states', fieldRes.statesCode)}`),\n mk('computedGetters', `computedGetters: ${emitFamily('computedGetters', fieldRes.computedCode)}`),\n ]\n // watchEffects 必须注入:@watch 装饰器已随 watchRemovals 被删,不注入即彻底丢失。\n // 语义是**拼接**不是覆盖 —— own 数组把父类那份接在前面(ancestors-first),\n // 否则本类自带 @watch 时会把祖先的执行序列整段盖掉(`emitWatchEffects`)。\n if (watchEffectsCode) {\n parts.push(mk('watchEffects', `watchEffects: ${emitWatchEffects(watchEffectsCode, watchRes.inlinedAncestors)}`))\n }\n if (cssEffectCode) parts.push(mk('cssEffect', `cssEffect: ${cssEffectCode}`))\n // 本分支(继承链上有 render 祖先 ⇒ skipInjection)与 `codegen/inject.ts` 同为\n // 注入路径,产物里同样只留运行时需要的东西。\n edits.push({\n comp,\n literal:\n `static __ce_static__ = {\\n${parts.join(',\\n')}\\n};\\n` + (fieldRes.accessors || ''),\n removals: allRemovals,\n ...fieldExtras,\n })\n }\n diagnostics.push({\n className: comp.className,\n viewDeps: ra.viewDeps.length,\n conventionErrors,\n deps: buildDeps('skipInjection', ra, cssDeps, computedDeps, subViewDepsRec, watchRes.entries),\n })\n continue\n }\n\n // ---- 模板诊断(约定错误 E-*)无条件执行 ----\n let buildTemplateCode: string | undefined\n let subsCode: string | undefined\n let pointEffectsCode: string | undefined\n let fxCode: string | undefined\n let tmplErrors: string[] = []\n let mainTmpl: ReturnType<typeof extractMainTemplate> = null\n // 依赖清单更新映射素材:主模板 ups/节点名 + 每根/子模板的 vars→updater→DOM 映射\n let mainUps: UpOut[] | undefined\n let mainNodeNames: string[] | undefined\n let updateMeta: UpdateMeta = {}\n try {\n mainTmpl = extractMainTemplate(comp, code, mainHits)\n if (mainTmpl) {\n const tree = parseTemplateTree(\n buildTemplateHTML(mainTmpl.strings),\n mainTmpl.vars.length,\n )\n // 折叠只对文本位生效;属性名/属性值里的 html(CONST) 必须保留指令语义。\n clearAttrFragments(tree.root, mainTmpl.vars)\n // 模板层约定规则(.prop 须插值 / 事件须函数 / ref 须 createRef / 指令位置 / .prop 目标)\n conventionErrors.push(...checkTemplateRules(tree, mainTmpl, comp, convCtx, fileTags))\n\n // codegen:恒执行(走到这里说明 assertStaticAnalysis 已通过)\n {\n const gen = generateBuildTemplate(tree.root, mainTmpl.vars, {\n className: comp.className,\n knownTags: fileTags,\n })\n if (gen.errors.length) tmplErrors = gen.errors\n else buildTemplateCode = gen.code ?? undefined\n if (!gen.errors.length) {\n mainUps = gen.ups\n mainNodeNames = gen.nodeNames\n }\n // 静态取值函数:与 buildTemplate 的 varIndex 空间对齐。\n // 任一插值无法安全静态化(render() 局部标识符 / this 改写失败)→ buildTemplate\n // 一并放弃。\n if (buildTemplateCode) {\n // 先收集子模板候选(失败→整组件报错),再生成主取值函数(带 wraps)\n let subCandidates: ReturnType<typeof collectSubCandidates> = []\n let c1SubBvMap: Map<number, ReturnType<typeof generateSubBuildVars>> | undefined\n let c1Extras: Map<number, string> | undefined\n let c1Carriers: Map<number, string> | undefined\n let c1BvOpts: BuildVarsOptions | undefined\n // U2:本文件内自由标识符校验缓存(comp 恒定,C1 多阶段复用同一 fnRaw 结果)\n const freeCache: Map<string, Set<string> | null> = new Map()\n try {\n subCandidates = collectSubCandidates(comp, code)\n // 每个候选只解析一次树:既用于清理属性位的 fragment 标记(必须早于\n // generateSubBuildVars),也供后续 buildTemplate codegen 复用。\n for (const cand of subCandidates) {\n cand.tree = parseTemplateTree(\n buildTemplateHTML(cand.strings),\n cand.vars.length,\n )\n clearAttrFragments(cand.tree.root, cand.vars)\n // 子模板里的指令实参(forEach keyFn / model 写回路径)同样要校验:\n // 这些规则只看表达式本身,不依赖插入位置映射,可直接按 vars 走。\n conventionErrors.push(...checkDirectiveArgs(cand.vars, convCtx))\n }\n } catch (e) {\n tmplErrors = [\n e instanceof SubExtractError || e instanceof TemplateExtractError\n || e instanceof TemplateParseError\n ? e.message\n : String(e),\n ]\n }\n if (!tmplErrors.length && buildTemplateCode) {\n // 两阶段:先试全部子模板取值函数;失败且 free ⊆ 祖先形参 → 生成 __bv 闭包 extras\n const subBvMap = new Map<number, ReturnType<typeof generateSubBuildVars>>()\n const extras = new Map<number, string>()\n /** subId → 模块级 carrier 常量名(自洽子模板;填充见 liftPlan 定稿后) */\n const carriers = new Map<number, string>()\n const liftPlan: Array<{\n cand: (typeof subCandidates)[number]\n allowed: Set<string>\n r: ReturnType<typeof generateSubBuildVars>\n }> = []\n if (subCandidates.length) {\n for (const cand of subCandidates) {\n subBvMap.set(cand.subId, generateSubBuildVars(cand, code, comp, subCandidates, { freeCache, depsDisplay }))\n }\n /**\n * 候选「需要祖先作用域的标识符」= 自身 freeIds ∪ **所有后代候选**的 needIds。\n */\n const needCache = new Map<number, Set<string>>()\n /**\n * `needIds(cand)` = **cand 的工厂被发出去之后,它的工厂体(含所有被内联进来的\n * 后代 `__fx`)还需要从「cand 工厂之外」拿到哪些标识符**\n */\n /** cand 的**直接子候选**:被 cand 严格内含、且不被 cand 的其它后代再内含 */\n const directChildrenOf = (cand: (typeof subCandidates)[number]) => {\n const kids = subCandidates.filter((o) => {\n if (o === cand) return false\n if (typeof o.start !== 'number' || typeof o.end !== 'number') return false\n return o.start > cand.start && o.end <= cand.end\n })\n return kids.filter((o) => !kids.some((m) => m !== o\n && typeof m.start === 'number' && typeof m.end === 'number'\n && m.start > cand.start && m.end <= cand.end\n && o.start >= m.start && o.end <= m.end && (o.start > m.start || m.end > o.end)))\n }\n const needIdsOf = (cand: (typeof subCandidates)[number]): Set<string> => {\n const hit = needCache.get(cand.subId)\n if (hit) return hit\n needCache.set(cand.subId, new Set()) // 防环占位\n const out = new Set<string>(subBvMap.get(cand.subId)?.freeIds ?? [])\n for (const o of directChildrenOf(cand)) {\n for (const id of needIdsOf(o)) out.add(id)\n }\n for (const p of paramBaseNames(cand.params)) out.delete(p)\n needCache.set(cand.subId, out)\n return out\n }\n for (const cand of subCandidates) {\n const r = subBvMap.get(cand.subId)!\n const need = needIdsOf(cand)\n const ancestors = enclosingCandidates(cand, subCandidates)\n const allowed = new Set<string>()\n for (const a of ancestors) {\n for (const n of paramBaseNames(a.params)) allowed.add(n)\n // 祖先 prelude 声明的局部 const 同样在祖先工厂体作用域内:\n // 提升后的 __fx 工厂词法嵌在祖先 pe/fx 体里,祖先 prelude 会按\n // usesPrelude 文本判定注入工厂体开头 ⇒ 闭包捕获安全。\n // 这是 inline-template-methods「prelude 注入」设计的前提——\n // 调用形态的实参绑定就是祖先 prelude const(2026-10-14)。\n if (a.preludeSrc) collectPreludeDeclNames(a.preludeSrc, allowed)\n }\n if (!need.size) continue\n if (![...need].every((id) => allowed.has(id))) continue\n liftPlan.push({ cand, allowed, r })\n }\n // 深优先(start 降序):先处理内层,其 __fx 才能被外层内联时带上\n liftPlan.sort((a, b) => b.cand.start - a.cand.start)\n\n // carrier 常量(自洽子模板):模块级一次创建,更新路径零分配。\n // 必须在 liftPlan 定稿**之后**填 —— liftPlan 里的候选会拿到\n // `__fx`(闭包捕获祖先形参,必须逐次新建载体),不能共享常量;\n // 提升失败时它既无 extras 也无 carrier,回落原回调源码形态。\n const liftedIds = new Set(liftPlan.map((x) => x.cand.subId))\n for (const cand of subCandidates) {\n if (liftedIds.has(cand.subId)) continue\n const name = `__ce_t${carrierSeq++}`\n carriers.set(cand.subId, name)\n carrierDecls.push(\n `const ${name} = Object.assign(function(){}, {__subId: ${cand.subId}});`,\n )\n }\n\n for (const { cand, allowed, r } of liftPlan) {\n const lifted = generateSubBuildVars(cand, code, comp, subCandidates, {\n extraAllowed: allowed,\n extras,\n freeCache,\n depsDisplay,\n })\n if (lifted.code) {\n // 跨层子模板也内联 —— 生成内联 fx + 合并 pointEffects,\n // 作为 __fx 挂在**本子回调对象字面量**上(该字面量在祖先回调体内创建,\n // 祖先 effect 每轮重跑 ⇒ 闭包捕获的祖先形参天然新鲜,无需 __bv 快照)。\n // 自由标识符校验仍由上面的 generateSubBuildVars(extraAllowed) 负责。\n let liftGen: ReturnType<typeof generateBuildTemplate> | undefined\n try {\n liftGen = generateBuildTemplate(cand.tree!.root, cand.vars, {\n className: comp.className,\n knownTags: fileTags,\n })\n } catch {\n liftGen = undefined\n }\n if (liftGen && !liftGen.errors.length) {\n const inliner = buildSubInliner(cand, code, subCandidates, extras, carriers)\n const subParams = cand.params.length ? `, ${cand.params.join(', ')}` : ''\n // 子模板 prelude(回调体的前置语句)里声明的局部变量名 —— 供\n // `generateSubInlinedEffect` 判断 fx 工厂是否需要注入 prelude。\n // 不传 → 只要 prelude 引用了,fx 就会 ReferenceError(见该函数注释)。\n const liftPreludeNames = new Set<string>()\n if (cand.preludeSrc) collectPreludeDeclNames(cand.preludeSrc, liftPreludeNames)\n const subRe = generateSubInlinedEffect(\n liftGen.ups ?? [],\n inliner.val,\n inliner.prelude ?? '',\n subParams,\n liftPreludeNames,\n )\n if (!subRe.usedGet && inliner.prelude != null) {\n for (const w of subRe.writers) writers.add(w)\n extras.set(cand.subId, `, __fx: { fx: ${subRe.fxExpr}, pe: ${subRe.arrayExpr} }`)\n r.code = null\n r.errors = []\n r.freeIds = undefined\n r.lifted = true\n r.viewDepVarIndices = lifted.viewDepVarIndices\n }\n }\n }\n }\n // extras 就绪后重生成未提升且可能包住提升子节点的父级取值函数\n if (extras.size) {\n for (const cand of subCandidates) {\n const r = subBvMap.get(cand.subId)!\n if (!r.code) continue\n const regen = generateSubBuildVars(cand, code, comp, subCandidates, { extras, freeCache, depsDisplay })\n if (regen.code) {\n r.code = regen.code\n r.errors = []\n r.viewDepVarIndices = regen.viewDepVarIndices\n }\n }\n }\n }\n\n // `__bv` 闭包提升(C1)在 extras 上追加条目 ⇒ 该候选载体必须逐次新建。\n // liftPlan 之外、到这里才被加 `__bv` 的候选要把已有 carrier 常量撤掉。\n for (const subId of extras.keys()) carriers.delete(subId)\n const bvOpts: BuildVarsOptions = { extras, freeCache, depsDisplay, carriers }\n const bv = generateBuildVars(mainTmpl, comp, code, subCandidates, bvOpts)\n if (bv.code) {\n // `bv.code` 本身不注入产物:主模板的每个点都已把表达式内联进\n // fx / pointEffects 工厂。保留本函数调用是因为它还提供两样东西:\n // 1 `bv.errors` —— 门禁(自由标识符 / TS 语法 ⇒ 不可编译)\n // 2 `bv.viewDepVarIndices` —— verbose 依赖清单的根名→var 映射\n if (mainUps?.length) {\n // varIndex → 该 var 自己的表达式:保留 `this.metrics.length` 这类成员访问,\n // 否则 effect 只会读 `rc.__s.metrics.value`(整个数组),\n // 文本点就会渲染成 [object Object],[object Object],…\n const upsVars = varsByUpIndex(mainTmpl.vars)\n // 自守卫:每个非片段 var 恰好产生一个 up(serializeUp 的同一不变量)。\n // 一旦被打破,宁可构建期硬报错,也不静默解错表达式。\n if (upsVars.length !== mainUps.length) {\n tmplErrors = [\n `插值槽与更新点数量不一致(插值 ${upsVars.length} / 更新点 ${mainUps.length}):` +\n `varIndex 空间错位,拒绝生成取值表达式`,\n ]\n }\n const varIndexToExpr = new Map<number, string>()\n for (let vi = 0; vi < upsVars.length; vi++) varIndexToExpr.set(vi, upsVars[vi].exprSource)\n // `__s` 的真实键集 = 本组件(含继承链)已建信号的字段 + 框架自带 slots。\n // 只有这些键才允许内联成 `rc.__s.<k>.value`,见 signalExprFor 的说明。\n const signalKeys = new Set<string>(comp.fields.keys())\n signalKeys.add('slots')\n // 内联上下文:让 effect / fx 工厂直接内联表达式(含 __subId wraps)。\n // - ranges:varIndex → 源码绝对区间,applySubIdWraps 靠偏移切片\n const varIndexToRange = new Map<number, [number, number]>()\n for (let vi = 0; vi < upsVars.length; vi++) {\n const v = upsVars[vi]\n if (typeof v.start === 'number' && typeof v.end === 'number') {\n varIndexToRange.set(vi, [v.start, v.end])\n }\n }\n // 主模板 prelude:stripTs → TS 复检 → rewriteThis('rc')。\n // 引用 prelude 局部变量的插值会由 generateRenderEffect 在对应工厂内注入\n // prelude(每轮 effect 重算,读 rc.route getter 即订阅信号);未引用的\n // 工厂零开销。门禁(TS 语法 / 未知自由标识符)仍由 generateBuildVars 把关。\n let fxPrelude = ''\n const preludeNames = new Set<string>()\n if (mainTmpl.preludeSrc) {\n const pc = stripTsChecked(mainTmpl.preludeSrc)\n if (pc.tsHit) {\n tmplErrors = ['render() prelude 含 TS 专有语法(as/satisfies/非空断言),放弃注入']\n } else {\n const pl = rewriteThis(pc.stripped, 'rc') ?? ''\n fxPrelude = pl\n collectPreludeDeclNames(mainTmpl.preludeSrc, preludeNames)\n }\n }\n const re = !tmplErrors.length\n ? generateRenderEffect(mainUps, varIndexToExpr, signalKeys, {\n source: code,\n candidates: subCandidates,\n extras,\n carriers,\n ranges: varIndexToRange,\n prelude: fxPrelude,\n preludeNames,\n })\n : undefined\n if (re) {\n for (const w of re.writers) writers.add(w)\n pointEffectsCode = re.arrayExpr\n fxCode = re.fxExpr\n // 主模板产物**不允许**出现 get(varIndex) 回退 —— 每个更新点都必须把\n // 表达式内联进 fx / pointEffects 工厂:出现回退即说明表达式含无法静态化\n // 语法(render() 局部标识符 / TS 专有残留),应在构建期硬报错,让作者\n // 修模板或改写法。\n if (re.usedGet) {\n tmplErrors = [\n '主模板存在无法内联进 effect 工厂的插值表达式(出现 get(varIndex) 回退):' +\n '静态路径要求所有更新点内联取值,请检查该表达式是否引用了 render() 局部标识符或 TS 专有语法。',\n ]\n }\n }\n\n }\n const vm = depsDisplay ? makeVarMap(comp, bv.viewDepVarIndices, mainUps, mainNodeNames) : undefined\n if (vm) updateMeta.varMap = vm\n } else {\n buildTemplateCode = undefined\n tmplErrors = bv.errors\n }\n c1SubBvMap = subBvMap\n c1Extras = extras\n c1Carriers = carriers\n c1BvOpts = bvOpts\n } else if (tmplErrors.length) {\n buildTemplateCode = undefined\n }\n // 子模板 codegen:任一失败 → tmplErrors 非空 → 下方整组件报错阻断\n if (!tmplErrors.length && buildTemplateCode && subCandidates.length) {\n const entries: string[] = []\n for (const cand of subCandidates) {\n try {\n const subGen = generateBuildTemplate(cand.tree!.root, cand.vars, {\n className: comp.className,\n knownTags: fileTags,\n })\n if (subGen.errors.length) {\n tmplErrors = subGen.errors.map((m) => `sub#${cand.subId}: ${m}`)\n break\n }\n const subBv =\n c1SubBvMap?.get(cand.subId) ??\n generateSubBuildVars(cand, code, comp, subCandidates, c1BvOpts)\n\n const subVm = depsDisplay ? makeVarMap(comp, subBv.viewDepVarIndices, subGen.ups, subGen.nodeNames) : undefined\n if (subVm) {\n if (!updateMeta.subVarMap) updateMeta.subVarMap = {}\n updateMeta.subVarMap[cand.subId] = subVm\n }\n if (subBv.code) {\n // **自洽子模板** → 内联 fx。\n // 表达式只引用自身形参 + this + 模块名,顶层工厂可直接内联取值,\n // 运行时无需 get 回退。跨层子模板(引用祖先形参,如 `row[c]`)\n // 走下面的已提升分支(回调实例上的 __fx)。\n const inliner = buildSubInliner(cand, code, subCandidates, c1Extras, c1Carriers)\n const subParams = cand.params.length ? `, ${cand.params.join(', ')}` : ''\n // 同上:把 prelude 声明的局部变量名交给 fx 注入判定\n const subPreludeNames = new Set<string>()\n if (cand.preludeSrc) collectPreludeDeclNames(cand.preludeSrc, subPreludeNames)\n const subRe = generateSubInlinedEffect(\n subGen.ups ?? [],\n inliner.val,\n inliner.prelude ?? '',\n subParams,\n subPreludeNames,\n )\n if (subRe.usedGet || inliner.prelude == null) {\n tmplErrors = [\n `sub#${cand.subId}: 子模板存在无法内联进 effect 工厂的插值表达式(get(varIndex) 回退)`,\n ]\n break\n }\n for (const w of subRe.writers) writers.add(w)\n entries.push(\n `${cand.subId}: { buildTemplate: ${subGen.code}, pointEffects: ${subRe.arrayExpr}, fx: ${subRe.fxExpr} }`,\n )\n } else if (subBv.lifted || (typeof c1Extras !== 'undefined' && c1Extras.has(cand.subId))) {\n // 跨层子模板已内联为回调实例上的 __fx(fx + 合并 pointEffects),\n // subs 只留 buildTemplate 作 DOM 克隆源;取值/effect 全部由 __fx 提供。\n entries.push(`${cand.subId}: { buildTemplate: ${subGen.code} }`)\n } else {\n // 取值表达式无法内联进 effect 工厂(自由标识符既不在自身形参、\n // 也不在任何祖先回调形参里)→ **构建期报错**:静态路径不执行\n // render(),闭包作用域未必存在这些名字。\n // freeIds 为空说明失败来自其他 code:null 路径(如私有名包装\n // parse 失败),此时 subBv.errors 才是真实原因,优先透出。\n const realErrors =\n (subBv.errors?.length ?? 0) > 0 && !(subBv.freeIds?.length ?? 0)\n ? subBv.errors\n : [\n `插值表达式无法内联进 effect 工厂,引用了无法解析的自由标识符 '${(subBv.freeIds ?? []).join(\n \"', '\",\n )}'`,\n ]\n tmplErrors = realErrors.map((m) => `sub#${cand.subId}: ${m}`)\n break\n }\n } catch (e) {\n tmplErrors = [\n `sub#${cand.subId}: ${e instanceof SubExtractError || e instanceof TemplateExtractError\n ? e.message\n : String(e)\n }`,\n ]\n break\n }\n }\n if (tmplErrors.length) {\n buildTemplateCode = undefined\n } else if (entries.length) {\n subsCode = `{ ${entries.join(', ')} }`\n // subViewDeps:start → subId 映射后进入依赖清单\n if (depsDisplay && ra.subViewDeps.size) {\n const startToSubId = new Map(subCandidates.map((c) => [c.start, c.subId]))\n const rec: Record<number, string[]> = {}\n let hasAny = false\n for (const [start, deps] of ra.subViewDeps) {\n const subId = startToSubId.get(start)\n if (subId !== undefined && deps.length) {\n rec[subId] = deps\n hasAny = true\n }\n }\n if (hasAny) {\n subViewDepsRec = rec\n }\n }\n }\n }\n }\n }\n }\n } catch (e) {\n tmplErrors = [e instanceof TemplateParseError || e instanceof TemplateExtractError || e instanceof SubExtractError ? e.message : String(e)]\n // 解析错误同样不可编译:tmplErrors 非空 ⇒ 下方抛 StaticAnalysisError。\n }\n if (tmplErrors.length) {\n // 模板 codegen 失败 ⇒ **编译报错**:放行「凑合能跑」的产物,运行时表现是\n // 组件静默渲染成空白,比构建失败难查得多。\n throw new StaticAnalysisError(comp.className, tmplErrors)\n }\n\n // render() 存在但无主模板(顶层 return 全为 null/undefined 字面量)→ noView\n if (!mainTmpl && comp.hasRender && !tmplErrors.length) {\n // 检查 render 体的顶层 return 是否全为 null/undefined 字面量\n const rets = comp.renderBody\n ? (Array.isArray(comp.renderBody) ? comp.renderBody : [comp.renderBody])\n : []\n const topRets = rets.filter((s: any) => s?.type === 'ReturnStatement')\n const allNull =\n topRets.length > 0 &&\n topRets.every((r: any) => {\n const raw = r.argument\n if (!raw) return true // return; (无值)视为 null\n const arg = unwrapExpr(raw)\n if (arg.type === 'Literal' && (arg.value === null || arg.value === undefined)) return true\n if (arg.type === 'Identifier' && (arg.name === 'null' || arg.name === 'undefined')) return true\n if (arg.type === 'UnaryExpression' && arg.operator === 'void') return true\n return false\n })\n if (allNull) {\n edits.push({\n comp,\n literal: buildStaticLiteral({ noView: true }, {\n ...fieldCodes,\n cssEffect: cssEffectCode ?? PARENT_CSS_EFFECT,\n watchEffects: watchEffectsCode,\n inlinedWatchAncestors: watchRes.inlinedAncestors,\n }),\n removals: allRemovals,\n ...fieldExtras,\n })\n diagnostics.push({\n className: comp.className,\n viewDeps: 0,\n conventionErrors,\n deps: buildDeps('noView', ra, cssDeps, computedDeps, subViewDepsRec, watchRes.entries),\n })\n continue\n }\n }\n\n // render() 存在但没有可编译的主模板(返回 this.tpl / h(CONST) / 其它非 h 表达式)\n // ⇒ 产物既无 buildTemplate 也无 noView,运行时 setup 会抛“未编译”。构建期直接拦。\n if (comp.hasRender && (!mainTmpl || !buildTemplateCode)) {\n throw new StaticAnalysisError(comp.className, [\n 'render() 必须返回唯一的 h`` 模板或 null/undefined;' +\n '返回普通表达式/预计算 Template 无法生成静态视图。',\n ])\n }\n\n // 静态路径准入(运行时唯一渲染路径 = buildTemplate 在字面量里)\n // → render() 成死代码:体清空为 `render(): Template {}`(走 removals,剥离测试恒等)。\n // 「未准入」只剩 noView 一种,走上面 noView 的早退分支,不会流到这里\n const stripRender =\n !!buildTemplateCode &&\n comp.renderBodyStart >= 0 &&\n comp.renderBodyEnd > comp.renderBodyStart\n const edit: (typeof edits)[number] = {\n comp,\n literal: buildStaticLiteral({}, {\n pointEffects: pointEffectsCode,\n fx: fxCode,\n watchEffects: watchEffectsCode,\n inlinedWatchAncestors: watchRes.inlinedAncestors,\n cssEffect: cssEffectCode ?? PARENT_CSS_EFFECT,\n buildTemplate: buildTemplateCode,\n subViews: subsCode,\n ...fieldCodes,\n }),\n removals: allRemovals,\n ...fieldExtras,\n }\n edits.push(edit)\n if (stripRender) renderStrips.push({ edit, start: comp.renderBodyStart, end: comp.renderBodyEnd })\n diagnostics.push({\n className: comp.className,\n viewDeps: ra.viewDeps.length,\n conventionErrors,\n deps: buildDeps('normal', ra, cssDeps, computedDeps, subViewDepsRec, watchRes.entries, updateMeta),\n })\n }\n\n // render 体清空(问题④):静态准入组件的 render **无任何运行时消费**,无条件清空。\n for (const rs of renderStrips) rs.edit.removals = [...(rs.edit.removals ?? []), { start: rs.start, end: rs.end }]\n\n // 访问器所需运行时函数:文件级并集 → 扩展已有 compelem import(或新增独立 import 行)\n // Map<本地名, 原始导出名>:冲突别名时两者不同,import 必须写 `原导出名 as 本地名`。\n const localToImported = new Map<string, string>()\n for (const [canon, alias] of Object.entries(helperBindings)) localToImported.set(alias, canon)\n const helperNeeds = new Map<string, string>()\n const myfxNeeds = new Map<string, string>()\n const addNeed = (into: Map<string, string>, local: string) => {\n into.set(local, localToImported.get(local) ?? local)\n }\n for (const e of edits) {\n for (const hlp of e.helpers ?? []) addNeed(helperNeeds, hlp)\n for (const hlp of e.myfxHelpers ?? []) addNeed(myfxNeeds, hlp)\n }\n let helperImport: { decl: any; source: string } | undefined\n let myfxImport: { decl: any; source: string } | undefined\n let helpersAnchor: number | undefined\n if (helperNeeds.size || myfxNeeds.size) {\n for (const node of parsed.program.body ?? []) {\n if (node.type !== 'ImportDeclaration') continue\n if (helpersAnchor === undefined) helpersAnchor = node.start\n const src = node.source?.value\n if (typeof src === 'string') {\n if (isCompelemSource(src)) {\n // C4:同文件多处命中 compelem 源时,优先裸包名 `compelem`(生产形态),\n // dev 相对形态 `./src` 仅作回退——避免 dev 依赖把 helper 注到相对入口上。\n if (!helperImport || (helperImport.source !== 'compelem' && src === 'compelem')) {\n helperImport = { decl: node, source: src }\n }\n } else if (!myfxImport && isMyfxSource(src)) {\n myfxImport = { decl: node, source: src }\n }\n }\n }\n // 无 import 时锚在首语句起点(前导注释之后)\n if (helpersAnchor === undefined) helpersAnchor = firstCodeStart(parsed.program)\n }\n\n // carrier 常量的模块级插入点:最后一个 import 声明之后(无 import 则首语句之前)\n let topLevelAnchor: number | undefined\n if (carrierDecls.length) {\n let lastImportEnd: number | undefined\n for (const node of parsed.program.body ?? []) {\n if (node.type === 'ImportDeclaration') lastImportEnd = node.end\n }\n topLevelAnchor = lastImportEnd ?? firstCodeStart(parsed.program)\n }\n\n const aliasRecord = (m: Map<string, string>) =>\n Object.fromEntries([...m].filter(([local, imported]) => local !== imported))\n\n const mappedEdits = inlineEdits.length ? edits.map((e) => mapEditToOriginal(e, inlineEdits)) : edits\n const mapPos = (n: number | undefined) =>\n n === undefined ? undefined : mapInlineOffset(n, inlineEdits)\n const mapImport = (\n imp: { decl: any; source: string } | undefined,\n ): { decl: any; source: string } | undefined =>\n !imp || !inlineEdits.length\n ? imp\n : {\n source: imp.source,\n decl: {\n ...imp.decl,\n start: mapInlineOffset(imp.decl.start, inlineEdits),\n end: mapInlineOffset(imp.decl.end, inlineEdits),\n },\n }\n\n const { code: out, map, injected, additions } = injectInto(\n inlineEdits.length ? originalCode : code,\n mappedEdits,\n id,\n {\n helpers: helperNeeds.size ? [...helperNeeds.keys()] : undefined,\n helperAliases: helperNeeds.size ? aliasRecord(helperNeeds) : undefined,\n helperImport: mapImport(helperImport),\n myfxHelpers: myfxNeeds.size ? [...myfxNeeds.keys()] : undefined,\n myfxAliases: myfxNeeds.size ? aliasRecord(myfxNeeds) : undefined,\n myfxImport: mapImport(myfxImport),\n helpersAnchor: mapPos(helpersAnchor),\n topLevel: carrierDecls.length ? carrierDecls.join('\\n') : undefined,\n topLevelAnchor: mapPos(topLevelAnchor),\n inlineEdits,\n },\n )\n\n // 诊断的 offset 是 inline 变换后的坐标系;对外统一回到原始源码坐标。\n if (inlineEdits.length) {\n for (const d of diagnostics) {\n for (const e of d.conventionErrors) {\n e.start = mapInlineOffset(e.start, inlineEdits)\n e.end = mapInlineOffset(e.end, inlineEdits)\n }\n }\n }\n // verbose 依赖清单打印(depsDisplay 判定同上,已在 compileFile 入口计算)\n if (depsDisplay) {\n for (const d of diagnostics) if (d.deps) console.log(formatDeps(id, d))\n }\n return {\n code: out,\n map,\n diagnostics,\n changed: injected.length > 0,\n removals: mappedEdits.flatMap((e) => e.removals ?? []),\n additions,\n }\n}\n\nexport { analyzeFile, analyzeRender, assertStaticAnalysis }\n","/**\n * Vite / Rolldown 插件入口。\n *\n * 用法(vite.config.ts):\n * ```ts\n * import { compelemCompiler } from '@compelem/compiler/vite'\n * export default defineConfig({ plugins: [compelemCompiler()] })\n * ```\n *\n * 通过 `enforce: 'pre'` + `transform` 钩子工作:在 TS→JS 转换之前拿到 `.ts` 源码,\n * 注入 `static __ce_static__` 后交回后续插件链。\n */\nimport { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { compileFile } from './compile'\nimport type { CompilerOptions } from './types'\nimport { hash32 } from './utils/ast'\n\n/** 极简的结构化插件类型,避免硬依赖 vite 的 types(peer 里 vite 是可选的)。 */\ninterface MinimalPlugin {\n name: string\n enforce?: 'pre' | 'post'\n transform?: (code: string, id: string) => { code: string; map: any } | null | undefined\n configResolved?: (config: any) => void\n buildStart?: (this: any) => void | Promise<void>\n}\n\nconst TAG_RE = /@tag\\(\\s*['\"]([^'\"]+)['\"]/g\n\n/**\n * 用于 transform 缓存键的按文件指纹(见 tagFingerprint)。\n */\nconst FILE_HYPHEN_TAG_RE = /<([a-z][a-z0-9]*(?:-[a-z0-9]+)+)/g\n\n/**\n * 按文件标签指纹(替代全局 `knownTags.size`)。\n */\nfunction tagFingerprint(usedTags: Set<string>, knownTags: Set<string>): string {\n if (usedTags.size === 0) return ''\n const inter: string[] = []\n for (const t of usedTags) if (knownTags.has(t)) inter.push(t)\n if (inter.length === 0) return ''\n inter.sort()\n return hash32(inter.join('\\n'))\n}\n\nconst SKIP_DIRS = new Set(['node_modules', 'dist', 'build', 'out', 'coverage'])\n\n/** 递归收集 root 下 .ts/.tsx 的 @tag 名(跨文件标签注册表,TEMPLATE-CODEGEN.md §4)。 */\nfunction scanKnownTags(root: string, out: Set<string>, depth = 0): void {\n if (depth > 20) return\n let entries\n try {\n entries = readdirSync(root, { withFileTypes: true })\n } catch {\n return\n }\n for (const e of entries) {\n if (e.name.startsWith('.')) continue\n if (e.isDirectory()) {\n if (SKIP_DIRS.has(e.name)) continue\n scanKnownTags(join(root, e.name), out, depth + 1)\n } else if (/\\.tsx?$/.test(e.name) && !e.name.endsWith('.d.ts')) {\n try {\n const code = readFileSync(join(root, e.name), 'utf-8')\n if (code.indexOf('@tag') < 0 && code.indexOf('CompElem') < 0) continue\n TAG_RE.lastIndex = 0\n let m\n while ((m = TAG_RE.exec(code))) out.add(m[1].toLowerCase())\n } catch {\n /* 忽略读失败 */\n }\n }\n }\n}\n\nexport interface VitePluginOptions extends CompilerOptions {\n /** 是否输出每个文件的编译诊断 */\n verbose?: boolean\n /**\n * 约定错误(E-*:emit 未声明/非字面量、@prop 缺 type/命名/赋值、@computed 非 getter、\n * @csscope 非 static getter)的处理力度。默认 `'error'` —— 约定违规直接阻断构建。\n */\n conventions?: 'error' | 'warn' | 'silent'\n\n /**\n * 调试用:把编译产物写到源文件同级(`foo.ts` → `foo.js`),便于直接查看\n * 注入后的 `__ce_static__` / buildTemplate / pointEffects / fx。\n * 仅对真实文件生效(跳过 `?v=` 之类的虚拟 id),且只在编译确有改动时写。\n */\n emitJs?: boolean\n debugSourceMap?: boolean\n}\n\n/** 惰性构建换行偏移索引(升序;仅在有诊断时付费一次)。 */\nfunction newlineIndex(code: string): Int32Array {\n const arr: number[] = []\n for (let i = 0; i < code.length; i++) if (code.charCodeAt(i) === 10) arr.push(i)\n return Int32Array.from(arr)\n}\n\n/** 把源码偏移换算成 `行:列`(1 起算);带换行索引时走二分(O(log n))。 */\nfunction offsetToLineCol(code: string, offset: number, nl?: Int32Array): string {\n if (!nl) {\n let line = 1\n let lastNl = -1\n for (let i = 0; i < offset && i < code.length; i++) {\n if (code.charCodeAt(i) === 10) {\n line++\n lastNl = i\n }\n }\n return `${line}:${offset - lastNl}`\n }\n //二分:count = 换行下标中严格小于 offset 的个数\n let lo = 0, hi = nl.length\n while (lo < hi) {\n const mid = (lo + hi) >> 1\n if (nl[mid] < offset) lo = mid + 1\n else hi = mid\n }\n const lastNl = lo > 0 ? nl[lo - 1] : -1\n return `${lo + 1}:${offset - lastNl}`\n}\n\n/**\n * 从 diagnostics 收集**约定诊断**为可上报文本,按 severity 分为 errs(E-*)与 warns(W-*)\n */\nfunction collectErrors(\n res: ReturnType<typeof compileFile>,\n code: string,\n id: string,\n root: string,\n): { errs: string[]; warns: string[] } {\n const errs: string[] = []\n const warns: string[] = []\n const rel = id.startsWith(root) ? id.replace(/\\\\/g, '/').slice(root.replace(/\\\\/g, '/').length + 1) : id\n let nl: Int32Array | undefined\n for (const d of res.diagnostics) {\n const list = d.conventionErrors?.map((e) => ({ offset: e.start, message: e.message, severity: e.severity })) ?? []\n for (const e of list) {\n nl ??= newlineIndex(code)\n const at = offsetToLineCol(code, e.offset, nl)\n const line = `${rel}:${at} [${d.className}] ${e.message}`\n ; (e.severity === 'warn' ? warns : errs).push(line)\n }\n }\n return { errs, warns }\n}\n\n/** 按 mode 上报违规(error 阻断构建 / warn 控制台 / silent 忽略)。 */\nfunction reportErrors(msgs: string[], mode: 'warn' | 'error' | 'silent', head: string, thisArg: any) {\n if (mode === 'silent' || !msgs.length) return\n const text = head + '\\n ' + msgs.join('\\n ')\n if (mode === 'error') {\n const err = thisArg?.error?.bind(thisArg)\n if (err) err(new Error(text))\n else throw new Error(text)\n } else {\n console.warn(text)\n }\n}\n\n/** compelem 编译期优化插件。 */\nexport function compelemCompiler(options: VitePluginOptions = {}): MinimalPlugin {\n let root = process.cwd()\n const convMode = options.conventions ?? 'error'\n const knownTags = new Set<string>()\n if (options.knownTags) for (const t of options.knownTags) knownTags.add(t.toLowerCase())\n let scanned = false\n const transformCache = new Map<string, ReturnType<typeof compileFile>>()\n const TRANSFORM_CACHE_MAX = 512\n\n return {\n name: 'compelem:compiler',\n enforce: 'pre',\n\n configResolved(config: any) {\n root = config?.root ?? root\n },\n\n buildStart() {\n // 启动时全量预扫 @tag,填充跨文件标签注册表(编译顺序无关)\n if (scanned) return\n scanned = true\n scanKnownTags(root, knownTags)\n },\n\n transform(code: string, id: string) {\n if (id.includes('\\0')) return null\n const clean = id.split('?')[0]\n if (!/\\.(?:m|c)?(?:tsx?|jsx?)$/.test(clean)) return null\n if (clean.includes('node_modules')) return null\n\n // 惰性兜底:buildStart 未触发(如纯 API 调用)时按需扫描\n if (!scanned) {\n scanned = true\n scanKnownTags(root, knownTags)\n }\n // 本文件新出现的 @tag 立即并入(预扫后新增的热更场景;Set 幂等)\n TAG_RE.lastIndex = 0\n FILE_HYPHEN_TAG_RE.lastIndex = 0\n let tm\n const usedTags = new Set<string>()\n while ((tm = TAG_RE.exec(code))) {\n const t = tm[1].toLowerCase()\n knownTags.add(t)\n usedTags.add(t)\n }\n let hm\n while ((hm = FILE_HYPHEN_TAG_RE.exec(code))) usedTags.add(hm[1].toLowerCase())\n\n const cacheKey = id + '\\0' + hash32(code) + '\\0' + tagFingerprint(usedTags, knownTags)\n let res = transformCache.get(cacheKey)\n if (!res) {\n res = compileFile(code, id, {\n ...options,\n knownTags: options.knownTags\n ? new Set([...knownTags, ...[...options.knownTags].map((t) => t.toLowerCase())])\n : knownTags,\n })\n if (transformCache.size >= TRANSFORM_CACHE_MAX) {\n const oldest = transformCache.keys().next().value\n if (oldest !== undefined) transformCache.delete(oldest)\n }\n transformCache.set(cacheKey, res)\n }\n\n // 约定错误:独立于静态分析闸门,默认直接阻断构建;\n // W 码(severity:'warn',如 W-PROP-CUSTOM-CTOR)恒为控制台提示,不随档位阻断。\n if (convMode !== 'silent') {\n const { errs, warns } = collectErrors(res, code, id, root)\n if (warns.length) console.warn(`[compelem/compiler] ${warns.length} 条提示:\\n ` + warns.join('\\n '))\n reportErrors(errs, convMode, `[compelem/compiler] 检测到 ${errs.length} 处约定错误:`, this)\n }\n\n if (!res.changed) return null\n\n // 调试:把编译产物落到源文件同级(foo.ts → foo.js)\n if (options.emitJs) emitCompiledJs(id, res.code, root)\n\n if (options.verbose) {\n const rel = id.startsWith(root) ? id.slice(root.length + 1) : id\n for (const d of res.diagnostics) {\n console.log(`[compelem/compiler] ${rel} :: ${d.className} → 编译(${d.viewDeps} deps)`)\n }\n }\n return { code: res.code, map: options.debugSourceMap ? null : res.map }\n },\n }\n}\n\n/**\n * 把编译产物写到源文件同级:`foo.ts` → `foo.js`。\n * 写失败只告警不抛:产物是调试便利,不该让 dev server 起不来。\n */\nfunction emitCompiledJs(id: string, code: string, root: string): void {\n // 跳过虚拟模块:带 ?v= / \\0 的不是磁盘路径\n if (id.includes('\\0') || id.includes('?')) return\n if (!/\\.tsx?$/.test(id)) return\n try {\n const out = id.replace(/\\.tsx?$/, '.js')\n const prev = existsSync(out) ? readFileSync(out, 'utf-8') : null\n if (prev === code) return\n writeFileSync(out, code, 'utf-8')\n const rel = id.startsWith(root) ? id.slice(root.length + 1) : id\n console.log(`[compelem/compiler] emit → ${out.replace(root, '.')}${prev === null ? '' : ' (updated)'}`)\n void rel\n } catch (e) {\n console.warn(`[compelem/compiler] emitJs 写入失败:${id} → ${String(e)}`)\n }\n}\n\nexport default compelemCompiler\n"],"mappings":"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"}
|