Skip to content

Commit 092c73a

Browse files
authored
fix(compiler-vapor): handle TSNonNullExpression and improve expression processing (#14097)
1 parent 4778395 commit 092c73a

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

3+
exports[`cache multiple access > TSNonNullExpression 1`] = `
4+
"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
5+
const t0 = _template("<div></div>", true)
6+
7+
export function render(_ctx) {
8+
const n0 = t0()
9+
_renderEffect(() => {
10+
const _obj = _ctx.obj
11+
_setProp(n0, "id", _obj.foo + _obj.bar)
12+
})
13+
return n0
14+
}"
15+
`;
16+
317
exports[`cache multiple access > cache variable used in both property shorthand and normal binding 1`] = `
418
"import { setStyle as _setStyle, setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
519
const t0 = _template("<div></div>", true)

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,13 @@ describe('cache multiple access', () => {
836836
expect(code).contains('_setProp(n0, "id", _obj?.foo + _obj?.bar)')
837837
})
838838

839+
test('TSNonNullExpression', () => {
840+
const { code } = compileWithVBind(`<div :id="obj!.foo + obj!.bar"></div>`)
841+
expect(code).matchSnapshot()
842+
expect(code).contains('const _obj = _ctx.obj')
843+
expect(code).contains('_setProp(n0, "id", _obj.foo + _obj.bar)')
844+
})
845+
839846
test('not cache variable only used in property shorthand', () => {
840847
const { code } = compileWithVBind(`
841848
<div :style="{color}" />

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,10 @@ function processRepeatedExpressions(
513513
const declarations: DeclarationValue[] = []
514514
const seenExp = expressions.reduce(
515515
(acc, exp) => {
516-
const variables = expToVariableMap.get(exp)!.map(v => v.name)
516+
const vars = expToVariableMap.get(exp)
517+
if (!vars) return acc
518+
519+
const variables = vars.map(v => v.name)
517520
// only handle expressions that are not identifiers
518521
if (
519522
exp.ast &&
@@ -673,13 +676,17 @@ function extractMemberExpression(
673676
? `[${extractMemberExpression(exp.property, onIdentifier)}]`
674677
: `.${extractMemberExpression(exp.property, NOOP)}`
675678
return `${object}${prop}`
679+
case 'TSNonNullExpression': // foo!.bar
680+
return `${extractMemberExpression(exp.expression, onIdentifier)}!`
676681
default:
677682
return ''
678683
}
679684
}
680685

681686
const isMemberExpression = (node: Node) => {
682687
return (
683-
node.type === 'MemberExpression' || node.type === 'OptionalMemberExpression'
688+
node.type === 'MemberExpression' ||
689+
node.type === 'OptionalMemberExpression' ||
690+
node.type === 'TSNonNullExpression'
684691
)
685692
}

0 commit comments

Comments
 (0)