@@ -8,9 +8,9 @@ namespace CodeContext.Core.Analyzers;
88public class PatternAnalyzer
99{
1010 private readonly List < CodePattern > _detectedPatterns = new ( ) ;
11- private readonly Dictionary < string , int > _namingConventions = new ( ) ;
12- private readonly Dictionary < string , int > _returnTypePatterns = new ( ) ;
13- private readonly Dictionary < string , int > _errorHandlingPatterns = new ( ) ;
11+ private readonly System . Collections . Concurrent . ConcurrentDictionary < string , int > _namingConventions = new ( ) ;
12+ private readonly System . Collections . Concurrent . ConcurrentDictionary < string , int > _returnTypePatterns = new ( ) ;
13+ private readonly System . Collections . Concurrent . ConcurrentDictionary < string , int > _errorHandlingPatterns = new ( ) ;
1414
1515 public async Task < CodebaseContext > AnalyzeAsync ( string projectPath )
1616 {
@@ -20,14 +20,13 @@ public async Task<CodebaseContext> AnalyzeAsync(string projectPath)
2020 AnalyzedAt = DateTime . UtcNow
2121 } ;
2222
23- var csFiles = Directory . GetFiles ( projectPath , "*.cs" , SearchOption . AllDirectories )
23+ var csFiles = Directory . EnumerateFiles ( projectPath , "*.cs" , SearchOption . AllDirectories )
2424 . Where ( f => ! f . Contains ( "/obj/" ) && ! f . Contains ( "/bin/" ) && ! f . Contains ( "/." ) )
25- . ToList ( ) ;
25+ . ToArray ( ) ;
2626
27- foreach ( var file in csFiles )
28- {
29- await AnalyzeFileAsync ( file ) ;
30- }
27+ // Parallel file processing for better performance
28+ var tasks = csFiles . Select ( file => AnalyzeFileAsync ( file ) ) ;
29+ await Task . WhenAll ( tasks ) ;
3130
3231 context . Patterns = GeneratePatterns ( ) ;
3332 context . UsedPackages = await DetectPackagesAsync ( projectPath ) ;
@@ -183,11 +182,9 @@ private void AnalyzeReturnTypes(CompilationUnitSyntax root)
183182 }
184183 }
185184
186- private void IncrementPattern ( Dictionary < string , int > dict , string key )
185+ private void IncrementPattern ( System . Collections . Concurrent . ConcurrentDictionary < string , int > dict , string key )
187186 {
188- if ( ! dict . ContainsKey ( key ) )
189- dict [ key ] = 0 ;
190- dict [ key ] ++ ;
187+ dict . AddOrUpdate ( key , 1 , ( k , v ) => v + 1 ) ;
191188 }
192189
193190 private List < CodePattern > GeneratePatterns ( )
@@ -317,22 +314,34 @@ private List<CodePattern> GeneratePatterns()
317314
318315 private async Task < List < string > > DetectPackagesAsync ( string projectPath )
319316 {
320- var packages = new List < string > ( ) ;
321- var csprojFiles = Directory . GetFiles ( projectPath , "*.csproj" , SearchOption . AllDirectories ) ;
317+ var packages = new System . Collections . Concurrent . ConcurrentBag < string > ( ) ;
318+ var csprojFiles = Directory . EnumerateFiles ( projectPath , "*.csproj" , SearchOption . AllDirectories )
319+ . Where ( f => ! f . Contains ( "/obj/" ) && ! f . Contains ( "/bin/" ) )
320+ . ToArray ( ) ;
322321
323- foreach ( var csproj in csprojFiles )
322+ var tasks = csprojFiles . Select ( async csproj =>
324323 {
325- var content = await File . ReadAllTextAsync ( csproj ) ;
326- var doc = System . Xml . Linq . XDocument . Parse ( content ) ;
324+ try
325+ {
326+ var content = await File . ReadAllTextAsync ( csproj ) ;
327+ var doc = System . Xml . Linq . XDocument . Parse ( content ) ;
327328
328- var packageReferences = doc . Descendants ( "PackageReference" )
329- . Select ( x => x . Attribute ( "Include" ) ? . Value )
330- . Where ( x => ! string . IsNullOrEmpty ( x ) )
331- . Distinct ( ) ;
329+ var packageReferences = doc . Descendants ( "PackageReference" )
330+ . Select ( x => x . Attribute ( "Include" ) ? . Value )
331+ . Where ( x => ! string . IsNullOrEmpty ( x ) ) ;
332332
333- packages . AddRange ( packageReferences ! ) ;
334- }
333+ foreach ( var package in packageReferences . Where ( p => p != null ) )
334+ {
335+ packages . Add ( package ! ) ;
336+ }
337+ }
338+ catch
339+ {
340+ // Ignore invalid project files
341+ }
342+ } ) ;
335343
344+ await Task . WhenAll ( tasks ) ;
336345 return packages . Distinct ( ) . OrderBy ( p => p ) . ToList ( ) ;
337346 }
338347
0 commit comments