fix(v-on): proper member exp detection for bracket assignment

fix #4097
This commit is contained in:
Evan You 2021-07-15 13:26:09 -04:00
parent c0db807844
commit 395572b593
2 changed files with 6 additions and 5 deletions

View File

@ -104,4 +104,5 @@ test('isMemberExpression', () => {
expect(isMemberExpression('a + b')).toBe(false) expect(isMemberExpression('a + b')).toBe(false)
expect(isMemberExpression('foo()')).toBe(false) expect(isMemberExpression('foo()')).toBe(false)
expect(isMemberExpression('a?b:c')).toBe(false) expect(isMemberExpression('a?b:c')).toBe(false)
expect(isMemberExpression(`state['text'] = $event`)).toBe(false)
}) })

View File

@ -77,7 +77,7 @@ export const isMemberExpression = (path: string): boolean => {
path = path.trim().replace(whitespaceRE, s => s.trim()) path = path.trim().replace(whitespaceRE, s => s.trim())
let state = MemberExpLexState.inMemberExp let state = MemberExpLexState.inMemberExp
let prevState = MemberExpLexState.inMemberExp let stateStack: MemberExpLexState[] = []
let currentOpenBracketCount = 0 let currentOpenBracketCount = 0
let currentStringType: "'" | '"' | '`' | null = null let currentStringType: "'" | '"' | '`' | null = null
@ -86,7 +86,7 @@ export const isMemberExpression = (path: string): boolean => {
switch (state) { switch (state) {
case MemberExpLexState.inMemberExp: case MemberExpLexState.inMemberExp:
if (char === '[') { if (char === '[') {
prevState = state stateStack.push(state)
state = MemberExpLexState.inBrackets state = MemberExpLexState.inBrackets
currentOpenBracketCount++ currentOpenBracketCount++
} else if ( } else if (
@ -97,20 +97,20 @@ export const isMemberExpression = (path: string): boolean => {
break break
case MemberExpLexState.inBrackets: case MemberExpLexState.inBrackets:
if (char === `'` || char === `"` || char === '`') { if (char === `'` || char === `"` || char === '`') {
prevState = state stateStack.push(state)
state = MemberExpLexState.inString state = MemberExpLexState.inString
currentStringType = char currentStringType = char
} else if (char === `[`) { } else if (char === `[`) {
currentOpenBracketCount++ currentOpenBracketCount++
} else if (char === `]`) { } else if (char === `]`) {
if (!--currentOpenBracketCount) { if (!--currentOpenBracketCount) {
state = prevState state = stateStack.pop()!
} }
} }
break break
case MemberExpLexState.inString: case MemberExpLexState.inString:
if (char === currentStringType) { if (char === currentStringType) {
state = prevState state = stateStack.pop()!
currentStringType = null currentStringType = null
} }
break break