From: Evan You Date: Tue, 21 Nov 2023 14:28:06 +0000 (+0800) Subject: wip: force re-parse on reused sfc template ast X-Git-Tag: v3.4.0-alpha.2~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b6886a80b1fe37eec06973931b66233c82c14cd9;p=thirdparty%2Fvuejs%2Fcore.git wip: force re-parse on reused sfc template ast --- diff --git a/packages/compiler-sfc/src/compileTemplate.ts b/packages/compiler-sfc/src/compileTemplate.ts index d8c1059087..30d30072bf 100644 --- a/packages/compiler-sfc/src/compileTemplate.ts +++ b/packages/compiler-sfc/src/compileTemplate.ts @@ -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,