Skip to content

Commit c79629f

Browse files
authored
fix(compiler-vapor): member expression with assignment (#146)
1 parent ebd3710 commit c79629f

File tree

3 files changed

+79
-3
lines changed

3 files changed

+79
-3
lines changed

packages/compiler-vapor/__tests__/transforms/__snapshots__/vModel.spec.ts.snap

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,39 @@ export function render(_ctx) {
8484
}"
8585
`;
8686
87+
exports[`compiler: vModel transform > should support member expression 1`] = `
88+
"import { vModelText as _vModelText, withDirectives as _withDirectives, delegate as _delegate, template as _template } from 'vue/vapor';
89+
const t0 = _template("<input>")
90+
91+
export function render(_ctx) {
92+
const n0 = t0()
93+
const n1 = t0()
94+
const n2 = t0()
95+
_withDirectives(n0, [[_vModelText, () => _ctx.setupRef.child]])
96+
_withDirectives(n1, [[_vModelText, () => _ctx.setupLet.child]])
97+
_withDirectives(n2, [[_vModelText, () => _ctx.setupMaybeRef.child]])
98+
_delegate(n0, "update:modelValue", () => $event => (_ctx.setupRef.child = $event))
99+
_delegate(n1, "update:modelValue", () => $event => (_ctx.setupLet.child = $event))
100+
_delegate(n2, "update:modelValue", () => $event => (_ctx.setupMaybeRef.child = $event))
101+
return [n0, n1, n2]
102+
}"
103+
`;
104+
105+
exports[`compiler: vModel transform > should support member expression w/ inline 1`] = `
106+
"(() => {
107+
const n0 = t0()
108+
const n1 = t0()
109+
const n2 = t0()
110+
_withDirectives(n0, [[_vModelText, () => setupRef.value.child]])
111+
_withDirectives(n1, [[_vModelText, () => _unref(setupLet).child]])
112+
_withDirectives(n2, [[_vModelText, () => _unref(setupMaybeRef).child]])
113+
_delegate(n0, "update:modelValue", () => $event => (setupRef.value.child = $event))
114+
_delegate(n1, "update:modelValue", () => $event => (_unref(setupLet).child = $event))
115+
_delegate(n2, "update:modelValue", () => $event => (_unref(setupMaybeRef).child = $event))
116+
return [n0, n1, n2]
117+
})()"
118+
`;
119+
87120
exports[`compiler: vModel transform > should support select 1`] = `
88121
"import { vModelSelect as _vModelSelect, withDirectives as _withDirectives, delegate as _delegate, template as _template } from 'vue/vapor';
89122
const t0 = _template("<select></select>")

packages/compiler-vapor/__tests__/transforms/vModel.spec.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { makeCompile } from './_utils'
22
import { transformChildren, transformElement, transformVModel } from '../../src'
3-
import { DOMErrorCodes } from '@vue/compiler-dom'
3+
import { BindingTypes, DOMErrorCodes } from '@vue/compiler-dom'
44

55
const compileWithVModel = makeCompile({
66
nodeTransforms: [transformElement, transformChildren],
@@ -171,4 +171,35 @@ describe('compiler: vModel transform', () => {
171171
expect(code).toMatchSnapshot()
172172
})
173173
})
174+
175+
test('should support member expression', () => {
176+
const { code } = compileWithVModel(
177+
'<input v-model="setupRef.child" /><input v-model="setupLet.child" /><input v-model="setupMaybeRef.child" />',
178+
{
179+
bindingMetadata: {
180+
setupRef: BindingTypes.SETUP_REF,
181+
setupLet: BindingTypes.SETUP_LET,
182+
setupMaybeRef: BindingTypes.SETUP_MAYBE_REF,
183+
},
184+
},
185+
)
186+
187+
expect(code).toMatchSnapshot()
188+
})
189+
190+
test('should support member expression w/ inline', () => {
191+
const { code } = compileWithVModel(
192+
'<input v-model="setupRef.child" /><input v-model="setupLet.child" /><input v-model="setupMaybeRef.child" />',
193+
{
194+
bindingMetadata: {
195+
setupRef: BindingTypes.SETUP_REF,
196+
setupLet: BindingTypes.SETUP_LET,
197+
setupMaybeRef: BindingTypes.SETUP_MAYBE_REF,
198+
},
199+
inline: true,
200+
},
201+
)
202+
203+
expect(code).toMatchSnapshot()
204+
})
174205
})

packages/compiler-vapor/src/generators/expression.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export function genExpression(
5656
false,
5757
parentStack,
5858
)
59+
let hasMemberExpression = false
5960
if (ids.length) {
6061
ids.sort((a, b) => a.start! - b.start!)
6162
const [frag, push] = buildCodeFragment()
@@ -70,6 +71,13 @@ export function genExpression(
7071

7172
const source = rawExpr.slice(start, end)
7273
const parentStack = parentStackMap.get(id)!
74+
const parent = parentStack[parentStack.length - 1]
75+
76+
hasMemberExpression ||=
77+
parent &&
78+
(parent.type === 'MemberExpression' ||
79+
parent.type === 'OptionalMemberExpression')
80+
7381
push(
7482
...genIdentifier(
7583
source,
@@ -79,9 +87,9 @@ export function genExpression(
7987
end: advancePositionWithClone(node.loc.start, source, end),
8088
source,
8189
},
82-
assignment,
90+
hasMemberExpression ? undefined : assignment,
8391
id,
84-
parentStack[parentStack.length - 1],
92+
parent,
8593
parentStack,
8694
),
8795
)
@@ -90,6 +98,10 @@ export function genExpression(
9098
push([rawExpr.slice(end), NewlineType.Unknown])
9199
}
92100
})
101+
102+
if (assignment && hasMemberExpression) {
103+
push(` = ${assignment}`)
104+
}
93105
return frag
94106
} else {
95107
return [[rawExpr, NewlineType.Unknown, loc]]

0 commit comments

Comments
 (0)