@@ -26,14 +26,12 @@ export class PHPIncluseResolver {
2626 ...includeImports . resolved ,
2727] ) ,
2828unresolved :{
29- paths :[
30- ...useImports . unresolved . paths ,
31- ...includeImports . unresolved . paths ,
32- ] ,
33- namespaces :[
34- ...useImports . unresolved . namespaces ,
35- ...includeImports . unresolved . namespaces ,
36- ] ,
29+ paths :useImports . unresolved . paths . union (
30+ includeImports . unresolved . paths ,
31+ ) ,
32+ namespaces :useImports . unresolved . namespaces . union (
33+ includeImports . unresolved . namespaces ,
34+ ) ,
3735} ,
3836} ;
3937this . imports . set ( file . path , imports ) ;
@@ -48,8 +46,8 @@ export class PHPIncluseResolver {
4846const imports :PHPImports = {
4947resolved :new Map ( ) ,
5048unresolved :{
51- paths :[ ] ,
52- namespaces :[ ] ,
49+ paths :new Set ( ) ,
50+ namespaces :new Set ( ) ,
5351} ,
5452} ;
5553for ( const use of useDirectives ) {
@@ -78,7 +76,7 @@ export class PHPIncluseResolver {
7876}
7977}
8078} else if ( name ) {
81- imports . unresolved . namespaces . push ( name ) ;
79+ imports . unresolved . namespaces . add ( name ) ;
8280}
8381}
8482return imports ;
@@ -102,32 +100,50 @@ export class PHPIncluseResolver {
102100return [ ...leftArr , ...rightArr ] ;
103101}
104102
105- #resolveIncludeDirectives( file :PHPFile ) {
103+ #resolveIncludeDirectives( file :PHPFile , visitedFiles = new Set < string > ( ) ) {
106104const includeDirectives = PHP_INCLUDE_QUERY . captures ( file . rootNode ) ;
107105if ( ! includeDirectives ) {
108106throw new Error ( `Error when parsing include directives for${ file . path } ` ) ;
109107}
110108const imports :PHPImports = {
111109resolved :new Map ( ) ,
112110unresolved :{
113- paths :[ ] ,
114- namespaces :[ ] ,
111+ paths :new Set ( ) ,
112+ namespaces :new Set ( ) ,
115113} ,
116114} ;
115+
116+ // Add the current file to the visited set to prevent infinite recursion
117+ visitedFiles . add ( file . path ) ;
118+
117119for ( const include of includeDirectives ) {
118120if ( include . name === "includestr" ) {
119121const path = include . node . text ;
120122const importedfile = this . registree . registry . getFile ( path , file . path ) ;
121- if ( importedfile ) {
123+ if ( importedfile && ! visitedFiles . has ( importedfile . path ) ) {
122124for ( const [ k , v ] of importedfile . symbols ) {
123125if ( imports . resolved . has ( k ) ) {
124126imports . resolved . get ( k ) ! . push ( ...v ) ;
125127} else {
126128imports . resolved . set ( k , v ) ;
127129}
128130}
129- } else {
130- imports . unresolved . paths . push ( path ) ;
131+ const nestedImports = this . #resolveIncludeDirectives(
132+ importedfile ,
133+ visitedFiles ,
134+ ) ;
135+ for ( const [ k , v ] of nestedImports . resolved ) {
136+ if ( imports . resolved . has ( k ) ) {
137+ imports . resolved . get ( k ) ! . push ( ...v ) ;
138+ } else {
139+ imports . resolved . set ( k , v ) ;
140+ }
141+ }
142+ imports . unresolved . paths = imports . unresolved . paths . union (
143+ nestedImports . unresolved . paths ,
144+ ) ;
145+ } else if ( ! importedfile ) {
146+ imports . unresolved . paths . add ( path ) ;
131147}
132148} else if ( include . name === "includebin" ) {
133149const fileparts = this . #splitBinary( include . node )
@@ -139,19 +155,34 @@ export class PHPIncluseResolver {
139155filepath ,
140156file . path ,
141157) ;
142- if ( importedfile ) {
158+ if ( importedfile && ! visitedFiles . has ( importedfile . path ) ) {
143159for ( const [ k , v ] of importedfile . symbols ) {
144160if ( imports . resolved . has ( k ) ) {
145161imports . resolved . get ( k ) ! . push ( ...v ) ;
146162} else {
147163imports . resolved . set ( k , v ) ;
148164}
149165}
150- } else {
151- imports . unresolved . paths . push ( filepath ) ;
166+ const nestedImports = this . #resolveIncludeDirectives(
167+ importedfile ,
168+ visitedFiles ,
169+ ) ;
170+ for ( const [ k , v ] of nestedImports . resolved ) {
171+ if ( imports . resolved . has ( k ) ) {
172+ imports . resolved . get ( k ) ! . push ( ...v ) ;
173+ } else {
174+ imports . resolved . set ( k , v ) ;
175+ }
176+ }
177+ imports . unresolved . paths = imports . unresolved . paths . union (
178+ nestedImports . unresolved . paths ,
179+ ) ;
180+ } else if ( ! importedfile ) {
181+ imports . unresolved . paths . add ( filepath ) ;
152182}
153183}
154184}
185+
155186return imports ;
156187}
157188}