mirror of https://github.com/vuejs/core.git
refactor: extract transformInterpolation
This commit is contained in:
parent
3dfe3854ee
commit
21e7a37865
|
@ -8,14 +8,19 @@ import {
|
||||||
ErrorCodes,
|
ErrorCodes,
|
||||||
} from '@vue/compiler-dom'
|
} from '@vue/compiler-dom'
|
||||||
import { extend, isString } from '@vue/shared'
|
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 { generate } from './generate'
|
||||||
import { HackOptions } from './hack'
|
|
||||||
import { transformOnce } from './transforms/vOnce'
|
import { transformOnce } from './transforms/vOnce'
|
||||||
import { transformElement } from './transforms/transformElement'
|
import { transformElement } from './transforms/transformElement'
|
||||||
import { transformVHtml } from './transforms/vHtml'
|
import { transformVHtml } from './transforms/vHtml'
|
||||||
import { transformVText } from './transforms/vText'
|
import { transformVText } from './transforms/vText'
|
||||||
import { transformVOn } from './transforms/vOn'
|
import { transformVOn } from './transforms/vOn'
|
||||||
|
import { transformInterpolation } from './transforms/transformInterpolation'
|
||||||
|
import type { HackOptions } from './ir'
|
||||||
|
|
||||||
export type CompilerOptions = HackOptions<BaseCompilerOptions>
|
export type CompilerOptions = HackOptions<BaseCompilerOptions>
|
||||||
|
|
||||||
|
@ -88,7 +93,7 @@ export function getBaseTransformPreset(
|
||||||
prefixIdentifiers?: boolean,
|
prefixIdentifiers?: boolean,
|
||||||
): TransformPreset {
|
): TransformPreset {
|
||||||
return [
|
return [
|
||||||
[transformOnce, transformElement],
|
[transformOnce, transformInterpolation, transformElement],
|
||||||
{
|
{
|
||||||
on: transformVOn,
|
on: transformVOn,
|
||||||
html: transformVHtml,
|
html: transformVHtml,
|
||||||
|
|
|
@ -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>
|
|
||||||
}
|
|
||||||
>
|
|
||||||
>
|
|
|
@ -3,6 +3,8 @@ import type {
|
||||||
RootNode,
|
RootNode,
|
||||||
SourceLocation,
|
SourceLocation,
|
||||||
} from '@vue/compiler-dom'
|
} from '@vue/compiler-dom'
|
||||||
|
import type { Prettify } from '@vue/shared'
|
||||||
|
import type { DirectiveTransform, NodeTransform } from './transform'
|
||||||
|
|
||||||
export enum IRNodeTypes {
|
export enum IRNodeTypes {
|
||||||
ROOT,
|
ROOT,
|
||||||
|
@ -139,3 +141,16 @@ export interface IREffect {
|
||||||
expressions: IRExpression[]
|
expressions: IRExpression[]
|
||||||
operations: OperationNode[]
|
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>
|
||||||
|
}
|
||||||
|
>
|
||||||
|
>
|
||||||
|
|
|
@ -2,7 +2,6 @@ import {
|
||||||
type RootNode,
|
type RootNode,
|
||||||
type TemplateChildNode,
|
type TemplateChildNode,
|
||||||
type ElementNode,
|
type ElementNode,
|
||||||
type InterpolationNode,
|
|
||||||
type TransformOptions as BaseTransformOptions,
|
type TransformOptions as BaseTransformOptions,
|
||||||
type ParentNode,
|
type ParentNode,
|
||||||
type AllNode,
|
type AllNode,
|
||||||
|
@ -20,7 +19,7 @@ import {
|
||||||
type IRExpression,
|
type IRExpression,
|
||||||
IRNodeTypes,
|
IRNodeTypes,
|
||||||
} from './ir'
|
} from './ir'
|
||||||
import type { HackOptions } from './hack'
|
import type { HackOptions } from './ir'
|
||||||
|
|
||||||
export type NodeTransform = (
|
export type NodeTransform = (
|
||||||
node: RootNode | TemplateChildNode,
|
node: RootNode | TemplateChildNode,
|
||||||
|
@ -225,7 +224,7 @@ export function transform(
|
||||||
function transformNode(
|
function transformNode(
|
||||||
context: TransformContext<RootNode | TemplateChildNode>,
|
context: TransformContext<RootNode | TemplateChildNode>,
|
||||||
) {
|
) {
|
||||||
let { node, index } = context
|
let { node } = context
|
||||||
|
|
||||||
// apply transform plugins
|
// apply transform plugins
|
||||||
const { nodeTransforms } = context.options
|
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) {
|
switch (node.type) {
|
||||||
case NodeTypes.ROOT:
|
case NodeTypes.ROOT:
|
||||||
case NodeTypes.ELEMENT: {
|
case NodeTypes.ELEMENT: {
|
||||||
|
@ -266,25 +261,6 @@ function transformNode(
|
||||||
context.template += `<!--${node.content}-->`
|
context.template += `<!--${node.content}-->`
|
||||||
break
|
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
|
// 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,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -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,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue