]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: force re-parse on reused sfc template ast
authorEvan You <yyx990803@gmail.com>
Tue, 21 Nov 2023 14:28:06 +0000 (22:28 +0800)
committerEvan You <yyx990803@gmail.com>
Sat, 25 Nov 2023 08:18:29 +0000 (16:18 +0800)
packages/compiler-sfc/src/compileTemplate.ts

index d8c1059087f67480b5731f38b8e0aa9ff893b0de..30d30072bfe2a6d4736794d0962c87fd565ff011 100644 (file)
@@ -4,7 +4,10 @@ import {
   CompilerError,
   NodeTransform,
   ParserOptions,
-  RootNode
+  RootNode,
+  NodeTypes,
+  ElementNode,
+  createRoot
 } from '@vue/compiler-core'
 import {
   SourceMapConsumer,
@@ -202,6 +205,19 @@ function doCompileTemplate({
   const shortId = id.replace(/^data-v-/, '')
   const longId = `data-v-${shortId}`
 
+  if (inAST?.codegenNode) {
+    // input AST has codegenNode - it has already been transformed and cannot
+    // be reused. We need to parse a fresh one.
+    const newAST = compiler.parse(inAST.source, {
+      parseMode: 'sfc',
+      onError: e => errors.push(e)
+    })
+    const template = newAST.children.find(
+      node => node.type === NodeTypes.ELEMENT && node.tag === 'template'
+    ) as ElementNode
+    inAST = createRoot(template.children, inAST.source)
+  }
+
   let { code, ast, preamble, map } = compiler.compile(inAST || source, {
     mode: 'module',
     prefixIdentifiers: true,