From: Evan You Date: Wed, 2 Oct 2019 17:11:07 +0000 (-0400) Subject: feat(compiler): block optimization codegen for RootNode X-Git-Tag: v3.0.0-alpha.0~639 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=24bd6c27e08296f170ed96db982bfb20ab51ac4f;p=thirdparty%2Fvuejs%2Fcore.git feat(compiler): block optimization codegen for RootNode --- diff --git a/packages/compiler-core/__tests__/__snapshots__/codegen.spec.ts.snap b/packages/compiler-core/__tests__/__snapshots__/codegen.spec.ts.snap index 628f352e65..fa71bf319b 100644 --- a/packages/compiler-core/__tests__/__snapshots__/codegen.spec.ts.snap +++ b/packages/compiler-core/__tests__/__snapshots__/codegen.spec.ts.snap @@ -4,25 +4,16 @@ exports[`compiler: codegen ConditionalExpression 1`] = ` " return function render() { with (this) { - return (foo, ok + return ok ? foo() : orNot ? bar() - : baz()) + : baz() } }" `; -exports[`compiler: codegen SequenceExpression 1`] = ` -" -return function render() { - with (this) { - return (foo, bar(baz)) - } -}" -`; - -exports[`compiler: codegen callExpression + objectExpression + arrayExpression 1`] = ` +exports[`compiler: codegen Element (callExpression + objectExpression + arrayExpression) 1`] = ` " return function render() { with (this) { @@ -40,6 +31,15 @@ return function render() { }" `; +exports[`compiler: codegen SequenceExpression 1`] = ` +" +return function render() { + with (this) { + return (foo, bar(baz)) + } +}" +`; + exports[`compiler: codegen comment 1`] = ` " return function render() { @@ -58,6 +58,15 @@ return function render() { }" `; +exports[`compiler: codegen forNode 1`] = ` +" +return function render() { + with (this) { + return (foo, bar) + } +}" +`; + exports[`compiler: codegen function mode preamble 1`] = ` "const _Vue = Vue @@ -145,28 +154,3 @@ return function render() { } }" `; - -exports[`compiler: codegen text + comment + interpolation 1`] = ` -" -return function render() { - with (this) { - return [ - \\"foo\\", - _toString(hello), - _createVNode(_Comment, 0, \\"foo\\") - ] - } -}" -`; - -exports[`compiler: codegen text + comment + interpolation w/ prefixIdentifiers: true 1`] = ` -" -return function render() { - const _ctx = this - return [ - \\"foo\\", - toString(hello), - createVNode(Comment, 0, \\"foo\\") - ] -}" -`; diff --git a/packages/compiler-core/__tests__/__snapshots__/compile.spec.ts.snap b/packages/compiler-core/__tests__/__snapshots__/compile.spec.ts.snap index 8d7ae5dd4c..c859f8b08b 100644 --- a/packages/compiler-core/__tests__/__snapshots__/compile.spec.ts.snap +++ b/packages/compiler-core/__tests__/__snapshots__/compile.spec.ts.snap @@ -7,7 +7,7 @@ return function render() { with (this) { const { toString: _toString, openBlock: _openBlock, createVNode: _createVNode, createBlock: _createBlock, Empty: _Empty, Fragment: _Fragment, renderList: _renderList } = _Vue - return _createVNode(\\"div\\", { + return (_openBlock(), _createBlock(\\"div\\", { id: \\"foo\\", class: bar.baz }, [ @@ -22,7 +22,7 @@ return function render() { _createVNode(\\"span\\", null, _toString(value + index), 1 /* TEXT */) ])) }), 128 /* UNKEYED_FRAGMENT */)) - ], 2 /* CLASS */) + ], 2 /* CLASS */)) } }" `; @@ -32,7 +32,7 @@ exports[`compiler: integration tests function mode w/ prefixIdentifiers: true 1` return function render() { const _ctx = this - return createVNode(\\"div\\", { + return (openBlock(), createBlock(\\"div\\", { id: \\"foo\\", class: _ctx.bar.baz }, [ @@ -47,7 +47,7 @@ return function render() { createVNode(\\"span\\", null, toString(value + index), 1 /* TEXT */) ])) }), 128 /* UNKEYED_FRAGMENT */)) - ], 2 /* CLASS */) + ], 2 /* CLASS */)) }" `; @@ -56,7 +56,7 @@ exports[`compiler: integration tests module mode 1`] = ` export default function render() { const _ctx = this - return createVNode(\\"div\\", { + return (openBlock(), createBlock(\\"div\\", { id: \\"foo\\", class: _ctx.bar.baz }, [ @@ -71,6 +71,6 @@ export default function render() { createVNode(\\"span\\", null, _toString(value + index), 1 /* TEXT */) ])) }), 128 /* UNKEYED_FRAGMENT */)) - ], 2 /* CLASS */) + ], 2 /* CLASS */)) }" `; diff --git a/packages/compiler-core/__tests__/__snapshots__/parse.spec.ts.snap b/packages/compiler-core/__tests__/__snapshots__/parse.spec.ts.snap index 4076be861a..307925a31b 100644 --- a/packages/compiler-core/__tests__/__snapshots__/parse.spec.ts.snap +++ b/packages/compiler-core/__tests__/__snapshots__/parse.spec.ts.snap @@ -45,6 +45,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -110,6 +111,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -175,6 +177,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -258,6 +261,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -341,6 +345,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -424,6 +429,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -507,6 +513,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -573,6 +580,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -639,6 +647,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -705,6 +714,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -771,6 +781,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -836,6 +847,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -926,6 +938,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -992,6 +1005,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1058,6 +1072,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1124,6 +1139,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1266,6 +1282,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1337,6 +1354,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1408,6 +1426,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1474,6 +1493,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1540,6 +1560,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1611,6 +1632,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1701,6 +1723,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1766,6 +1789,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1831,6 +1855,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1896,6 +1921,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -1961,6 +1987,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -2026,6 +2053,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -2092,6 +2120,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -2158,6 +2187,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -2229,6 +2259,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -2300,6 +2331,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -2390,6 +2422,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -2480,6 +2513,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -2570,6 +2604,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -2677,6 +2712,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -2784,6 +2820,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -2891,6 +2928,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -2998,6 +3036,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -3105,6 +3144,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -3212,6 +3252,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -3319,6 +3360,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -3426,6 +3468,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -3491,6 +3534,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -3532,6 +3576,7 @@ Object { "type": 3, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -3597,6 +3642,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -3662,6 +3708,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -3727,6 +3774,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -3792,6 +3840,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -3858,6 +3907,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -3940,6 +3990,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -4006,6 +4057,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -4089,6 +4141,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -4196,6 +4249,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -4286,6 +4340,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -4376,6 +4431,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -4423,6 +4479,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -4489,6 +4546,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -4555,6 +4613,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -4621,6 +4680,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -4765,6 +4825,7 @@ class=\\"bar\\">", "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -4908,6 +4969,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -4973,6 +5035,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -5038,6 +5101,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -5103,6 +5167,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -5168,6 +5233,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -5234,6 +5300,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -5300,6 +5367,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -5366,6 +5434,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -5432,6 +5501,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -5539,6 +5609,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -5646,6 +5717,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -5753,6 +5825,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -5860,6 +5933,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -5967,6 +6041,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -6074,6 +6149,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -6181,6 +6257,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -6288,6 +6365,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -6378,6 +6456,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -6485,6 +6564,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -6550,6 +6630,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -6658,6 +6739,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -6724,6 +6806,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -6790,6 +6873,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -6855,6 +6939,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -6902,6 +6987,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -6949,6 +7035,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -7031,6 +7118,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -7097,6 +7185,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -7200,6 +7289,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -7271,6 +7361,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -7342,6 +7433,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -7384,6 +7476,7 @@ Object { "type": 2, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -7426,6 +7519,7 @@ Object { "type": 2, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -7484,6 +7578,7 @@ Object { "type": 5, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -7558,6 +7653,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -7741,6 +7837,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { @@ -7943,6 +8040,7 @@ Object { "type": 1, }, ], + "codegenNode": undefined, "hoists": Array [], "imports": Array [], "loc": Object { diff --git a/packages/compiler-core/__tests__/codegen.spec.ts b/packages/compiler-core/__tests__/codegen.spec.ts index 469e6ed3a0..49311c8f31 100644 --- a/packages/compiler-core/__tests__/codegen.spec.ts +++ b/packages/compiler-core/__tests__/codegen.spec.ts @@ -23,6 +23,7 @@ function createRoot(options: Partial = {}): RootNode { imports: [], statements: [], hoists: [], + codegenNode: undefined, loc: locStub, ...options } @@ -103,14 +104,12 @@ describe('compiler: codegen', () => { test('static text', () => { const { code } = generate( createRoot({ - children: [ - { - type: NodeTypes.TEXT, - content: 'hello', - isEmpty: false, - loc: locStub - } - ] + codegenNode: { + type: NodeTypes.TEXT, + content: 'hello', + isEmpty: false, + loc: locStub + } }) ) expect(code).toMatch(`return "hello"`) @@ -120,7 +119,7 @@ describe('compiler: codegen', () => { test('interpolation', () => { const { code } = generate( createRoot({ - children: [createInterpolation(`hello`, locStub)] + codegenNode: createInterpolation(`hello`, locStub) }) ) expect(code).toMatch(`return _${TO_STRING}(hello)`) @@ -130,380 +129,138 @@ describe('compiler: codegen', () => { test('comment', () => { const { code } = generate( createRoot({ - children: [ - { - type: NodeTypes.COMMENT, - content: 'foo', - loc: locStub - } - ] + codegenNode: { + type: NodeTypes.COMMENT, + content: 'foo', + loc: locStub + } }) ) expect(code).toMatch(`return _${CREATE_VNODE}(_${COMMENT}, 0, "foo")`) expect(code).toMatchSnapshot() }) - test('text + comment + interpolation', () => { + test('compound expression', () => { const { code } = generate( createRoot({ - children: [ - { - type: NodeTypes.TEXT, - content: 'foo', - isEmpty: false, - loc: locStub - }, - createInterpolation(`hello`, locStub), + codegenNode: createCompoundExpression([ + `_ctx.`, + createSimpleExpression(`foo`, false, locStub), + ` + `, { - type: NodeTypes.COMMENT, - content: 'foo', - loc: locStub + type: NodeTypes.INTERPOLATION, + loc: locStub, + content: createSimpleExpression(`bar`, false, locStub) } - ] + ]) }) ) - expect(code).toMatch(` - return [ - "foo", - _${TO_STRING}(hello), - _${CREATE_VNODE}(_${COMMENT}, 0, "foo") - ]`) - expect(code).toMatchSnapshot() - }) - - test('text + comment + interpolation w/ prefixIdentifiers: true', () => { - const { code } = generate( - createRoot({ - children: [ - { - type: NodeTypes.TEXT, - content: 'foo', - isEmpty: false, - loc: locStub - }, - createInterpolation(`hello`, locStub), - { - type: NodeTypes.COMMENT, - content: 'foo', - loc: locStub - } - ] - }), - { - prefixIdentifiers: true - } - ) - expect(code).toMatch(` - return [ - "foo", - ${TO_STRING}(hello), - ${CREATE_VNODE}(${COMMENT}, 0, "foo") - ]`) + expect(code).toMatch(`return _ctx.foo + _${TO_STRING}(bar)`) expect(code).toMatchSnapshot() }) - test('compound expression', () => { + test('ifNode', () => { const { code } = generate( createRoot({ - children: [ - createCompoundExpression([ - `_ctx.`, - createSimpleExpression(`foo`, false, locStub), - ` + `, - { - type: NodeTypes.INTERPOLATION, - loc: locStub, - content: createSimpleExpression(`bar`, false, locStub) - } + codegenNode: { + type: NodeTypes.IF, + loc: locStub, + branches: [], + codegenNode: createSequenceExpression([ + createSimpleExpression('foo', false), + createSimpleExpression('bar', false) ]) - ] + } }) ) - expect(code).toMatch(`return _ctx.foo + _${TO_STRING}(bar)`) + expect(code).toMatch(`return (foo, bar)`) expect(code).toMatchSnapshot() }) - test('ifNode', () => { + test('forNode', () => { const { code } = generate( createRoot({ - children: [ - { - type: NodeTypes.IF, - loc: locStub, - branches: [], - codegenNode: createSequenceExpression([ - createSimpleExpression('foo', false), - createSimpleExpression('bar', false) - ]) - } - ] + codegenNode: { + type: NodeTypes.FOR, + loc: locStub, + source: createSimpleExpression('foo', false), + valueAlias: undefined, + keyAlias: undefined, + objectIndexAlias: undefined, + children: [], + codegenNode: createSequenceExpression([ + createSimpleExpression('foo', false), + createSimpleExpression('bar', false) + ]) + } }) ) expect(code).toMatch(`return (foo, bar)`) expect(code).toMatchSnapshot() }) - // test('forNode', () => { - // const { code } = generate( - // createRoot({ - // children: [ - // { - // type: NodeTypes.FOR, - // loc: locStub, - // source: createSimpleExpression(`list`, false, locStub), - // valueAlias: createSimpleExpression(`v`, false, locStub), - // keyAlias: createSimpleExpression(`k`, false, locStub), - // objectIndexAlias: createSimpleExpression(`i`, false, locStub), - // children: [createInterpolation(`v`, locStub)] - // } - // ] - // }) - // ) - // expect(code).toMatch( - // `return _${RENDER_LIST}(list, (v, k, i) => { - // return _${TO_STRING}(v) - // })` - // ) - // expect(code).toMatchSnapshot() - // }) - - // test('forNode w/ prefixIdentifiers: true', () => { - // const { code } = generate( - // createRoot({ - // children: [ - // { - // type: NodeTypes.FOR, - // loc: locStub, - // source: createSimpleExpression(`list`, false, locStub), - // valueAlias: createSimpleExpression(`v`, false, locStub), - // keyAlias: createSimpleExpression(`k`, false, locStub), - // objectIndexAlias: createSimpleExpression(`i`, false, locStub), - // children: [createInterpolation(`v`, locStub)] - // } - // ] - // }), - // { - // prefixIdentifiers: true - // } - // ) - // expect(code).toMatch( - // `return ${RENDER_LIST}(list, (v, k, i) => { - // return ${TO_STRING}(v) - // })` - // ) - // expect(code).toMatchSnapshot() - // }) - - // test('forNode w/ skipped value alias', () => { - // const { code } = generate( - // createRoot({ - // children: [ - // { - // type: NodeTypes.FOR, - // loc: locStub, - // source: createSimpleExpression(`list`, false, locStub), - // valueAlias: undefined, - // keyAlias: createSimpleExpression(`k`, false, locStub), - // objectIndexAlias: createSimpleExpression(`i`, false, locStub), - // children: [createInterpolation(`v`, locStub)] - // } - // ] - // }) - // ) - // expect(code).toMatch( - // `return _${RENDER_LIST}(list, (__value, k, i) => { - // return _${TO_STRING}(v) - // })` - // ) - // expect(code).toMatchSnapshot() - // }) - - // test('forNode w/ skipped key alias', () => { - // const { code } = generate( - // createRoot({ - // children: [ - // { - // type: NodeTypes.FOR, - // loc: locStub, - // source: createSimpleExpression(`list`, false, locStub), - // valueAlias: createSimpleExpression(`v`, false, locStub), - // keyAlias: undefined, - // objectIndexAlias: createSimpleExpression(`i`, false, locStub), - // children: [createInterpolation(`v`, locStub)] - // } - // ] - // }) - // ) - // expect(code).toMatch( - // `return _${RENDER_LIST}(list, (v, __key, i) => { - // return _${TO_STRING}(v) - // })` - // ) - // expect(code).toMatchSnapshot() - // }) - - // test('forNode w/ skipped value and key aliases', () => { - // const { code } = generate( - // createRoot({ - // children: [ - // { - // type: NodeTypes.FOR, - // loc: locStub, - // source: createSimpleExpression(`list`, false, locStub), - // valueAlias: undefined, - // keyAlias: undefined, - // objectIndexAlias: createSimpleExpression(`i`, false, locStub), - // children: [createInterpolation(`v`, locStub)] - // } - // ] - // }) - // ) - // expect(code).toMatch( - // `return _${RENDER_LIST}(list, (__value, __key, i) => { - // return _${TO_STRING}(v) - // })` - // ) - // expect(code).toMatchSnapshot() - // }) - - // test('SlotFunctionExpression', () => { - // const { code } = generate( - // createRoot({ - // children: [ - // { - // type: NodeTypes.ELEMENT, - // tagType: ElementTypes.COMPONENT, - // ns: Namespaces.HTML, - // isSelfClosing: false, - // tag: `Comp`, - // loc: locStub, - // props: [], - // children: [], - // codegenNode: { - // type: NodeTypes.JS_CALL_EXPRESSION, - // loc: locStub, - // callee: `_${CREATE_VNODE}`, - // arguments: [ - // `Comp`, - // `0`, - // { - // type: NodeTypes.JS_OBJECT_EXPRESSION, - // loc: locStub, - // properties: [ - // { - // type: NodeTypes.JS_PROPERTY, - // loc: locStub, - // key: { - // type: NodeTypes.SIMPLE_EXPRESSION, - // isStatic: true, - // content: `default`, - // loc: locStub - // }, - // value: { - // type: NodeTypes.JS_FUNCTION_EXPRESSION, - // loc: locStub, - // params: { - // type: NodeTypes.SIMPLE_EXPRESSION, - // isStatic: false, - // content: `{ foo }`, - // loc: locStub - // }, - // returns: [ - // { - // type: NodeTypes.INTERPOLATION, - // loc: locStub, - // content: { - // type: NodeTypes.SIMPLE_EXPRESSION, - // isStatic: false, - // content: `foo`, - // loc: locStub - // } - // } - // ] - // } - // } - // ] - // } - // ] - // } - // } - // ] - // }) - // ) - // expect(code).toMatch( - // `return _createVNode(Comp, 0, { - // default: ({ foo }) => [ - // _toString(foo) - // ] - // })` - // ) - // expect(code).toMatchSnapshot() - // }) - - test('callExpression + objectExpression + arrayExpression', () => { + test('Element (callExpression + objectExpression + arrayExpression)', () => { const { code } = generate( createRoot({ - children: [ - createElementWithCodegen([ - // string - `"div"`, - // ObjectExpression - createObjectExpression( - [ - createObjectProperty( - createSimpleExpression(`id`, true, locStub), - createSimpleExpression(`foo`, true, locStub) - ), - createObjectProperty( - createSimpleExpression(`prop`, false, locStub), - createSimpleExpression(`bar`, false, locStub) - ), - // compound expression as computed key - createObjectProperty( - { - type: NodeTypes.COMPOUND_EXPRESSION, - loc: locStub, - children: [ - `foo + `, - createSimpleExpression(`bar`, false, locStub) - ] - }, - createSimpleExpression(`bar`, false, locStub) - ) - ], - locStub - ), - // ChildNode[] + codegenNode: createElementWithCodegen([ + // string + `"div"`, + // ObjectExpression + createObjectExpression( [ - createElementWithCodegen([ - `"p"`, - createObjectExpression( - [ - createObjectProperty( - // should quote the key! - createSimpleExpression(`some-key`, true, locStub), - createSimpleExpression(`foo`, true, locStub) - ) - ], - locStub - ) - ]) - ], - // ArrayExpression - createArrayExpression( - [ - 'foo', + createObjectProperty( + createSimpleExpression(`id`, true, locStub), + createSimpleExpression(`foo`, true, locStub) + ), + createObjectProperty( + createSimpleExpression(`prop`, false, locStub), + createSimpleExpression(`bar`, false, locStub) + ), + // compound expression as computed key + createObjectProperty( { - type: NodeTypes.JS_CALL_EXPRESSION, + type: NodeTypes.COMPOUND_EXPRESSION, loc: locStub, - callee: CREATE_VNODE, - arguments: [`"p"`] - } - ], - locStub - ) - ]) - ] + children: [ + `foo + `, + createSimpleExpression(`bar`, false, locStub) + ] + }, + createSimpleExpression(`bar`, false, locStub) + ) + ], + locStub + ), + // ChildNode[] + [ + createElementWithCodegen([ + `"p"`, + createObjectExpression( + [ + createObjectProperty( + // should quote the key! + createSimpleExpression(`some-key`, true, locStub), + createSimpleExpression(`foo`, true, locStub) + ) + ], + locStub + ) + ]) + ], + // ArrayExpression + createArrayExpression( + [ + 'foo', + { + type: NodeTypes.JS_CALL_EXPRESSION, + loc: locStub, + callee: CREATE_VNODE, + arguments: [`"p"`] + } + ], + locStub + ) + ]) }) ) expect(code).toMatch(` @@ -523,17 +280,10 @@ describe('compiler: codegen', () => { test('SequenceExpression', () => { const { code } = generate( createRoot({ - children: [ - { - type: NodeTypes.IF, - loc: locStub, - branches: [], - codegenNode: createSequenceExpression([ - createSimpleExpression(`foo`, false), - createCallExpression(`bar`, [`baz`]) - ]) - } - ] + codegenNode: createSequenceExpression([ + createSimpleExpression(`foo`, false), + createCallExpression(`bar`, [`baz`]) + ]) }) ) expect(code).toMatch(`return (foo, bar(baz))`) @@ -543,33 +293,23 @@ describe('compiler: codegen', () => { test('ConditionalExpression', () => { const { code } = generate( createRoot({ - children: [ - { - type: NodeTypes.IF, - loc: locStub, - branches: [], - codegenNode: createSequenceExpression([ - createSimpleExpression(`foo`, false), - createConditionalExpression( - createSimpleExpression(`ok`, false), - createCallExpression(`foo`), - createConditionalExpression( - createSimpleExpression(`orNot`, false), - createCallExpression(`bar`), - createCallExpression(`baz`) - ) - ) - ]) - } - ] + codegenNode: createConditionalExpression( + createSimpleExpression(`ok`, false), + createCallExpression(`foo`), + createConditionalExpression( + createSimpleExpression(`orNot`, false), + createCallExpression(`bar`), + createCallExpression(`baz`) + ) + ) }) ) expect(code).toMatch( - `return (foo, ok + `return ok ? foo() : orNot ? bar() - : baz())` + : baz()` ) expect(code).toMatchSnapshot() }) diff --git a/packages/compiler-core/__tests__/transforms/__snapshots__/optimizeText.spec.ts.snap b/packages/compiler-core/__tests__/transforms/__snapshots__/optimizeText.spec.ts.snap index 89da629edf..a876945f38 100644 --- a/packages/compiler-core/__tests__/transforms/__snapshots__/optimizeText.spec.ts.snap +++ b/packages/compiler-core/__tests__/transforms/__snapshots__/optimizeText.spec.ts.snap @@ -17,13 +17,13 @@ exports[`compiler: optimize interpolation consecutive text between elements 1`] return function render() { with (this) { - const { createVNode: _createVNode, toString: _toString } = _Vue + const { createVNode: _createVNode, toString: _toString, Fragment: _Fragment, openBlock: _openBlock, createBlock: _createBlock } = _Vue - return [ + return (_openBlock(), _createBlock(_Fragment, null, [ _createVNode(\\"div\\"), _toString(foo) + \\" bar \\" + _toString(baz), _createVNode(\\"div\\") - ] + ])) } }" `; @@ -33,15 +33,15 @@ exports[`compiler: optimize interpolation consecutive text mixed with elements 1 return function render() { with (this) { - const { createVNode: _createVNode, toString: _toString } = _Vue + const { createVNode: _createVNode, toString: _toString, Fragment: _Fragment, openBlock: _openBlock, createBlock: _createBlock } = _Vue - return [ + return (_openBlock(), _createBlock(_Fragment, null, [ _createVNode(\\"div\\"), _toString(foo) + \\" bar \\" + _toString(baz), _createVNode(\\"div\\"), _toString(foo) + \\" bar \\" + _toString(baz), _createVNode(\\"div\\") - ] + ])) } }" `; diff --git a/packages/compiler-core/__tests__/transforms/__snapshots__/vSlot.spec.ts.snap b/packages/compiler-core/__tests__/transforms/__snapshots__/vSlot.spec.ts.snap index d1810ae7ab..a43309a54c 100644 --- a/packages/compiler-core/__tests__/transforms/__snapshots__/vSlot.spec.ts.snap +++ b/packages/compiler-core/__tests__/transforms/__snapshots__/vSlot.spec.ts.snap @@ -1,13 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`compiler: transform component slots dynamically named slots 1`] = ` -"const { toString, resolveComponent, createVNode } = Vue +"const { toString, resolveComponent, createVNode, openBlock, createBlock } = Vue return function render() { const _ctx = this const _component_Comp = resolveComponent(\\"Comp\\") - return createVNode(_component_Comp, null, { + return (openBlock(), createBlock(_component_Comp, null, { [_ctx.one]: ({ foo }) => [ toString(foo), toString(_ctx.bar) @@ -16,49 +16,49 @@ return function render() { toString(_ctx.foo), toString(bar) ] - }, 256 /* DYNAMIC_SLOTS */) + }, 256 /* DYNAMIC_SLOTS */)) }" `; exports[`compiler: transform component slots explicit default slot 1`] = ` -"const { toString, resolveComponent, createVNode } = Vue +"const { toString, resolveComponent, createVNode, openBlock, createBlock } = Vue return function render() { const _ctx = this const _component_Comp = resolveComponent(\\"Comp\\") - return createVNode(_component_Comp, null, { + return (openBlock(), createBlock(_component_Comp, null, { default: ({ foo }) => [ toString(foo), toString(_ctx.bar) ] - }) + })) }" `; exports[`compiler: transform component slots implicit default slot 1`] = ` -"const { createVNode, resolveComponent } = Vue +"const { createVNode, resolveComponent, openBlock, createBlock } = Vue return function render() { const _ctx = this const _component_Comp = resolveComponent(\\"Comp\\") - return createVNode(_component_Comp, null, { + return (openBlock(), createBlock(_component_Comp, null, { default: () => [ createVNode(\\"div\\") ] - }) + })) }" `; exports[`compiler: transform component slots named slots 1`] = ` -"const { toString, resolveComponent, createVNode } = Vue +"const { toString, resolveComponent, createVNode, openBlock, createBlock } = Vue return function render() { const _ctx = this const _component_Comp = resolveComponent(\\"Comp\\") - return createVNode(_component_Comp, null, { + return (openBlock(), createBlock(_component_Comp, null, { one: ({ foo }) => [ toString(foo), toString(_ctx.bar) @@ -67,19 +67,19 @@ return function render() { toString(_ctx.foo), toString(bar) ] - }) + })) }" `; exports[`compiler: transform component slots nested slots scoping 1`] = ` -"const { toString, resolveComponent, createVNode } = Vue +"const { toString, resolveComponent, createVNode, openBlock, createBlock } = Vue return function render() { const _ctx = this const _component_Inner = resolveComponent(\\"Inner\\") const _component_Comp = resolveComponent(\\"Comp\\") - return createVNode(_component_Comp, null, { + return (openBlock(), createBlock(_component_Comp, null, { default: ({ foo }) => [ createVNode(_component_Inner, null, { default: ({ bar }) => [ @@ -92,6 +92,6 @@ return function render() { toString(_ctx.bar), toString(_ctx.baz) ] - }) + })) }" `; diff --git a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts index f2aed954ee..cc2f80df6b 100644 --- a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts @@ -247,6 +247,17 @@ describe('compiler: element transform', () => { }) }) + test('should handle plain