Browse Source

fix(v-on): properly detect member expressions with optional chaining

fix #4107
Evan You 4 years ago
parent
commit
963085d18c

+ 2 - 0
packages/compiler-core/__tests__/utils.spec.ts

@@ -85,6 +85,7 @@ test('isMemberExpression', () => {
   expect(isMemberExpression('obj[1][2]')).toBe(true)
   expect(isMemberExpression('obj[1][2].foo[3].bar.baz')).toBe(true)
   expect(isMemberExpression(`a[b[c.d]][0]`)).toBe(true)
+  expect(isMemberExpression('obj?.foo')).toBe(true)
 
   // strings
   expect(isMemberExpression(`a['foo' + bar[baz]["qux"]]`)).toBe(true)
@@ -102,4 +103,5 @@ test('isMemberExpression', () => {
   expect(isMemberExpression('123[a]')).toBe(false)
   expect(isMemberExpression('a + b')).toBe(false)
   expect(isMemberExpression('foo()')).toBe(false)
+  expect(isMemberExpression('a?b:c')).toBe(false)
 })

+ 1 - 1
packages/compiler-core/src/utils.ts

@@ -63,7 +63,7 @@ const enum MemberExpLexState {
 }
 
 const validFirstIdentCharRE = /[A-Za-z_$\xA0-\uFFFF]/
-const validIdentCharRE = /[\.\w$\xA0-\uFFFF]/
+const validIdentCharRE = /[\.\?\w$\xA0-\uFFFF]/
 const whitespaceRE = /\s+[.[]\s*|\s*[.[]\s+/g
 
 /**