From 6f984ff8f915fd92c6d20397d55897fa9ab65a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Sat, 10 Jun 2023 19:14:42 +0800 Subject: [PATCH 1/4] feat(compiler-sfc): support macros alias --- packages/compiler-sfc/src/compileScript.ts | 25 +++++++++++-------- packages/compiler-sfc/src/script/context.ts | 16 ++++++++++-- .../compiler-sfc/src/script/defineEmits.ts | 2 +- .../compiler-sfc/src/script/defineExpose.ts | 14 +++++------ .../compiler-sfc/src/script/defineModel.ts | 2 +- .../compiler-sfc/src/script/defineOptions.ts | 2 +- .../compiler-sfc/src/script/defineProps.ts | 2 +- .../compiler-sfc/src/script/defineSlots.ts | 2 +- 8 files changed, 41 insertions(+), 24 deletions(-) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 46fc65c0069..de78f128839 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -47,7 +47,7 @@ import { genRuntimeEmits, processDefineEmits, } from './script/defineEmits' -import { DEFINE_EXPOSE, processDefineExpose } from './script/defineExpose' +import { processDefineExpose } from './script/defineExpose' import { DEFINE_OPTIONS, processDefineOptions } from './script/defineOptions' import { processDefineSlots } from './script/defineSlots' import { DEFINE_MODEL, processDefineModel } from './script/defineModel' @@ -236,6 +236,10 @@ export function compileScript( isUsedInTemplate = isImportUsed(local, sfc) } + if (Object.keys(ctx.macrosAliases).includes(imported)) { + ctx.macrosAliases[imported] = undefined + } + ctx.userImports[local] = { isType, imported, @@ -311,21 +315,22 @@ export function compileScript( ) } - for (let i = 0; i < node.specifiers.length; i++) { - const specifier = node.specifiers[i] + const source = node.source.value + for (const [i, specifier] of node.specifiers.entries()) { const local = specifier.local.name const imported = getImportedName(specifier) - const source = node.source.value const existing = ctx.userImports[local] if ( source === 'vue' && - (imported === DEFINE_PROPS || - imported === DEFINE_EMITS || - imported === DEFINE_EXPOSE) + Object.keys(ctx.macrosAliases).includes(imported) ) { - warnOnce( - `\`${imported}\` is a compiler macro and no longer needs to be imported.`, - ) + if (local === imported) + warnOnce( + `\`${imported}\` is a compiler macro and no longer needs to be imported.`, + ) + else { + ctx.macrosAliases[imported] = local + } removeSpecifier(i) } else if (existing) { if (existing.source === source && existing.imported === imported) { diff --git a/packages/compiler-sfc/src/script/context.ts b/packages/compiler-sfc/src/script/context.ts index f74adee603b..d4f9afc0a98 100644 --- a/packages/compiler-sfc/src/script/context.ts +++ b/packages/compiler-sfc/src/script/context.ts @@ -3,11 +3,15 @@ import type { SFCDescriptor } from '../parse' import { generateCodeFrame, isArray } from '@vue/shared' import { type ParserPlugin, parse as babelParse } from '@babel/parser' import type { ImportBinding, SFCScriptCompileOptions } from '../compileScript' -import type { PropsDestructureBindings } from './defineProps' -import type { ModelDecl } from './defineModel' +import { DEFINE_PROPS, type PropsDestructureBindings } from './defineProps' +import { DEFINE_MODEL, type ModelDecl } from './defineModel' import type { BindingMetadata } from '../../../compiler-core/src' import MagicString from 'magic-string' import type { TypeScope } from './resolveType' +import { DEFINE_EMITS } from './defineEmits' +import { DEFINE_EXPOSE } from './defineExpose' +import { DEFINE_OPTIONS } from './defineOptions' +import { DEFINE_SLOTS } from './defineSlots' export class ScriptCompileContext { isJS: boolean @@ -27,6 +31,14 @@ export class ScriptCompileContext { scope?: TypeScope globalScopes?: TypeScope[] userImports: Record = Object.create(null) + macrosAliases: Record = { + [DEFINE_PROPS]: DEFINE_PROPS, + [DEFINE_EMITS]: DEFINE_EMITS, + [DEFINE_EXPOSE]: DEFINE_EXPOSE, + [DEFINE_OPTIONS]: DEFINE_OPTIONS, + [DEFINE_SLOTS]: DEFINE_SLOTS, + [DEFINE_MODEL]: DEFINE_MODEL, + } // macros presence check hasDefinePropsCall = false diff --git a/packages/compiler-sfc/src/script/defineEmits.ts b/packages/compiler-sfc/src/script/defineEmits.ts index 526a55dc8a1..d56e6525730 100644 --- a/packages/compiler-sfc/src/script/defineEmits.ts +++ b/packages/compiler-sfc/src/script/defineEmits.ts @@ -21,7 +21,7 @@ export function processDefineEmits( node: Node, declId?: LVal, ): boolean { - if (!isCallOf(node, DEFINE_EMITS)) { + if (!isCallOf(node, ctx.macrosAliases[DEFINE_EMITS])) { return false } if (ctx.hasDefineEmitCall) { diff --git a/packages/compiler-sfc/src/script/defineExpose.ts b/packages/compiler-sfc/src/script/defineExpose.ts index ba13e26c1e5..06d35feb9c6 100644 --- a/packages/compiler-sfc/src/script/defineExpose.ts +++ b/packages/compiler-sfc/src/script/defineExpose.ts @@ -8,12 +8,12 @@ export function processDefineExpose( ctx: ScriptCompileContext, node: Node, ): boolean { - if (isCallOf(node, DEFINE_EXPOSE)) { - if (ctx.hasDefineExposeCall) { - ctx.error(`duplicate ${DEFINE_EXPOSE}() call`, node) - } - ctx.hasDefineExposeCall = true - return true + if (!isCallOf(node, ctx.macrosAliases[DEFINE_EXPOSE])) { + return false } - return false + if (ctx.hasDefineExposeCall) { + ctx.error(`duplicate ${DEFINE_EXPOSE}() call`, node) + } + ctx.hasDefineExposeCall = true + return true } diff --git a/packages/compiler-sfc/src/script/defineModel.ts b/packages/compiler-sfc/src/script/defineModel.ts index 24fd0780eaa..9fef2ed3afd 100644 --- a/packages/compiler-sfc/src/script/defineModel.ts +++ b/packages/compiler-sfc/src/script/defineModel.ts @@ -23,7 +23,7 @@ export function processDefineModel( node: Node, declId?: LVal, ): boolean { - if (!isCallOf(node, DEFINE_MODEL)) { + if (!isCallOf(node, ctx.macrosAliases[DEFINE_MODEL])) { return false } diff --git a/packages/compiler-sfc/src/script/defineOptions.ts b/packages/compiler-sfc/src/script/defineOptions.ts index 8e32e0fba82..e829ceb180f 100644 --- a/packages/compiler-sfc/src/script/defineOptions.ts +++ b/packages/compiler-sfc/src/script/defineOptions.ts @@ -13,7 +13,7 @@ export function processDefineOptions( ctx: ScriptCompileContext, node: Node, ): boolean { - if (!isCallOf(node, DEFINE_OPTIONS)) { + if (!isCallOf(node, ctx.macrosAliases[DEFINE_OPTIONS])) { return false } if (ctx.hasDefineOptionsCall) { diff --git a/packages/compiler-sfc/src/script/defineProps.ts b/packages/compiler-sfc/src/script/defineProps.ts index 4c8a34aa616..42c6dfab891 100644 --- a/packages/compiler-sfc/src/script/defineProps.ts +++ b/packages/compiler-sfc/src/script/defineProps.ts @@ -49,7 +49,7 @@ export function processDefineProps( node: Node, declId?: LVal, ) { - if (!isCallOf(node, DEFINE_PROPS)) { + if (!isCallOf(node, ctx.macrosAliases[DEFINE_PROPS])) { return processWithDefaults(ctx, node, declId) } diff --git a/packages/compiler-sfc/src/script/defineSlots.ts b/packages/compiler-sfc/src/script/defineSlots.ts index d8f66d757a6..727b3d27ac6 100644 --- a/packages/compiler-sfc/src/script/defineSlots.ts +++ b/packages/compiler-sfc/src/script/defineSlots.ts @@ -9,7 +9,7 @@ export function processDefineSlots( node: Node, declId?: LVal, ): boolean { - if (!isCallOf(node, DEFINE_SLOTS)) { + if (!isCallOf(node, ctx.macrosAliases[DEFINE_SLOTS])) { return false } if (ctx.hasDefineSlotsCall) { From 05f17b94c9594e4a5f9a45dc613d67a27b4c780d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Sun, 11 Jun 2023 12:23:10 +0800 Subject: [PATCH 2/4] feat: alias --- packages/compiler-sfc/src/compileScript.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index de78f128839..86a47c1fddd 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -455,6 +455,7 @@ export function compileScript( node.declaration, scriptBindings, vueImportAliases, + ctx.macrosAliases, hoistStatic, ) } @@ -470,6 +471,7 @@ export function compileScript( node, scriptBindings, vueImportAliases, + ctx.macrosAliases, hoistStatic, ) } @@ -585,6 +587,7 @@ export function compileScript( node, setupBindings, vueImportAliases, + ctx.macrosAliases, hoistStatic, ) } @@ -1033,6 +1036,7 @@ function walkDeclaration( node: Declaration, bindings: Record, userImportAliases: Record, + macrosAliases: Record, hoistStatic: boolean, ): boolean { let isAllLiteral = false @@ -1052,7 +1056,10 @@ function walkDeclaration( isConst && isCallOf( init, - c => c === DEFINE_PROPS || c === DEFINE_EMITS || c === WITH_DEFAULTS, + c => + c === macrosAliases[DEFINE_PROPS] || + c === macrosAliases[DEFINE_EMITS] || + c === macrosAliases[WITH_DEFAULTS], ) ) if (id.type === 'Identifier') { @@ -1087,7 +1094,7 @@ function walkDeclaration( m === userImportAliases['shallowRef'] || m === userImportAliases['customRef'] || m === userImportAliases['toRef'] || - m === DEFINE_MODEL, + m === macrosAliases[DEFINE_MODEL], ) ) { bindingType = BindingTypes.SETUP_REF From 60f619e9127751c78d7137e90e7823d0a3781366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Sun, 11 Jun 2023 15:24:05 +0800 Subject: [PATCH 3/4] fix: withDefaults alias --- packages/compiler-sfc/src/script/context.ts | 3 ++- packages/compiler-sfc/src/script/defineProps.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/compiler-sfc/src/script/context.ts b/packages/compiler-sfc/src/script/context.ts index d4f9afc0a98..30b16cc4578 100644 --- a/packages/compiler-sfc/src/script/context.ts +++ b/packages/compiler-sfc/src/script/context.ts @@ -3,7 +3,7 @@ import type { SFCDescriptor } from '../parse' import { generateCodeFrame, isArray } from '@vue/shared' import { type ParserPlugin, parse as babelParse } from '@babel/parser' import type { ImportBinding, SFCScriptCompileOptions } from '../compileScript' -import { DEFINE_PROPS, type PropsDestructureBindings } from './defineProps' +import { DEFINE_PROPS, type PropsDestructureBindings, WITH_DEFAULTS } from './defineProps' import { DEFINE_MODEL, type ModelDecl } from './defineModel' import type { BindingMetadata } from '../../../compiler-core/src' import MagicString from 'magic-string' @@ -33,6 +33,7 @@ export class ScriptCompileContext { userImports: Record = Object.create(null) macrosAliases: Record = { [DEFINE_PROPS]: DEFINE_PROPS, + [WITH_DEFAULTS]: WITH_DEFAULTS, [DEFINE_EMITS]: DEFINE_EMITS, [DEFINE_EXPOSE]: DEFINE_EXPOSE, [DEFINE_OPTIONS]: DEFINE_OPTIONS, diff --git a/packages/compiler-sfc/src/script/defineProps.ts b/packages/compiler-sfc/src/script/defineProps.ts index 42c6dfab891..a85ccdbdd5d 100644 --- a/packages/compiler-sfc/src/script/defineProps.ts +++ b/packages/compiler-sfc/src/script/defineProps.ts @@ -96,7 +96,7 @@ function processWithDefaults( node: Node, declId?: LVal, ): boolean { - if (!isCallOf(node, WITH_DEFAULTS)) { + if (!isCallOf(node, ctx.macrosAliases[WITH_DEFAULTS])) { return false } if (!processDefineProps(ctx, node.arguments[0], declId)) { From a84826724f03384a1fcb7af65f1726316e237a13 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 27 Jan 2024 12:27:35 +0000 Subject: [PATCH 4/4] [autofix.ci] apply automated fixes --- packages/compiler-sfc/src/script/context.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/compiler-sfc/src/script/context.ts b/packages/compiler-sfc/src/script/context.ts index 30b16cc4578..b5ecf27a63b 100644 --- a/packages/compiler-sfc/src/script/context.ts +++ b/packages/compiler-sfc/src/script/context.ts @@ -3,7 +3,11 @@ import type { SFCDescriptor } from '../parse' import { generateCodeFrame, isArray } from '@vue/shared' import { type ParserPlugin, parse as babelParse } from '@babel/parser' import type { ImportBinding, SFCScriptCompileOptions } from '../compileScript' -import { DEFINE_PROPS, type PropsDestructureBindings, WITH_DEFAULTS } from './defineProps' +import { + DEFINE_PROPS, + type PropsDestructureBindings, + WITH_DEFAULTS, +} from './defineProps' import { DEFINE_MODEL, type ModelDecl } from './defineModel' import type { BindingMetadata } from '../../../compiler-core/src' import MagicString from 'magic-string'