@@ -23,8 +23,7 @@ const colonReg = /:/g;
2323export function * generateComponent (
2424 options : TemplateCodegenOptions ,
2525 ctx : TemplateCodegenContext ,
26- node : CompilerDOM . ElementNode ,
27- currentComponent : CompilerDOM . ElementNode | undefined
26+ node : CompilerDOM . ElementNode
2827) : Generator < Code > {
2928 const startTagOffset = node . loc . start . offset + options . template . content . slice ( node . loc . start . offset ) . indexOf ( node . tag ) ;
3029 const endTagOffset = ! node . isSelfClosing && options . template . lang === 'html' ? node . loc . start . offset + node . loc . source . lastIndexOf ( node . tag ) : undefined ;
@@ -43,6 +42,12 @@ export function* generateComponent(
4342 const var_defineComponentCtx = ctx . getInternalVariable ( ) ;
4443 const isComponentTag = node . tag . toLowerCase ( ) === 'component' ;
4544
45+ ctx . currentComponent = {
46+ node,
47+ ctxVar : var_defineComponentCtx ,
48+ used : false
49+ } ;
50+
4651 let props = node . props ;
4752 let dynamicTagInfo : {
4853 tag : string ;
@@ -231,16 +236,14 @@ export function* generateComponent(
231236 ) ;
232237 yield `, ...__VLS_functionalComponentArgsRest(${ var_functionalComponent } ))${ endOfLine } ` ;
233238
234- currentComponent = node ;
235-
236239 yield * generateFailedPropExps ( options , ctx , failedPropExps ) ;
237240
238241 const [ refName , offset ] = yield * generateVScope ( options , ctx , node , props ) ;
239242 const isRootNode = node === ctx . singleRootNode ;
240243
241244 if ( refName || isRootNode ) {
242245 const varName = ctx . getInternalVariable ( ) ;
243- ctx . usedComponentCtxVars . add ( var_defineComponentCtx ) ;
246+ ctx . currentComponent . used = true ;
244247
245248 yield `var ${ varName } = {} as (Parameters<NonNullable<typeof ${ var_defineComponentCtx } ['expose']>>[0] | null)` ;
246249 if ( node . codegenNode ?. type === CompilerDOM . NodeTypes . VNODE_CALL
@@ -261,7 +264,7 @@ export function* generateComponent(
261264
262265 const usedComponentEventsVar = yield * generateElementEvents ( options , ctx , node , var_functionalComponent , var_componentInstance , var_componentEvents ) ;
263266 if ( usedComponentEventsVar ) {
264- ctx . usedComponentCtxVars . add ( var_defineComponentCtx ) ;
267+ ctx . currentComponent . used = true ;
265268 yield `let ${ var_componentEmit } !: typeof ${ var_defineComponentCtx } .emit${ endOfLine } ` ;
266269 yield `let ${ var_componentEvents } !: __VLS_NormalizeEmits<typeof ${ var_componentEmit } >${ endOfLine } ` ;
267270 }
@@ -280,13 +283,13 @@ export function* generateComponent(
280283
281284 const slotDir = node . props . find ( p => p . type === CompilerDOM . NodeTypes . DIRECTIVE && p . name === 'slot' ) as CompilerDOM . DirectiveNode ;
282285 if ( slotDir ) {
283- yield * generateComponentSlot ( options , ctx , node , slotDir , currentComponent , var_defineComponentCtx ) ;
286+ yield * generateComponentSlot ( options , ctx , node , slotDir ) ;
284287 }
285288 else {
286- yield * generateElementChildren ( options , ctx , node , currentComponent , var_defineComponentCtx ) ;
289+ yield * generateElementChildren ( options , ctx , node ) ;
287290 }
288291
289- if ( ctx . usedComponentCtxVars . has ( var_defineComponentCtx ) ) {
292+ if ( ctx . currentComponent . used ) {
290293 yield `var ${ var_defineComponentCtx } !: __VLS_PickFunctionalComponentCtx<typeof ${ var_originalComponent } , typeof ${ var_componentInstance } >${ endOfLine } ` ;
291294 }
292295}
@@ -295,8 +298,6 @@ export function* generateElement(
295298 options : TemplateCodegenOptions ,
296299 ctx : TemplateCodegenContext ,
297300 node : CompilerDOM . ElementNode ,
298- currentComponent : CompilerDOM . ElementNode | undefined ,
299- componentCtxVar : string | undefined ,
300301 isVForChild : boolean
301302) : Generator < Code > {
302303 const startTagOffset = node . loc . start . offset + options . template . content . slice ( node . loc . start . offset ) . indexOf ( node . tag ) ;
@@ -349,11 +350,11 @@ export function* generateElement(
349350 }
350351
351352 const slotDir = node . props . find ( p => p . type === CompilerDOM . NodeTypes . DIRECTIVE && p . name === 'slot' ) as CompilerDOM . DirectiveNode ;
352- if ( slotDir && componentCtxVar ) {
353- yield * generateComponentSlot ( options , ctx , node , slotDir , currentComponent , componentCtxVar ) ;
353+ if ( slotDir && ctx . currentComponent ) {
354+ yield * generateComponentSlot ( options , ctx , node , slotDir ) ;
354355 }
355356 else {
356- yield * generateElementChildren ( options , ctx , node , currentComponent , componentCtxVar ) ;
357+ yield * generateElementChildren ( options , ctx , node ) ;
357358 }
358359
359360 if (
@@ -486,14 +487,12 @@ function* generateComponentSlot(
486487 options : TemplateCodegenOptions ,
487488 ctx : TemplateCodegenContext ,
488489 node : CompilerDOM . ElementNode ,
489- slotDir : CompilerDOM . DirectiveNode ,
490- currentComponent : CompilerDOM . ElementNode | undefined ,
491- componentCtxVar : string
490+ slotDir : CompilerDOM . DirectiveNode
492491) : Generator < Code > {
493492 yield `{${ newLine } ` ;
494- ctx . usedComponentCtxVars . add ( componentCtxVar ) ;
495- if ( currentComponent ) {
496- ctx . hasSlotElements . add ( currentComponent ) ;
493+ if ( ctx . currentComponent ) {
494+ ctx . currentComponent . used = true ;
495+ ctx . hasSlotElements . add ( ctx . currentComponent . node ) ;
497496 }
498497 const slotBlockVars : string [ ] = [ ] ;
499498 yield `const {` ;
@@ -517,7 +516,7 @@ function* generateComponentSlot(
517516 `default`
518517 ) ;
519518 }
520- yield `: __VLS_thisSlot } = ${ componentCtxVar } .slots!${ endOfLine } ` ;
519+ yield `: __VLS_thisSlot } = ${ ctx . currentComponent ! . ctxVar } .slots!${ endOfLine } ` ;
521520
522521 if ( slotDir ?. exp ?. type === CompilerDOM . NodeTypes . SIMPLE_EXPRESSION ) {
523522 const slotAst = createTsAst ( options . ts , slotDir , `(${ slotDir . exp . content } ) => {}` ) ;
@@ -552,7 +551,7 @@ function* generateComponentSlot(
552551
553552 let prev : CompilerDOM . TemplateChildNode | undefined ;
554553 for ( const childNode of node . children ) {
555- yield * generateTemplateChild ( options , ctx , childNode , currentComponent , prev , componentCtxVar ) ;
554+ yield * generateTemplateChild ( options , ctx , childNode , prev ) ;
556555 prev = childNode ;
557556 }
558557
@@ -564,7 +563,7 @@ function* generateComponentSlot(
564563 isStatic = slotDir . arg . isStatic ;
565564 }
566565 if ( isStatic && slotDir && ! slotDir . arg ) {
567- yield `${ componentCtxVar } .slots!['` ;
566+ yield `${ ctx . currentComponent ! . ctxVar } .slots!['` ;
568567 yield [
569568 '' ,
570569 'template' ,
0 commit comments