Pārlūkot izejas kodu

fix(compiler-core): fix bail constant for globals

Evan You 2 gadi atpakaļ
vecāks
revīzija
fefce06b41

+ 15 - 0
packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts

@@ -431,6 +431,21 @@ describe('compiler: expression transform', () => {
     })
   })
 
+  test('should not bail constant on strings w/ ()', () => {
+    const node = parseWithExpressionTransform(
+      `{{ new Date().getFullYear() }}`,
+    ) as InterpolationNode
+    expect(node.content).toMatchObject({
+      children: [
+        'new ',
+        { constType: ConstantTypes.NOT_CONSTANT },
+        '().',
+        { constType: ConstantTypes.NOT_CONSTANT },
+        '()',
+      ],
+    })
+  })
+
   describe('ES Proposals support', () => {
     test('bigInt', () => {
       const node = parseWithExpressionTransform(

+ 6 - 1
packages/compiler-core/src/transforms/transformExpression.ts

@@ -311,7 +311,12 @@ export function processExpression(
       } else {
         // The identifier is considered constant unless it's pointing to a
         // local scope variable (a v-for alias, or a v-slot prop)
-        if (!(needPrefix && isLocal)) {
+        if (
+          !(needPrefix && isLocal) &&
+          parent.type !== 'CallExpression' &&
+          parent.type !== 'NewExpression' &&
+          parent.type !== 'MemberExpression'
+        ) {
           ;(node as QualifiedId).isConstant = true
         }
         // also generate sub-expressions for other identifiers for better