diff --git a/packages/compiler-core/__tests__/utils.spec.ts b/packages/compiler-core/__tests__/utils.spec.ts index d68c3f694d7..e5846ba0889 100644 --- a/packages/compiler-core/__tests__/utils.spec.ts +++ b/packages/compiler-core/__tests__/utils.spec.ts @@ -104,4 +104,5 @@ test('isMemberExpression', () => { expect(isMemberExpression('a + b')).toBe(false) expect(isMemberExpression('foo()')).toBe(false) expect(isMemberExpression('a?b:c')).toBe(false) + expect(isMemberExpression(`state['text'] = $event`)).toBe(false) }) diff --git a/packages/compiler-core/src/utils.ts b/packages/compiler-core/src/utils.ts index 74c9ee907e1..e9e214f277f 100644 --- a/packages/compiler-core/src/utils.ts +++ b/packages/compiler-core/src/utils.ts @@ -77,7 +77,7 @@ export const isMemberExpression = (path: string): boolean => { path = path.trim().replace(whitespaceRE, s => s.trim()) let state = MemberExpLexState.inMemberExp - let prevState = MemberExpLexState.inMemberExp + let stateStack: MemberExpLexState[] = [] let currentOpenBracketCount = 0 let currentStringType: "'" | '"' | '`' | null = null @@ -86,7 +86,7 @@ export const isMemberExpression = (path: string): boolean => { switch (state) { case MemberExpLexState.inMemberExp: if (char === '[') { - prevState = state + stateStack.push(state) state = MemberExpLexState.inBrackets currentOpenBracketCount++ } else if ( @@ -97,20 +97,20 @@ export const isMemberExpression = (path: string): boolean => { break case MemberExpLexState.inBrackets: if (char === `'` || char === `"` || char === '`') { - prevState = state + stateStack.push(state) state = MemberExpLexState.inString currentStringType = char } else if (char === `[`) { currentOpenBracketCount++ } else if (char === `]`) { if (!--currentOpenBracketCount) { - state = prevState + state = stateStack.pop()! } } break case MemberExpLexState.inString: if (char === currentStringType) { - state = prevState + state = stateStack.pop()! currentStringType = null } break