@@ -24,25 +24,26 @@ export function* generateComponent(
24
24
componentCtxVar : string | undefined ,
25
25
) : Generator < Code > {
26
26
const startTagOffset = node . loc . start . offset + options . template . content . substring ( node . loc . start . offset ) . indexOf ( node . tag ) ;
27
+ const endTagOffset = ! node . isSelfClosing && options . template . lang === 'html' ? node . loc . start . offset + node . loc . source . lastIndexOf ( node . tag ) : undefined ;
28
+ const tagOffsets = endTagOffset !== undefined
29
+ ? [ startTagOffset , endTagOffset ]
30
+ : [ startTagOffset ] ;
27
31
const propsFailedExps : CompilerDOM . SimpleExpressionNode [ ] = [ ] ;
28
- const var_originalComponent = ctx . getInternalVariable ( ) ;
32
+ const possibleOriginalNames = getPossibleOriginalComponentNames ( node . tag , true ) ;
33
+ const matchImportName = possibleOriginalNames . find ( name => options . scriptSetupImportComponentNames . has ( name ) ) ;
34
+ const var_originalComponent = matchImportName ?? ctx . getInternalVariable ( ) ;
29
35
const var_functionalComponent = ctx . getInternalVariable ( ) ;
30
36
const var_componentInstance = ctx . getInternalVariable ( ) ;
31
37
const var_componentEvents = ctx . getInternalVariable ( ) ;
38
+ const var_defineComponentCtx = ctx . getInternalVariable ( ) ;
32
39
const isComponentTag = node . tag . toLowerCase ( ) === 'component' ;
33
40
34
- let endTagOffset = ! node . isSelfClosing && options . template . lang === 'html' ? node . loc . start . offset + node . loc . source . lastIndexOf ( node . tag ) : undefined ;
35
- let tag = node . tag ;
36
- let tagOffsets = endTagOffset !== undefined
37
- ? [ startTagOffset , endTagOffset ]
38
- : [ startTagOffset ] ;
39
41
let props = node . props ;
40
42
let dynamicTagInfo : {
41
43
exp : string ;
42
44
offset : number ;
43
45
astHolder : any ;
44
46
} | undefined ;
45
- let defineComponentCtxVar : string | undefined ;
46
47
let usedComponentEventsVar = false ;
47
48
48
49
if ( isComponentTag ) {
@@ -58,16 +59,46 @@ export function* generateComponent(
58
59
}
59
60
}
60
61
}
61
- else if ( tag . includes ( '.' ) ) {
62
+ else if ( node . tag . includes ( '.' ) ) {
62
63
// namespace tag
63
64
dynamicTagInfo = {
64
- exp : tag ,
65
+ exp : node . tag ,
65
66
astHolder : node . loc ,
66
67
offset : startTagOffset ,
67
68
} ;
68
69
}
69
70
70
- if ( dynamicTagInfo ) {
71
+ if ( matchImportName ) {
72
+ // hover, renaming / find references support
73
+ yield `// @ts-ignore${ newLine } ` ; // #2304
74
+ yield `[` ;
75
+ for ( const tagOffset of tagOffsets ) {
76
+ if ( var_originalComponent === node . tag ) {
77
+ yield [
78
+ var_originalComponent ,
79
+ 'template' ,
80
+ tagOffset ,
81
+ ctx . codeFeatures . withoutHighlightAndCompletion ,
82
+ ] ;
83
+ }
84
+ else {
85
+ yield * generateCamelized (
86
+ capitalize ( node . tag ) ,
87
+ tagOffset ,
88
+ {
89
+ ...ctx . codeFeatures . withoutHighlightAndCompletion ,
90
+ navigation : {
91
+ resolveRenameNewName : camelizeComponentName ,
92
+ resolveRenameEditText : getTagRenameApply ( node . tag ) ,
93
+ } ,
94
+ } ,
95
+ ) ;
96
+ }
97
+ yield `,` ;
98
+ }
99
+ yield `]${ endOfLine } ` ;
100
+ }
101
+ else if ( dynamicTagInfo ) {
71
102
yield `const ${ var_originalComponent } = ` ;
72
103
yield * generateInterpolation (
73
104
options ,
@@ -83,38 +114,26 @@ export function* generateComponent(
83
114
}
84
115
else if ( ! isComponentTag ) {
85
116
yield `const ${ var_originalComponent } = ({} as ` ;
86
- for ( const componentName of getPossibleOriginalComponentNames ( tag , true ) ) {
87
- yield `'${ componentName } ' extends keyof typeof __VLS_ctx ? { '${ getCanonicalComponentName ( tag ) } ': typeof __VLS_ctx` ;
117
+ for ( const componentName of possibleOriginalNames ) {
118
+ yield `'${ componentName } ' extends keyof typeof __VLS_ctx ? { '${ getCanonicalComponentName ( node . tag ) } ': typeof __VLS_ctx` ;
88
119
yield * generatePropertyAccess ( options , ctx , componentName ) ;
89
120
yield ` }: ` ;
90
121
}
91
122
yield `typeof __VLS_resolvedLocalAndGlobalComponents)` ;
92
123
yield * generatePropertyAccess (
93
124
options ,
94
125
ctx ,
95
- getCanonicalComponentName ( tag ) ,
126
+ getCanonicalComponentName ( node . tag ) ,
96
127
startTagOffset ,
97
128
ctx . codeFeatures . verification ,
98
129
) ;
99
130
yield endOfLine ;
100
- }
101
- else {
102
- yield `const ${ var_originalComponent } = {} as any${ endOfLine } ` ;
103
- }
104
-
105
- yield `const ${ var_functionalComponent } = __VLS_asFunctionalComponent(${ var_originalComponent } , new ${ var_originalComponent } ({` ;
106
- yield * generateElementProps ( options , ctx , node , props , false ) ;
107
- yield `}))${ endOfLine } ` ;
108
131
109
- if (
110
- ! dynamicTagInfo
111
- && ! isComponentTag
112
- ) {
113
132
// hover support
114
133
for ( const offset of tagOffsets ) {
115
- yield `({} as { ${ getCanonicalComponentName ( tag ) } : typeof ${ var_originalComponent } }).` ;
134
+ yield `({} as { ${ getCanonicalComponentName ( node . tag ) } : typeof ${ var_originalComponent } }).` ;
116
135
yield * generateCanonicalComponentName (
117
- tag ,
136
+ node . tag ,
118
137
offset ,
119
138
ctx . codeFeatures . withoutHighlightAndCompletionAndNavigation ,
120
139
) ;
@@ -160,13 +179,20 @@ export function* generateComponent(
160
179
yield `]${ endOfLine } ` ;
161
180
}
162
181
}
182
+ else {
183
+ yield `const ${ var_originalComponent } = {} as any${ endOfLine } ` ;
184
+ }
185
+
186
+ yield `const ${ var_functionalComponent } = __VLS_asFunctionalComponent(${ var_originalComponent } , new ${ var_originalComponent } ({` ;
187
+ yield * generateElementProps ( options , ctx , node , props , false ) ;
188
+ yield `}))${ endOfLine } ` ;
163
189
164
190
if ( options . vueCompilerOptions . strictTemplates ) {
165
191
// with strictTemplates, generate once for props type-checking + instance type
166
192
yield `const ${ var_componentInstance } = ${ var_functionalComponent } (` ;
167
193
yield * wrapWith (
168
194
startTagOffset ,
169
- startTagOffset + tag . length ,
195
+ startTagOffset + node . tag . length ,
170
196
ctx . codeFeatures . verification ,
171
197
`{` ,
172
198
...generateElementProps ( options , ctx , node , props , true , propsFailedExps ) ,
@@ -183,7 +209,7 @@ export function* generateComponent(
183
209
yield `({} as (props: __VLS_FunctionalComponentProps<typeof ${ var_originalComponent } , typeof ${ var_componentInstance } > & Record<string, unknown>) => void)(` ;
184
210
yield * wrapWith (
185
211
startTagOffset ,
186
- startTagOffset + tag . length ,
212
+ startTagOffset + node . tag . length ,
187
213
ctx . codeFeatures . verification ,
188
214
`{` ,
189
215
...generateElementProps ( options , ctx , node , props , true , propsFailedExps ) ,
@@ -192,8 +218,7 @@ export function* generateComponent(
192
218
yield `)${ endOfLine } ` ;
193
219
}
194
220
195
- defineComponentCtxVar = ctx . getInternalVariable ( ) ;
196
- componentCtxVar = defineComponentCtxVar ;
221
+ componentCtxVar = var_defineComponentCtx ;
197
222
currentComponent = node ;
198
223
199
224
for ( const failedExp of propsFailedExps ) {
@@ -212,20 +237,18 @@ export function* generateComponent(
212
237
213
238
yield * generateVScope ( options , ctx , node , props ) ;
214
239
215
- if ( componentCtxVar ) {
216
- ctx . usedComponentCtxVars . add ( componentCtxVar ) ;
217
- yield * generateElementEvents ( options , ctx , node , var_functionalComponent , var_componentInstance , var_componentEvents , ( ) => usedComponentEventsVar = true ) ;
218
- }
240
+ ctx . usedComponentCtxVars . add ( componentCtxVar ) ;
241
+ yield * generateElementEvents ( options , ctx , node , var_functionalComponent , var_componentInstance , var_componentEvents , ( ) => usedComponentEventsVar = true ) ;
219
242
220
243
const slotDir = node . props . find ( p => p . type === CompilerDOM . NodeTypes . DIRECTIVE && p . name === 'slot' ) as CompilerDOM . DirectiveNode ;
221
- if ( slotDir && componentCtxVar ) {
244
+ if ( slotDir ) {
222
245
yield * generateComponentSlot ( options , ctx , node , slotDir , currentComponent , componentCtxVar ) ;
223
246
}
224
247
else {
225
248
yield * generateElementChildren ( options , ctx , node , currentComponent , componentCtxVar ) ;
226
249
}
227
250
228
- if ( defineComponentCtxVar && ctx . usedComponentCtxVars . has ( defineComponentCtxVar ) ) {
251
+ if ( var_defineComponentCtx && ctx . usedComponentCtxVars . has ( var_defineComponentCtx ) ) {
229
252
yield `const ${ componentCtxVar } = __VLS_pickFunctionalComponentCtx(${ var_originalComponent } , ${ var_componentInstance } )!${ endOfLine } ` ;
230
253
}
231
254
if ( usedComponentEventsVar ) {
0 commit comments