Skip to content

Commit

Permalink
fix(compiler-vapor): properly cache variable used in object shorthand
Browse files Browse the repository at this point in the history
  • Loading branch information
edison1105 committed Feb 6, 2025
1 parent 99d70dd commit 3048b7a
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html

exports[`cache multiple access > cache variable used in both object shorthand and normal binding 1`] = `
"import { setStyle as _setStyle, setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("<div></div>", true)
export function render(_ctx) {
const n0 = t0()
_renderEffect(() => {
const _color = _ctx.color
_setStyle(n0, {color: _color})
_setProp(n0, "id", _color)
})
return n0
}"
`;

exports[`cache multiple access > dynamic key bindings with expressions 1`] = `
"import { setDynamicProps as _setDynamicProps, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("<div></div>", true)
Expand Down Expand Up @@ -60,6 +75,17 @@ export function render(_ctx) {
}"
`;

exports[`cache multiple access > not cache variable only used in object shorthand 1`] = `
"import { setStyle as _setStyle, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("<div></div>", true)
export function render(_ctx) {
const n0 = t0()
_renderEffect(() => _setStyle(n0, {color: _ctx.color}))
return n0
}"
`;

exports[`cache multiple access > object property chain access 1`] = `
"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("<div></div>")
Expand Down
17 changes: 17 additions & 0 deletions packages/compiler-vapor/__tests__/transforms/vBind.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -785,6 +785,23 @@ describe('cache multiple access', () => {
expect(code).contains('_setProp(n0, "id", _obj[1][_ctx.baz] + _obj.bar)')
})

test('cache variable used in both object shorthand and normal binding', () => {
const { code } = compileWithVBind(`
<div :style="{color}" :id="color"/>
`)
expect(code).matchSnapshot()
expect(code).contains('const _color = _ctx.color')
expect(code).contains('_setStyle(n0, {color: _color})')
})

test('not cache variable only used in object shorthand', () => {
const { code } = compileWithVBind(`
<div :style="{color}" />
`)
expect(code).matchSnapshot()
expect(code).not.contains('const _color = _ctx.color')
})

test('not cache variable and member expression with the same name', () => {
const { code } = compileWithVBind(`
<div :id="bar + obj.bar"></div>
Expand Down
17 changes: 15 additions & 2 deletions packages/compiler-vapor/src/generators/expression.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,11 @@ function genIdentifier(
if (idMap && idMap.length) {
const replacement = idMap[0]
if (isString(replacement)) {
return [[replacement, NewlineType.None, loc]]
if (parent && parent.type === 'ObjectProperty' && parent.shorthand) {
return [[`${name}: ${replacement}`, NewlineType.None, loc]]
} else {
return [[replacement, NewlineType.None, loc]]
}
} else {
// replacement is an expression - process it again
return genExpression(replacement, context, assignment)
Expand Down Expand Up @@ -292,7 +296,7 @@ function analyzeExpressions(expressions: SimpleExpressionNode[]) {
}

walk(exp.ast, {
enter(currentNode: Node) {
enter(currentNode: Node, parent: Node | null) {
if (currentNode.type === 'MemberExpression') {
const memberExp = extractMemberExpression(
currentNode,
Expand All @@ -304,6 +308,15 @@ function analyzeExpressions(expressions: SimpleExpressionNode[]) {
return this.skip()
}

if (
parent &&
parent.type === 'ObjectProperty' &&
parent.shorthand &&
parent.key === currentNode
) {
return this.skip()
}

if (currentNode.type === 'Identifier') {
registerVariable(currentNode.name, exp, true)
}
Expand Down

0 comments on commit 3048b7a

Please sign in to comment.