11import type { TSTypeLiteral } from '@typescript-eslint/types/dist/ts-estree' ;
22import { AST_NODE_TYPES } from '@typescript-eslint/typescript-estree' ;
3+ import * as LRUCache from 'lru-cache' ;
34import type { ClassIndex , ClassReference , ClassReferenceLoaded , InterfaceLoaded } from './ClassIndex' ;
45import type { ClassLoader } from './ClassLoader' ;
56import type { CommentLoader } from './CommentLoader' ;
@@ -18,11 +19,13 @@ export class ParameterResolver {
1819 private readonly classLoader : ClassLoader ;
1920 private readonly commentLoader : CommentLoader ;
2021 private readonly ignoreClasses : Record < string , boolean > ;
22+ private readonly cacheInterfaceRange : LRUCache < string , ParameterRangeResolved > ;
2123
2224 public constructor ( args : ParameterResolverArgs ) {
2325 this . classLoader = args . classLoader ;
2426 this . commentLoader = args . commentLoader ;
2527 this . ignoreClasses = args . ignoreClasses ;
28+ this . cacheInterfaceRange = new LRUCache ( 2_048 ) ;
2629 }
2730
2831 /**
@@ -250,6 +253,32 @@ export class ParameterResolver {
250253 rootOwningClass : ClassReferenceLoaded ,
251254 genericTypeRemappings : Record < string , ParameterRangeUnresolved > ,
252255 getNestedFields : boolean ,
256+ ) : Promise < ParameterRangeResolved > {
257+ const cacheKey = `${ interfaceName } ::${ ( qualifiedPath || [ ] ) . join ( '.' ) } ::${ owningClass . fileName } ` ;
258+ let resolved = this . cacheInterfaceRange . get ( cacheKey ) ;
259+ if ( ! resolved ) {
260+ resolved = await this . resolveRangeInterfaceInner (
261+ interfaceName ,
262+ qualifiedPath ,
263+ genericTypeParameterInstances ,
264+ owningClass ,
265+ rootOwningClass ,
266+ genericTypeRemappings ,
267+ getNestedFields ,
268+ ) ;
269+ this . cacheInterfaceRange . set ( cacheKey , resolved ) ;
270+ }
271+ return resolved ;
272+ }
273+
274+ protected async resolveRangeInterfaceInner (
275+ interfaceName : string ,
276+ qualifiedPath : string [ ] | undefined ,
277+ genericTypeParameterInstances : ParameterRangeUnresolved [ ] | undefined ,
278+ owningClass : ClassReferenceLoaded ,
279+ rootOwningClass : ClassReferenceLoaded ,
280+ genericTypeRemappings : Record < string , ParameterRangeUnresolved > ,
281+ getNestedFields : boolean ,
253282 ) : Promise < ParameterRangeResolved > {
254283 const classOrInterface = await this . loadClassOrInterfacesChain ( {
255284 packageName : owningClass . packageName ,
0 commit comments