From 704fee955eb12f4e8f21fd6d1eccee46c54d27d9 Mon Sep 17 00:00:00 2001 From: zhiyuanzmj <260480378@qq.com> Date: Sun, 16 Mar 2025 13:17:05 +0800 Subject: [PATCH] feat(compiler-vapor): support custom generate operation --- packages/compiler-vapor/src/generate.ts | 10 +++++++++- packages/compiler-vapor/src/generators/operation.ts | 5 +++++ packages/compiler-vapor/src/generators/text.ts | 9 ++++----- packages/compiler-vapor/src/generators/utils.ts | 2 ++ packages/compiler-vapor/src/index.ts | 8 +------- packages/compiler-vapor/src/ir/index.ts | 1 - 6 files changed, 21 insertions(+), 14 deletions(-) diff --git a/packages/compiler-vapor/src/generate.ts b/packages/compiler-vapor/src/generate.ts index 193a0f5da..469e55a70 100644 --- a/packages/compiler-vapor/src/generate.ts +++ b/packages/compiler-vapor/src/generate.ts @@ -19,7 +19,14 @@ import { } from './generators/utils' import { setTemplateRefIdent } from './generators/templateRef' -export type CodegenOptions = Omit +type CustomGenOperation = ( + opers: any, + context: CodegenContext, +) => CodeFragment[] | void + +export type CodegenOptions = Omit & { + customGenOperation?: CustomGenOperation | null +} export class CodegenContext { options: Required @@ -87,6 +94,7 @@ export class CodegenContext { inline: false, bindingMetadata: {}, expressionPlugins: [], + customGenOperation: null, } this.options = extend(defaultOptions, options) this.block = ir.block diff --git a/packages/compiler-vapor/src/generators/operation.ts b/packages/compiler-vapor/src/generators/operation.ts index 4247bc6fe..2ca8f6a5c 100644 --- a/packages/compiler-vapor/src/generators/operation.ts +++ b/packages/compiler-vapor/src/generators/operation.ts @@ -88,6 +88,11 @@ export function genOperation( case IRNodeTypes.GET_TEXT_CHILD: return genGetTextChild(oper, context) default: + if (context.options.customGenOperation) { + const result = context.options.customGenOperation(oper, context) + if (result) return result + } + const exhaustiveCheck: never = oper throw new Error( `Unhandled operation type in genOperation: ${exhaustiveCheck}`, diff --git a/packages/compiler-vapor/src/generators/text.ts b/packages/compiler-vapor/src/generators/text.ts index 89e3167c6..700297b3b 100644 --- a/packages/compiler-vapor/src/generators/text.ts +++ b/packages/compiler-vapor/src/generators/text.ts @@ -10,8 +10,8 @@ export function genSetText( context: CodegenContext, ): CodeFragment[] { const { helper } = context - const { element, values, generated, jsx } = oper - const texts = combineValues(values, context, jsx) + const { element, values, generated } = oper + const texts = combineValues(values, context) return [ NEWLINE, ...genCall(helper('setText'), `${generated ? 'x' : 'n'}${element}`, texts), @@ -21,16 +21,15 @@ export function genSetText( function combineValues( values: SimpleExpressionNode[], context: CodegenContext, - jsx?: boolean, ): CodeFragment[] { return values.flatMap((value, i) => { let exp = genExpression(value, context) - if (!jsx && getLiteralExpressionValue(value) == null) { + if (getLiteralExpressionValue(value) == null) { // dynamic, wrap with toDisplayString exp = genCall(context.helper('toDisplayString'), exp) } if (i > 0) { - exp.unshift(jsx ? ', ' : ' + ') + exp.unshift(' + ') } return exp }) diff --git a/packages/compiler-vapor/src/generators/utils.ts b/packages/compiler-vapor/src/generators/utils.ts index 904b3dc87..46d8e5250 100644 --- a/packages/compiler-vapor/src/generators/utils.ts +++ b/packages/compiler-vapor/src/generators/utils.ts @@ -10,6 +10,8 @@ import { import { isArray, isString } from '@vue/shared' import type { CodegenContext } from '../generate' +export { genExpression } from './expression' + export const NEWLINE: unique symbol = Symbol(__DEV__ ? `newline` : ``) /** increase offset but don't push actual code */ export const LF: unique symbol = Symbol(__DEV__ ? `line feed` : ``) diff --git a/packages/compiler-vapor/src/index.ts b/packages/compiler-vapor/src/index.ts index 6eda10210..7594f8355 100644 --- a/packages/compiler-vapor/src/index.ts +++ b/packages/compiler-vapor/src/index.ts @@ -13,13 +13,7 @@ export { type CodegenOptions, type VaporCodegenResult, } from './generate' -export { - genCall, - genMulti, - buildCodeFragment, - codeFragmentToString, - type CodeFragment, -} from './generators/utils' +export * from './generators/utils' export { wrapTemplate, compile, diff --git a/packages/compiler-vapor/src/ir/index.ts b/packages/compiler-vapor/src/ir/index.ts index da6361132..88c235a0f 100644 --- a/packages/compiler-vapor/src/ir/index.ts +++ b/packages/compiler-vapor/src/ir/index.ts @@ -124,7 +124,6 @@ export interface SetTextIRNode extends BaseIRNode { element: number values: SimpleExpressionNode[] generated?: boolean // whether this is a generated empty text node by `processTextLikeContainer` - jsx?: boolean } export type KeyOverride = [find: string, replacement: string]