From fe29f5e3c9df56da143d1b37dd02569adb0fc4b4 Mon Sep 17 00:00:00 2001
From: so1ve <i@mk1.io>
Date: Tue, 21 Nov 2023 16:21:06 +0800
Subject: [PATCH 1/2] fix: allow data with the same name as components

---
 .../language-core/src/generators/script.ts    |  2 +-
 .../language-core/src/generators/template.ts  |  2 +-
 test-workspace/tsc/vue3/#3411/Comp.vue        |  5 ++++
 test-workspace/tsc/vue3/#3411/main.vue        | 24 +++++++++++++++++++
 4 files changed, 31 insertions(+), 2 deletions(-)
 create mode 100644 test-workspace/tsc/vue3/#3411/Comp.vue
 create mode 100644 test-workspace/tsc/vue3/#3411/main.vue

diff --git a/packages/language-core/src/generators/script.ts b/packages/language-core/src/generators/script.ts
index 9a0f859ea1..078ef123d6 100644
--- a/packages/language-core/src/generators/script.ts
+++ b/packages/language-core/src/generators/script.ts
@@ -849,7 +849,7 @@ declare function defineProp<T>(value?: T | (() => T), required?: boolean, rest?:
 		codes.push(`let __VLS_otherComponents!: NonNullable<typeof __VLS_internalComponent extends { components: infer C } ? C : {}> & typeof __VLS_componentsOption;\n`);
 		codes.push(`let __VLS_own!: __VLS_SelfComponent<typeof __VLS_name, typeof __VLS_internalComponent & (new () => { ${getSlotsPropertyName(vueCompilerOptions.target)}: typeof ${scriptSetupRanges?.slots?.name ?? '__VLS_slots'} })>;\n`);
 		codes.push(`let __VLS_localComponents!: typeof __VLS_otherComponents & Omit<typeof __VLS_own, keyof typeof __VLS_otherComponents>;\n`);
-		codes.push(`let __VLS_components!: typeof __VLS_localComponents & __VLS_GlobalComponents & typeof __VLS_ctx;\n`); // for html completion, TS references...
+		codes.push(`let __VLS_components!: typeof __VLS_localComponents & Omit<__VLS_GlobalComponents, keyof typeof __VLS_ctx> & Omit<typeof __VLS_ctx, keyof typeof __VLS_localComponents>;\n`); // for html completion, TS references...
 
 		/* Style Scoped */
 		codes.push('/* Style Scoped */\n');
diff --git a/packages/language-core/src/generators/template.ts b/packages/language-core/src/generators/template.ts
index 6a069f79a3..85b8c33f4d 100644
--- a/packages/language-core/src/generators/template.ts
+++ b/packages/language-core/src/generators/template.ts
@@ -685,7 +685,7 @@ export function generate(
 		else {
 			codes.push(`let ${var_originalComponent}!: `);
 			for (const componentName of getPossibleOriginalComponentName(tag)) {
-				codes.push(`'${componentName}' extends keyof typeof __VLS_ctx ? typeof __VLS_ctx${validTsVarReg.test(componentName) ? `.${componentName}` : `['${componentName}']`} : `);
+				codes.push(`'${componentName}' extends keyof typeof __VLS_components ? typeof __VLS_components${validTsVarReg.test(componentName) ? `.${componentName}` : `['${componentName}']`} : `);
 			}
 			codes.push(`typeof __VLS_resolvedLocalAndGlobalComponents['${toCanonicalComponentName(tag)}'];\n`);
 		}
diff --git a/test-workspace/tsc/vue3/#3411/Comp.vue b/test-workspace/tsc/vue3/#3411/Comp.vue
new file mode 100644
index 0000000000..ae022dbe8a
--- /dev/null
+++ b/test-workspace/tsc/vue3/#3411/Comp.vue
@@ -0,0 +1,5 @@
+<script setup lang="ts">
+defineEmits<{
+	(e: 'foo', arg: number): void
+}>();
+</script>
diff --git a/test-workspace/tsc/vue3/#3411/main.vue b/test-workspace/tsc/vue3/#3411/main.vue
new file mode 100644
index 0000000000..02747981d6
--- /dev/null
+++ b/test-workspace/tsc/vue3/#3411/main.vue
@@ -0,0 +1,24 @@
+<script lang="ts">
+import { defineComponent } from 'vue';
+import Comp from './Comp.vue';
+import { exactType } from '../../shared';
+
+export default defineComponent({
+	components: {
+		Comp,
+	},
+	computed: {
+		Comp() {
+			return 123;
+		},
+	},
+	methods: {
+		exactType,
+	},
+});
+</script>
+
+<template>
+	<Comp @foo="e => exactType(e, 1 as number)" />
+	{{ exactType(Comp, 123) }}
+</template>

From e21160b7157f659b46b931e1247efc12313ff590 Mon Sep 17 00:00:00 2001
From: so1ve <i@mk1.io>
Date: Wed, 6 Dec 2023 19:48:57 +0800
Subject: [PATCH 2/2] re-fix

---
 packages/language-core/src/generators/template.ts | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/packages/language-core/src/generators/template.ts b/packages/language-core/src/generators/template.ts
index f95543da24..00af39dc08 100644
--- a/packages/language-core/src/generators/template.ts
+++ b/packages/language-core/src/generators/template.ts
@@ -505,7 +505,7 @@ export function generate(
 			let addedBlockCondition = false;
 
 			if (branch.condition?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) {
-				codes.push(` `);
+				codes.push(` (`);
 				const beforeCodeLength = codes.length;
 				codes.push(
 					...createInterpolationCode(
@@ -518,6 +518,11 @@ export function generate(
 					),
 				);
 				const afterCodeLength = codes.length;
+				codes.push(
+					` && __VLS_components`,
+					...createPropertyAccessCode(branch.condition.content),
+				)
+				codes.push(')');
 
 				formatCodes.push(
 					...createFormatCode(
@@ -688,14 +693,14 @@ export function generate(
 			);
 			for (const componentName of getPossibleOriginalComponentName(tag)) {
 				codes.push(
-					`'${componentName}' extends keyof typeof __VLS_ctx ? `,
-					`{ '${toCanonicalComponentName(tag)}': typeof __VLS_ctx`,
+					`'${componentName}' extends keyof typeof __VLS_components ? `,
+					`{ '${toCanonicalComponentName(tag)}': typeof __VLS_components`,
 					...createPropertyAccessCode(componentName),
 					` }: `,
 				);
 			}
 			codes.push(
-				`typeof __VLS_resolvedLocalAndGlobalComponents)`,
+				`typeof __VLS_ctx)`,
 				...(tagOffsets.length
 					? createPropertyAccessCode([
 						toCanonicalComponentName(tag),