Skip to content

Commit 395572b

Browse files
committed
fix(v-on): proper member exp detection for bracket assignment
fix #4097
1 parent c0db807 commit 395572b

File tree

2 files changed

+6
-5
lines changed

2 files changed

+6
-5
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,5 @@ test('isMemberExpression', () => {
104104
expect(isMemberExpression('a + b')).toBe(false)
105105
expect(isMemberExpression('foo()')).toBe(false)
106106
expect(isMemberExpression('a?b:c')).toBe(false)
107+
expect(isMemberExpression(`state['text'] = $event`)).toBe(false)
107108
})

packages/compiler-core/src/utils.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export const isMemberExpression = (path: string): boolean => {
7777
path = path.trim().replace(whitespaceRE, s => s.trim())
7878

7979
let state = MemberExpLexState.inMemberExp
80-
let prevState = MemberExpLexState.inMemberExp
80+
let stateStack: MemberExpLexState[] = []
8181
let currentOpenBracketCount = 0
8282
let currentStringType: "'" | '"' | '`' | null = null
8383

@@ -86,7 +86,7 @@ export const isMemberExpression = (path: string): boolean => {
8686
switch (state) {
8787
case MemberExpLexState.inMemberExp:
8888
if (char === '[') {
89-
prevState = state
89+
stateStack.push(state)
9090
state = MemberExpLexState.inBrackets
9191
currentOpenBracketCount++
9292
} else if (
@@ -97,20 +97,20 @@ export const isMemberExpression = (path: string): boolean => {
9797
break
9898
case MemberExpLexState.inBrackets:
9999
if (char === `'` || char === `"` || char === '`') {
100-
prevState = state
100+
stateStack.push(state)
101101
state = MemberExpLexState.inString
102102
currentStringType = char
103103
} else if (char === `[`) {
104104
currentOpenBracketCount++
105105
} else if (char === `]`) {
106106
if (!--currentOpenBracketCount) {
107-
state = prevState
107+
state = stateStack.pop()!
108108
}
109109
}
110110
break
111111
case MemberExpLexState.inString:
112112
if (char === currentStringType) {
113-
state = prevState
113+
state = stateStack.pop()!
114114
currentStringType = null
115115
}
116116
break

0 commit comments

Comments
 (0)