private static ImmutableArray<DiagnosticAnalyzer> CreateAnalyzersFromFile(AnalyzerFileReference reference) { Debug.Assert(PathUtilities.IsAbsolute(reference.FullPath)); // get all analyzers in the assembly; var map = ImmutableDictionary.CreateBuilder<string, ImmutableArray<DiagnosticAnalyzer>>(); reference.AddAnalyzers(map); // TODO: fix the cache mechanism. I don't understand how the cache is supposed to work // so I am leaving it as it is for now. (does weak reference things currently actually work?) // also, current one looks like assume a file can have analzyers for only one language. // is this assumption right? // // foreach (var kv in mapBuilder) // { // CacheAnalyzers(kv.Key, fullPath, kv.Value); // } // // EnableCompactTimer(); var array = ImmutableArray.CreateBuilder<DiagnosticAnalyzer>(); foreach (var analyzers in map.Values) { array.AddRange(analyzers); } return array.ToImmutable(); }
private static ImmutableArray<DiagnosticAnalyzer> CreateAnalyzersFromFile(AnalyzerFileReference reference, string langauge) { Debug.Assert(PathUtilities.IsAbsolute(reference.FullPath)); // get all analyzers in the assembly for the given language; var builder = ImmutableArray.CreateBuilder<DiagnosticAnalyzer>(); reference.AddAnalyzers(builder, langauge); var analyzers = builder.ToImmutable(); CacheAnalyzers(langauge, reference.FullPath, analyzers); EnableCompactTimer(); return analyzers; }
internal static ImmutableArray<IDiagnosticAnalyzer> GetOrCreateAnalyzersFromFile(AnalyzerFileReference analyzerReference) { string fullPath = analyzerReference.FullPath; Debug.Assert(PathUtilities.IsAbsolute(fullPath)); lock (Guard) { // may throw: FileKey key = FileKey.Create(fullPath); CachedAnalyzers cachedAnalyzers; if (analyzersFromFiles.TryGetValue(key, out cachedAnalyzers) && cachedAnalyzers.Analyzers.IsAlive) { return (ImmutableArray<IDiagnosticAnalyzer>)cachedAnalyzers.Analyzers.Target; } // get all analyzers in the assembly: var builder = ImmutableArray.CreateBuilder<IDiagnosticAnalyzer>(); analyzerReference.AddAnalyzers(builder, null, null); var analyzers = builder.ToImmutable(); // refresh the timestamp (the file may have changed just before we memory-mapped it): key = FileKey.Create(fullPath); analyzersFromFiles[key] = new CachedAnalyzers(analyzers); analyzerAssemblyKeys.Add(key); EnableCompactTimer(); return analyzers; } }