refactor(compiler-vapor): remove template ir node

This commit is contained in:
三咲智子 Kevin Deng 2024-02-21 17:41:23 +08:00
parent ba29b4c89a
commit 66c0e82d4b
No known key found for this signature in database
GPG Key ID: 69992F2250DFD93E
9 changed files with 24 additions and 192 deletions

View File

@ -156,81 +156,3 @@ export function render(_ctx) {
return n0
}"
`;
exports[`compiler: vModel transform > should work with input (checkbox) 1`] = `
"import { children as _children, vModelCheckbox as _vModelCheckbox, withDirectives as _withDirectives, on as _on, template as _template } from 'vue/vapor';
const t0 = _template("<input type=\\"checkbox\\">")
export function render(_ctx) {
const n0 = t0()
const n1 = _children(n0, 0)
_withDirectives(n1, [[_vModelCheckbox, () => _ctx.model]])
_on(n1, "update:modelValue", $event => (_ctx.model = $event))
return n0
}"
`;
exports[`compiler: vModel transform > should work with input (dynamic type) 1`] = `
"import { children as _children, vModelDynamic as _vModelDynamic, withDirectives as _withDirectives, on as _on, template as _template } from 'vue/vapor';
const t0 = _template("<input>")
export function render(_ctx) {
const n0 = t0()
const n1 = _children(n0, 0)
_withDirectives(n1, [[_vModelDynamic, () => _ctx.model]])
_on(n1, "update:modelValue", $event => (_ctx.model = $event))
return n0
}"
`;
exports[`compiler: vModel transform > should work with input (radio) 1`] = `
"import { children as _children, vModelRadio as _vModelRadio, withDirectives as _withDirectives, on as _on, template as _template } from 'vue/vapor';
const t0 = _template("<input type=\\"radio\\">")
export function render(_ctx) {
const n0 = t0()
const n1 = _children(n0, 0)
_withDirectives(n1, [[_vModelRadio, () => _ctx.model]])
_on(n1, "update:modelValue", $event => (_ctx.model = $event))
return n0
}"
`;
exports[`compiler: vModel transform > should work with input (text) 1`] = `
"import { children as _children, vModelText as _vModelText, withDirectives as _withDirectives, on as _on, template as _template } from 'vue/vapor';
const t0 = _template("<input type=\\"text\\">")
export function render(_ctx) {
const n0 = t0()
const n1 = _children(n0, 0)
_withDirectives(n1, [[_vModelText, () => _ctx.model]])
_on(n1, "update:modelValue", $event => (_ctx.model = $event))
return n0
}"
`;
exports[`compiler: vModel transform > should work with select 1`] = `
"import { children as _children, vModelSelect as _vModelSelect, withDirectives as _withDirectives, on as _on, template as _template } from 'vue/vapor';
const t0 = _template("<select></select>")
export function render(_ctx) {
const n0 = t0()
const n1 = _children(n0, 0)
_withDirectives(n1, [[_vModelSelect, () => _ctx.model]])
_on(n1, "update:modelValue", $event => (_ctx.model = $event))
return n0
}"
`;
exports[`compiler: vModel transform > should work with simple expression 1`] = `
"import { children as _children, vModelText as _vModelText, withDirectives as _withDirectives, on as _on, template as _template } from 'vue/vapor';
const t0 = _template("<input>")
export function render(_ctx) {
const n0 = t0()
const n1 = _children(n0, 0)
_withDirectives(n1, [[_vModelText, () => _ctx.model]])
_on(n1, "update:modelValue", $event => (_ctx.model = $event))
return n0
}"
`;

View File

@ -22,10 +22,7 @@ describe('compiler v-bind', () => {
id: 1,
flags: DynamicFlag.REFERENCED,
})
expect(ir.template[0]).toMatchObject({
type: IRNodeTypes.TEMPLATE_FACTORY,
template: '<div></div>',
})
expect(ir.template).toEqual(['<div></div>'])
expect(ir.effect).lengthOf(1)
expect(ir.effect[0].expressions).lengthOf(1)
expect(ir.effect[0].operations).lengthOf(1)
@ -243,10 +240,7 @@ describe('compiler v-bind', () => {
end: { line: 1, column: 19 },
},
})
expect(ir.template[0]).toMatchObject({
type: IRNodeTypes.TEMPLATE_FACTORY,
template: '<div arg></div>',
})
expect(ir.template).toEqual(['<div arg></div>'])
expect(code).matchSnapshot()
expect(code).contains(JSON.stringify('<div arg></div>'))

View File

@ -27,13 +27,7 @@ describe('compiler: v-for', () => {
expect(code).matchSnapshot()
expect(vaporHelpers).contains('createFor')
expect(helpers.size).toBe(0)
expect(ir.template).lengthOf(1)
expect(ir.template).toMatchObject([
{
template: '<div></div>',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
])
expect(ir.template).toEqual(['<div></div>'])
expect(ir.operation).toMatchObject([
{
type: IRNodeTypes.FOR,

View File

@ -63,7 +63,7 @@ describe('v-html', () => {
expect(helpers.size).toBe(0)
// children should have been removed
expect(ir.template).toMatchObject([{ template: '<div></div>' }])
expect(ir.template).toEqual(['<div></div>'])
expect(ir.operation).toEqual([])
expect(ir.effect).toMatchObject([

View File

@ -31,13 +31,7 @@ describe('compiler: v-if', () => {
expect(vaporHelpers).contains('createIf')
expect(helpers.size).toBe(0)
expect(ir.template).lengthOf(1)
expect(ir.template).toMatchObject([
{
template: '<div></div>',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
])
expect(ir.template).toEqual(['<div></div>'])
expect(ir.operation).toMatchObject([
{
type: IRNodeTypes.IF,
@ -72,13 +66,7 @@ describe('compiler: v-if', () => {
)
expect(code).matchSnapshot()
expect(ir.template).lengthOf(1)
expect(ir.template).toMatchObject([
{
template: '<div></div>hello<p></p>',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
])
expect(ir.template).toEqual(['<div></div>hello<p></p>'])
expect(ir.effect).toEqual([])
expect((ir.operation[0] as IfIRNode).positive.effect).toMatchObject([
@ -109,13 +97,7 @@ describe('compiler: v-if', () => {
`<div v-if="ok">hello</div><div v-if="ok">hello</div>`,
)
expect(code).matchSnapshot()
expect(ir.template).lengthOf(1)
expect(ir.template).toMatchObject([
{
template: '<div>hello</div>',
type: 2,
},
])
expect(ir.template).toEqual(['<div>hello</div>'])
expect(ir.returns).toEqual([1, 3])
})
@ -127,17 +109,7 @@ describe('compiler: v-if', () => {
`<div v-if="ok"/><p v-else/>`,
)
expect(code).matchSnapshot()
expect(ir.template).lengthOf(2)
expect(ir.template).toMatchObject([
{
template: '<div></div>',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
{
template: '<p></p>',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
])
expect(ir.template).toEqual(['<div></div>', '<p></p>'])
expect(vaporHelpers).contains('createIf')
expect(ir.effect).lengthOf(0)
@ -169,17 +141,7 @@ describe('compiler: v-if', () => {
`<div v-if="ok"/><p v-else-if="orNot"/>`,
)
expect(code).matchSnapshot()
expect(ir.template).lengthOf(2)
expect(ir.template).toMatchObject([
{
template: '<div></div>',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
{
template: '<p></p>',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
])
expect(ir.template).toEqual(['<div></div>', '<p></p>'])
expect(ir.operation).toMatchObject([
{
@ -216,21 +178,7 @@ describe('compiler: v-if', () => {
`<div v-if="ok"/><p v-else-if="orNot"/><template v-else>fine</template>`,
)
expect(code).matchSnapshot()
expect(ir.template).lengthOf(3)
expect(ir.template).toMatchObject([
{
template: '<div></div>',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
{
template: '<p></p>',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
{
template: 'fine',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
])
expect(ir.template).toEqual(['<div></div>', '<p></p>', 'fine'])
expect(ir.returns).toEqual([1])
expect(ir.operation).toMatchObject([
@ -266,24 +214,12 @@ describe('compiler: v-if', () => {
<input v-text="text" />
`)
expect(code).matchSnapshot()
expect(ir.template).lengthOf(4)
expect(ir.template).toMatchObject([
{
template: '<div></div>',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
{
template: '<!--foo--><p></p>',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
{
template: '<!--bar-->fine',
type: IRNodeTypes.TEMPLATE_FACTORY,
},
{
type: IRNodeTypes.TEMPLATE_FACTORY,
template: '<input>',
},
expect(ir.template).toEqual([
'<div></div>',
'<!--foo--><p></p>',
'<!--bar-->fine',
'<input>',
])
})

View File

@ -63,7 +63,7 @@ describe('v-text', () => {
])
// children should have been removed
expect(ir.template).toMatchObject([{ template: '<div></div>' }])
expect(ir.template).toEqual(['<div></div>'])
expect(ir.effect).toMatchObject([
{

View File

@ -1,19 +1,15 @@
import type { CodegenContext } from '../generate'
import {
DynamicFlag,
type IRDynamicInfo,
type TemplateFactoryIRNode,
} from '../ir'
import { DynamicFlag, type IRDynamicInfo } from '../ir'
import { NEWLINE, buildCodeFragment, genCall } from './utils'
export function genTemplates(
templates: TemplateFactoryIRNode[],
templates: string[],
{ vaporHelper }: CodegenContext,
) {
return templates
.map(
(template, i) =>
`const t${i} = ${vaporHelper('template')}(${JSON.stringify(template.template)})\n`,
`const t${i} = ${vaporHelper('template')}(${JSON.stringify(template)})\n`,
)
.join('')
}

View File

@ -17,8 +17,6 @@ export enum IRNodeTypes {
ROOT,
BLOCK_FUNCTION,
TEMPLATE_FACTORY,
SET_PROP,
SET_DYNAMIC_PROPS,
SET_TEXT,
@ -58,7 +56,7 @@ export interface RootIRNode extends Omit<BlockFunctionIRNode, 'type'> {
type: IRNodeTypes.ROOT
node: RootNode
source: string
template: Array<TemplateFactoryIRNode>
template: string[]
}
export interface IfIRNode extends BaseIRNode {
@ -80,11 +78,6 @@ export interface ForIRNode extends BaseIRNode {
render: BlockFunctionIRNode
}
export interface TemplateFactoryIRNode extends BaseIRNode {
type: IRNodeTypes.TEMPLATE_FACTORY
template: string
}
export interface IRProp extends Omit<DirectiveTransformResult, 'value'> {
values: SimpleExpressionNode[]
}
@ -177,7 +170,7 @@ export interface WithDirectiveIRNode extends BaseIRNode {
builtin?: VaporHelper
}
export type IRNode = OperationNode | RootIRNode | TemplateFactoryIRNode
export type IRNode = OperationNode | RootIRNode
export type OperationNode =
| SetPropIRNode
| SetDynamicPropsIRNode

View File

@ -178,16 +178,13 @@ function createRootContext(
}
const existing = root.template.findIndex(
t => t.template === this.template,
template => template === this.template,
)
if (existing !== -1) {
return (this.block.templateIndex = existing)
}
root.template.push({
type: IRNodeTypes.TEMPLATE_FACTORY,
template: this.template,
})
root.template.push(this.template)
return (this.block.templateIndex = root.template.length - 1)
},
registerOperation(...node) {