]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor: extract transformInterpolation
author三咲智子 Kevin Deng <sxzz@sxzz.moe>
Sun, 3 Dec 2023 06:52:11 +0000 (14:52 +0800)
committer三咲智子 Kevin Deng <sxzz@sxzz.moe>
Sun, 3 Dec 2023 06:52:11 +0000 (14:52 +0800)
packages/compiler-vapor/src/compile.ts
packages/compiler-vapor/src/hack.ts [deleted file]
packages/compiler-vapor/src/ir.ts
packages/compiler-vapor/src/transform.ts
packages/compiler-vapor/src/transforms/transformInterpolation.ts [new file with mode: 0644]

index b795974b4f79c84927854ac6e0294e5385297d00..7b745fd37455cd8a5e3fafff5a7328ddad694475 100644 (file)
@@ -8,14 +8,19 @@ import {
   ErrorCodes,
 } from '@vue/compiler-dom'
 import { extend, isString } from '@vue/shared'
-import { DirectiveTransform, NodeTransform, transform } from './transform'
+import {
+  type DirectiveTransform,
+  type NodeTransform,
+  transform,
+} from './transform'
 import { generate } from './generate'
-import { HackOptions } from './hack'
 import { transformOnce } from './transforms/vOnce'
 import { transformElement } from './transforms/transformElement'
 import { transformVHtml } from './transforms/vHtml'
 import { transformVText } from './transforms/vText'
 import { transformVOn } from './transforms/vOn'
+import { transformInterpolation } from './transforms/transformInterpolation'
+import type { HackOptions } from './ir'
 
 export type CompilerOptions = HackOptions<BaseCompilerOptions>
 
@@ -88,7 +93,7 @@ export function getBaseTransformPreset(
   prefixIdentifiers?: boolean,
 ): TransformPreset {
   return [
-    [transformOnce, transformElement],
+    [transformOnce, transformInterpolation, transformElement],
     {
       on: transformVOn,
       html: transformVHtml,
diff --git a/packages/compiler-vapor/src/hack.ts b/packages/compiler-vapor/src/hack.ts
deleted file mode 100644 (file)
index a2fb6cb..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-import type { Prettify } from '@vue/shared'
-import type { DirectiveTransform, NodeTransform } from './transform'
-
-type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> &
-  Pick<U, Extract<keyof U, keyof T>>
-
-export type HackOptions<T> = Prettify<
-  Overwrite<
-    T,
-    {
-      nodeTransforms?: NodeTransform[]
-      directiveTransforms?: Record<string, DirectiveTransform | undefined>
-    }
-  >
->
index dd0efe08c1d0a1e99ad22b5264005f971ef8cb38..4e4c06e52bacf8edfb864e1387347c1cac705c07 100644 (file)
@@ -3,6 +3,8 @@ import type {
   RootNode,
   SourceLocation,
 } from '@vue/compiler-dom'
+import type { Prettify } from '@vue/shared'
+import type { DirectiveTransform, NodeTransform } from './transform'
 
 export enum IRNodeTypes {
   ROOT,
@@ -139,3 +141,16 @@ export interface IREffect {
   expressions: IRExpression[]
   operations: OperationNode[]
 }
+
+type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> &
+  Pick<U, Extract<keyof U, keyof T>>
+
+export type HackOptions<T> = Prettify<
+  Overwrite<
+    T,
+    {
+      nodeTransforms?: NodeTransform[]
+      directiveTransforms?: Record<string, DirectiveTransform | undefined>
+    }
+  >
+>
index 878092f39b1dcd40e408c1ce1b80dee46d34c307..2132fcf43c1f0dc00011063072d5f99f108e5a8b 100644 (file)
@@ -2,7 +2,6 @@ import {
   type RootNode,
   type TemplateChildNode,
   type ElementNode,
-  type InterpolationNode,
   type TransformOptions as BaseTransformOptions,
   type ParentNode,
   type AllNode,
@@ -20,7 +19,7 @@ import {
   type IRExpression,
   IRNodeTypes,
 } from './ir'
-import type { HackOptions } from './hack'
+import type { HackOptions } from './ir'
 
 export type NodeTransform = (
   node: RootNode | TemplateChildNode,
@@ -225,7 +224,7 @@ export function transform(
 function transformNode(
   context: TransformContext<RootNode | TemplateChildNode>,
 ) {
-  let { node, index } = context
+  let { node } = context
 
   // apply transform plugins
   const { nodeTransforms } = context.options
@@ -248,10 +247,6 @@ function transformNode(
     }
   }
 
-  const parentChildren = context.parent ? context.parent.node.children : []
-  const isFirst = index === 0
-  const isLast = index === parentChildren.length - 1
-
   switch (node.type) {
     case NodeTypes.ROOT:
     case NodeTypes.ELEMENT: {
@@ -266,25 +261,6 @@ function transformNode(
       context.template += `<!--${node.content}-->`
       break
     }
-    case NodeTypes.INTERPOLATION: {
-      transformInterpolation(
-        context as TransformContext<InterpolationNode>,
-        isFirst,
-        isLast,
-      )
-      break
-    }
-    case NodeTypes.TEXT_CALL:
-      // never
-      break
-    default: {
-      // TODO handle other types
-      // CompoundExpressionNode
-      // IfNode
-      // IfBranchNode
-      // ForNode
-      context.template += `[type: ${node.type}]`
-    }
   }
 
   // exit transforms
@@ -370,49 +346,3 @@ function processDynamicChildren(ctx: TransformContext<RootNode | ElementNode>) {
     }
   }
 }
-
-function transformInterpolation(
-  ctx: TransformContext<InterpolationNode>,
-  isFirst: boolean,
-  isLast: boolean,
-) {
-  const { node } = ctx
-
-  const expr = node.content
-
-  if (isFirst && isLast) {
-    const parent = ctx.parent!
-    const parentId = parent.reference()
-    ctx.registerEffect(
-      [expr],
-      [
-        {
-          type: IRNodeTypes.SET_TEXT,
-          loc: node.loc,
-          element: parentId,
-          value: expr,
-        },
-      ],
-    )
-  } else {
-    const id = ctx.reference()
-    ctx.dynamic.ghost = true
-    ctx.registerOperation({
-      type: IRNodeTypes.CREATE_TEXT_NODE,
-      loc: node.loc,
-      id,
-      value: expr,
-    })
-    ctx.registerEffect(
-      [expr],
-      [
-        {
-          type: IRNodeTypes.SET_TEXT,
-          loc: node.loc,
-          element: id,
-          value: expr,
-        },
-      ],
-    )
-  }
-}
diff --git a/packages/compiler-vapor/src/transforms/transformInterpolation.ts b/packages/compiler-vapor/src/transforms/transformInterpolation.ts
new file mode 100644 (file)
index 0000000..4bd51a5
--- /dev/null
@@ -0,0 +1,48 @@
+import { NodeTypes } from '@vue/compiler-dom'
+import { NodeTransform } from '../transform'
+import { IRNodeTypes } from '../ir'
+
+export const transformInterpolation: NodeTransform = (node, ctx) => {
+  if (node.type !== NodeTypes.INTERPOLATION) return
+
+  const expr = node.content
+  const parentChildren = ctx.parent ? ctx.parent.node.children : []
+  const isFirst = ctx.index === 0
+  const isLast = ctx.index === parentChildren.length - 1
+
+  if (isFirst && isLast) {
+    const parent = ctx.parent!
+    const parentId = parent.reference()
+    ctx.registerEffect(
+      [expr],
+      [
+        {
+          type: IRNodeTypes.SET_TEXT,
+          loc: node.loc,
+          element: parentId,
+          value: expr,
+        },
+      ],
+    )
+  } else {
+    const id = ctx.reference()
+    ctx.dynamic.ghost = true
+    ctx.registerOperation({
+      type: IRNodeTypes.CREATE_TEXT_NODE,
+      loc: node.loc,
+      id,
+      value: expr,
+    })
+    ctx.registerEffect(
+      [expr],
+      [
+        {
+          type: IRNodeTypes.SET_TEXT,
+          loc: node.loc,
+          element: id,
+          value: expr,
+        },
+      ],
+    )
+  }
+}