示例#1
0
        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();
        }
示例#2
0
        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;
        }
示例#3
0
        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;
            }
        }