@@ -90,7 +90,7 @@ export class TypeScope {
90
90
public types : Record < string , ScopeTypeNode > = Object . create ( null ) ,
91
91
public declares : Record < string , ScopeTypeNode > = Object . create ( null )
92
92
) { }
93
-
93
+ isGenericScope = false
94
94
resolvedImportSources : Record < string , string > = Object . create ( null )
95
95
exportedTypes : Record < string , ScopeTypeNode > = Object . create ( null )
96
96
exportedDeclares : Record < string , ScopeTypeNode > = Object . create ( null )
@@ -121,15 +121,17 @@ export function resolveTypeElements(
121
121
scope ?: TypeScope ,
122
122
typeParameters ?: Record < string , Node >
123
123
) : ResolvedElements {
124
- if ( node . _resolvedElements ) {
124
+ const canCache = ! typeParameters
125
+ if ( canCache && node . _resolvedElements ) {
125
126
return node . _resolvedElements
126
127
}
127
- return ( node . _resolvedElements = innerResolveTypeElements (
128
+ const resolved = innerResolveTypeElements (
128
129
ctx ,
129
130
node ,
130
131
node . _ownerScope || scope || ctxToScope ( ctx ) ,
131
132
typeParameters
132
- ) )
133
+ )
134
+ return canCache ? ( node . _resolvedElements = resolved ) : resolved
133
135
}
134
136
135
137
function innerResolveTypeElements (
@@ -190,17 +192,18 @@ function innerResolveTypeElements(
190
192
}
191
193
const resolved = resolveTypeReference ( ctx , node , scope )
192
194
if ( resolved ) {
193
- const typeParams : Record < string , Node > = Object . create ( null )
195
+ let typeParams : Record < string , Node > | undefined
194
196
if (
195
197
( resolved . type === 'TSTypeAliasDeclaration' ||
196
198
resolved . type === 'TSInterfaceDeclaration' ) &&
197
199
resolved . typeParameters &&
198
200
node . typeParameters
199
201
) {
202
+ typeParams = Object . create ( null )
200
203
resolved . typeParameters . params . forEach ( ( p , i ) => {
201
204
let param = typeParameters && typeParameters [ p . name ]
202
205
if ( ! param ) param = node . typeParameters ! . params [ i ]
203
- typeParams [ p . name ] = param
206
+ typeParams ! [ p . name ] = param
204
207
} )
205
208
}
206
209
return resolveTypeElements (
@@ -297,6 +300,7 @@ function typeElementsToMap(
297
300
// capture generic parameters on node's scope
298
301
if ( typeParameters ) {
299
302
scope = createChildScope ( scope )
303
+ scope . isGenericScope = true
300
304
Object . assign ( scope . types , typeParameters )
301
305
}
302
306
; ( e as MaybeWithScope ) . _ownerScope = scope
@@ -669,16 +673,18 @@ function resolveTypeReference(
669
673
name ?: string ,
670
674
onlyExported = false
671
675
) : ScopeTypeNode | undefined {
672
- if ( node . _resolvedReference ) {
676
+ const canCache = ! scope ?. isGenericScope
677
+ if ( canCache && node . _resolvedReference ) {
673
678
return node . _resolvedReference
674
679
}
675
- return ( node . _resolvedReference = innerResolveTypeReference (
680
+ const resolved = innerResolveTypeReference (
676
681
ctx ,
677
682
scope || ctxToScope ( ctx ) ,
678
683
name || getReferenceName ( node ) ,
679
684
node ,
680
685
onlyExported
681
- ) )
686
+ )
687
+ return canCache ? ( node . _resolvedReference = resolved ) : resolved
682
688
}
683
689
684
690
function innerResolveTypeReference (
0 commit comments