From 432d222f7e1c247a478a0a72ab67a2afe655b5d3 Mon Sep 17 00:00:00 2001 From: deantiwang Date: Mon, 27 Nov 2023 21:25:51 +0800 Subject: [PATCH] fix(compiler-sfc): support compiling SequenceExpression for defineEmits/defineProps --- packages/compiler-sfc/src/compileScript.ts | 76 +++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index abb6d8b1370..d734ee7391f 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -299,6 +299,9 @@ export function compileScript( } function processDefineProps(node: Node, declId?: LVal): boolean { + if (isSequenceOf(node, DEFINE_PROPS)) { + return processDefineProps(getSequenceResult(node) as Node, declId) + } if (!isCallOf(node, DEFINE_PROPS)) { return false } @@ -381,6 +384,9 @@ export function compileScript( } function processDefineEmits(node: Node, declId?: LVal): boolean { + if (isSequenceOf(node, DEFINE_EMITS)) { + return processDefineEmits(getSequenceResult(node) as Node, declId) + } if (!isCallOf(node, DEFINE_EMITS)) { return false } @@ -904,9 +910,28 @@ export function compileScript( processDefineProps(decl.init, decl.id) || processWithDefaults(decl.init, decl.id) const isDefineEmits = processDefineEmits(decl.init, decl.id) + + const isSequenceDefineProps = isSequenceOf(decl.init, DEFINE_PROPS) + const isSequenceDefineEmits = isSequenceOf(decl.init, DEFINE_EMITS) + if (isDefineProps || isDefineEmits) { if (left === 1) { - s.remove(node.start! + startOffset, node.end! + startOffset) + if (isSequenceDefineProps || isSequenceDefineEmits) { + const sequenceLast = getSequenceResult(decl.init) as Node + const sequenceContentLeft = s + .slice( + decl.init.start! + startOffset, + sequenceLast.start! + startOffset + ) + .replace(/,\s+$/, '') + s.overwrite( + node.start! + startOffset, + node.end! + startOffset, + sequenceContentLeft + ) + } else { + s.remove(node.start! + startOffset, node.end! + startOffset) + } } else { let start = decl.start! + startOffset let end = decl.end! + startOffset @@ -917,7 +942,24 @@ export function compileScript( // not first one, locate the end of the prev start = node.declarations[i - 1].end! + startOffset } - s.remove(start, end) + if (isSequenceDefineProps || isSequenceDefineEmits) { + const sequenceLast = getSequenceResult(decl.init) as Node + const sequenceContentLeft = s + .slice( + decl.init.start! + startOffset, + sequenceLast.start! + startOffset + ) + .replace(/,\s+$/, '') + if (i < total - 1) { + // not last one + s.overwrite(start, end, `_ = (${sequenceContentLeft}),`) + } else { + // last one + s.overwrite(start, end, `, _ = (${sequenceContentLeft})`) + } + } else { + s.remove(start, end) + } left-- } } @@ -1627,6 +1669,36 @@ function isCallOf( ) } +function isSequenceOf( + node: Node | null | undefined, + test: string | ((id: string) => boolean) +): boolean { + if ( + node && + node.type === 'SequenceExpression' && + node.expressions && + node.expressions.length + ) { + const lastExpression = node.expressions[node.expressions.length - 1] + return isCallOf(lastExpression, test) + } + return false +} + +function getSequenceResult( + node: Node | null | undefined +): Node | null | undefined { + if ( + node && + node.type === 'SequenceExpression' && + node.expressions && + node.expressions.length + ) { + return node.expressions[node.expressions.length - 1] + } + return undefined +} + function canNeverBeRef(node: Node, userReactiveImport: string): boolean { if (isCallOf(node, userReactiveImport)) { return true