]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-core): support static slot names containing dots for 2.x compat
authorEvan You <yyx990803@gmail.com>
Fri, 12 Jun 2020 20:09:27 +0000 (16:09 -0400)
committerEvan You <yyx990803@gmail.com>
Fri, 12 Jun 2020 20:09:27 +0000 (16:09 -0400)
close #1241

packages/compiler-core/__tests__/parse.spec.ts
packages/compiler-core/src/parse.ts

index 63201c4f4d9dfa8750594406bb402fb9fd9a46b1..7f12a70099d7af57ea33392e4b698a68a73f39fa 100644 (file)
@@ -1401,6 +1401,36 @@ describe('compiler: parse', () => {
       })
     })
 
+    // #1241 special case for 2.x compat
+    test('v-slot arg containing dots', () => {
+      const ast = baseParse('<Comp v-slot:foo.bar="{ a }" />')
+      const directive = (ast.children[0] as ElementNode).props[0]
+
+      expect(directive).toMatchObject({
+        type: NodeTypes.DIRECTIVE,
+        name: 'slot',
+        arg: {
+          type: NodeTypes.SIMPLE_EXPRESSION,
+          content: 'foo.bar',
+          isStatic: true,
+          isConstant: true,
+          loc: {
+            source: 'foo.bar',
+            start: {
+              column: 14,
+              line: 1,
+              offset: 13
+            },
+            end: {
+              column: 21,
+              line: 1,
+              offset: 20
+            }
+          }
+        }
+      })
+    })
+
     test('v-pre', () => {
       const ast = baseParse(
         `<div v-pre :id="foo"><Comp/>{{ bar }}</div>\n` +
index b7725cff007fa8043954a9d185011dce23a15b57..4a7dc541e265120dcf2c9ac6ad25d2de21c63bd5 100644 (file)
@@ -603,14 +603,23 @@ function parseAttribute(
       name
     )!
 
+    const dirName =
+      match[1] ||
+      (startsWith(name, ':') ? 'bind' : startsWith(name, '@') ? 'on' : 'slot')
+
     let arg: ExpressionNode | undefined
 
     if (match[2]) {
+      const isSlot = dirName === 'slot'
       const startOffset = name.indexOf(match[2])
       const loc = getSelection(
         context,
         getNewPosition(context, start, startOffset),
-        getNewPosition(context, start, startOffset + match[2].length)
+        getNewPosition(
+          context,
+          start,
+          startOffset + match[2].length + ((isSlot && match[3]) || '').length
+        )
       )
       let content = match[2]
       let isStatic = true
@@ -626,6 +635,11 @@ function parseAttribute(
         }
 
         content = content.substr(1, content.length - 2)
+      } else if (isSlot) {
+        // #1241 special case for v-slot: vuetify relies extensively on slot
+        // names containing dots. v-slot doesn't have any modifiers and Vue 2.x
+        // supports such usage so we are keeping it consistent with 2.x.
+        content += match[3] || ''
       }
 
       arg = {
@@ -647,13 +661,7 @@ function parseAttribute(
 
     return {
       type: NodeTypes.DIRECTIVE,
-      name:
-        match[1] ||
-        (startsWith(name, ':')
-          ? 'bind'
-          : startsWith(name, '@')
-            ? 'on'
-            : 'slot'),
+      name: dirName,
       exp: value && {
         type: NodeTypes.SIMPLE_EXPRESSION,
         content: value.content,