Skip to content

Commit 8fd9e9b

Browse files
committed
test(compiler-core): test TempalteLiteral and IfStatement codegen
1 parent 5dc374a commit 8fd9e9b

File tree

3 files changed

+185
-4
lines changed

3 files changed

+185
-4
lines changed

packages/compiler-core/__tests__/codegen.spec.ts

+133-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ import {
1414
createConditionalExpression,
1515
IfCodegenNode,
1616
ForCodegenNode,
17-
createCacheExpression
17+
createCacheExpression,
18+
createTemplateLiteral,
19+
createBlockStatement,
20+
createIfStatement
1821
} from '../src'
1922
import {
2023
CREATE_VNODE,
@@ -407,4 +410,133 @@ describe('compiler: codegen', () => {
407410
)
408411
expect(code).toMatchSnapshot()
409412
})
413+
414+
test('TemplateLiteral', () => {
415+
const { code } = generate(
416+
createRoot({
417+
codegenNode: createCallExpression(`_push`, [
418+
createTemplateLiteral([
419+
`foo`,
420+
createCallExpression(`_renderAttr`, ['id', 'foo']),
421+
`bar`
422+
])
423+
])
424+
}),
425+
{ ssr: true, mode: 'module' }
426+
)
427+
expect(code).toMatchInlineSnapshot(`
428+
"
429+
export function ssrRender(_ctx, _push, _parent) {
430+
_push(\`foo\${_renderAttr(id, foo)}bar\`)
431+
}"
432+
`)
433+
})
434+
435+
describe('IfStatement', () => {
436+
test('if', () => {
437+
const { code } = generate(
438+
createRoot({
439+
codegenNode: createBlockStatement([
440+
createIfStatement(
441+
createSimpleExpression('foo', false),
442+
createBlockStatement([createCallExpression(`ok`)])
443+
)
444+
])
445+
}),
446+
{ ssr: true, mode: 'module' }
447+
)
448+
expect(code).toMatchInlineSnapshot(`
449+
"
450+
export function ssrRender(_ctx, _push, _parent) {
451+
if (foo) {
452+
ok()
453+
}
454+
}"
455+
`)
456+
})
457+
458+
test('if/else', () => {
459+
const { code } = generate(
460+
createRoot({
461+
codegenNode: createBlockStatement([
462+
createIfStatement(
463+
createSimpleExpression('foo', false),
464+
createBlockStatement([createCallExpression(`foo`)]),
465+
createBlockStatement([createCallExpression('bar')])
466+
)
467+
])
468+
}),
469+
{ ssr: true, mode: 'module' }
470+
)
471+
expect(code).toMatchInlineSnapshot(`
472+
"
473+
export function ssrRender(_ctx, _push, _parent) {
474+
if (foo) {
475+
foo()
476+
} else {
477+
bar()
478+
}
479+
}"
480+
`)
481+
})
482+
483+
test('if/else-if', () => {
484+
const { code } = generate(
485+
createRoot({
486+
codegenNode: createBlockStatement([
487+
createIfStatement(
488+
createSimpleExpression('foo', false),
489+
createBlockStatement([createCallExpression(`foo`)]),
490+
createIfStatement(
491+
createSimpleExpression('bar', false),
492+
createBlockStatement([createCallExpression(`bar`)])
493+
)
494+
)
495+
])
496+
}),
497+
{ ssr: true, mode: 'module' }
498+
)
499+
expect(code).toMatchInlineSnapshot(`
500+
"
501+
export function ssrRender(_ctx, _push, _parent) {
502+
if (foo) {
503+
foo()
504+
} else if (bar) {
505+
bar()
506+
}
507+
}"
508+
`)
509+
})
510+
511+
test('if/else-if/else', () => {
512+
const { code } = generate(
513+
createRoot({
514+
codegenNode: createBlockStatement([
515+
createIfStatement(
516+
createSimpleExpression('foo', false),
517+
createBlockStatement([createCallExpression(`foo`)]),
518+
createIfStatement(
519+
createSimpleExpression('bar', false),
520+
createBlockStatement([createCallExpression(`bar`)]),
521+
createBlockStatement([createCallExpression('baz')])
522+
)
523+
)
524+
])
525+
}),
526+
{ ssr: true, mode: 'module' }
527+
)
528+
expect(code).toMatchInlineSnapshot(`
529+
"
530+
export function ssrRender(_ctx, _push, _parent) {
531+
if (foo) {
532+
foo()
533+
} else if (bar) {
534+
bar()
535+
} else {
536+
baz()
537+
}
538+
}"
539+
`)
540+
})
541+
})
410542
})

packages/compiler-core/src/ast.ts

+25-1
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ export interface IfStatement extends Node {
329329
type: NodeTypes.JS_IF_STATEMENT
330330
test: ExpressionNode
331331
consequent: BlockStatement
332-
alternate: IfStatement | BlockStatement
332+
alternate: IfStatement | BlockStatement | undefined
333333
}
334334

335335
// Codegen Node Types ----------------------------------------------------------
@@ -671,6 +671,16 @@ export function createCacheExpression(
671671
}
672672
}
673673

674+
export function createBlockStatement(
675+
body: BlockStatement['body']
676+
): BlockStatement {
677+
return {
678+
type: NodeTypes.JS_BLOCK_STATEMENT,
679+
body,
680+
loc: locStub
681+
}
682+
}
683+
674684
export function createTemplateLiteral(
675685
elements: TemplateLiteral['elements']
676686
): TemplateLiteral {
@@ -680,3 +690,17 @@ export function createTemplateLiteral(
680690
loc: locStub
681691
}
682692
}
693+
694+
export function createIfStatement(
695+
test: IfStatement['test'],
696+
consequent: IfStatement['consequent'],
697+
alternate?: IfStatement['alternate']
698+
): IfStatement {
699+
return {
700+
type: NodeTypes.JS_IF_STATEMENT,
701+
test,
702+
consequent,
703+
alternate,
704+
loc: locStub
705+
}
706+
}

packages/compiler-core/src/codegen.ts

+27-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ import {
2020
CacheExpression,
2121
locStub,
2222
SSRCodegenNode,
23-
TemplateLiteral
23+
TemplateLiteral,
24+
IfStatement
2425
} from './ast'
2526
import { SourceMapGenerator, RawSourceMap } from 'source-map'
2627
import {
@@ -489,7 +490,7 @@ function genNode(node: CodegenNode | symbol | string, context: CodegenContext) {
489490
!__BROWSER__ && genTemplateLiteral(node, context)
490491
break
491492
case NodeTypes.JS_IF_STATEMENT:
492-
// TODO
493+
!__BROWSER__ && genIfStatement(node, context)
493494
break
494495

495496
/* istanbul ignore next */
@@ -731,3 +732,27 @@ function genTemplateLiteral(node: TemplateLiteral, context: CodegenContext) {
731732
}
732733
push('`')
733734
}
735+
736+
function genIfStatement(node: IfStatement, context: CodegenContext) {
737+
const { push, indent, deindent } = context
738+
const { test, consequent, alternate } = node
739+
push(`if (`)
740+
genNode(test, context)
741+
push(`) {`)
742+
indent()
743+
genNode(consequent, context)
744+
deindent()
745+
push(`}`)
746+
if (alternate) {
747+
push(` else `)
748+
if (alternate.type === NodeTypes.JS_IF_STATEMENT) {
749+
genIfStatement(alternate, context)
750+
} else {
751+
push(`{`)
752+
indent()
753+
genNode(alternate, context)
754+
deindent()
755+
push(`}`)
756+
}
757+
}
758+
}

0 commit comments

Comments
 (0)