private static ImmutableDictionary <string, ImmutableDictionary <DiagnosticAnalyzer, ProviderId> > CreateAnalyzerIdMap(
                        WorkspaceAnalyzerManager workspaceAnalyzerManager, string language)
                    {
                        var index = 0;
                        var map   = ImmutableDictionary.CreateBuilder <string, ImmutableDictionary <DiagnosticAnalyzer, ProviderId> >();

                        foreach (var kv in workspaceAnalyzerManager.GetHostDiagnosticAnalyzersPerReference(language))
                        {
                            var perAnalyzerMap = ImmutableDictionary.CreateBuilder <DiagnosticAnalyzer, ProviderId>();

                            var referenceIdentity    = kv.Key;
                            var perLanguageAnalyzers = kv.Value;

                            if (perLanguageAnalyzers.Length > 0)
                            {
                                foreach (var analyzer in perLanguageAnalyzers)
                                {
                                    var analyzerId = index++;
                                    perAnalyzerMap.Add(analyzer, analyzerId);
                                }

                                map.Add(referenceIdentity, perAnalyzerMap.ToImmutable());
                            }
                        }

                        return(map.ToImmutable());
                    }
 public DiagnosticIncrementalAnalyzer(DiagnosticAnalyzerService owner, int correlationId, Workspace workspace, WorkspaceAnalyzerManager workspaceAnalyzerManager, AbstractHostDiagnosticUpdateSource hostDiagnosticUpdateSource)
     : base(workspace, hostDiagnosticUpdateSource)
 {
     _correlationId            = correlationId;
     _owner                    = owner;
     _workspaceAnalyzerManager = workspaceAnalyzerManager;
 }
                    public PerLanguageAnalyzersAndStates(WorkspaceAnalyzerManager workspaceAnalyzerManager, string language)
                    {
                        _language = language;

                        // TODO: dynamically re-order providers so that cheap one runs first and slower runs later.
                        _diagnosticAnalyzerIdMap = CreateAnalyzerIdMap(workspaceAnalyzerManager, language);
                        _analyzerCount           = _diagnosticAnalyzerIdMap.Values.Flatten().Count();
                        _diagnosticStateMaps     = new DiagnosticState[s_stateTypeCount, _analyzerCount];
                    }
示例#4
0
            /// <summary>
            /// Get the unique state name for the given {type, provider} tuple.
            /// Note that this name is used by the underlying persistence stream of the corresponding <see cref="DiagnosticState"/> to Read/Write diagnostic data into the stream.
            /// If any two distinct {type, provider} tuples have the same diagnostic state name, we will end up sharing the persistence stream between them, leading to duplicate/missing/incorrect diagnostic data.
            /// </summary>
            private static ValueTuple <string, VersionStamp> GetUniqueDiagnosticStateNameAndVersion(StateType type, ProviderId providerId, DiagnosticAnalyzer provider)
            {
                Contract.ThrowIfNull(provider);

                // Get the unique ID for given diagnostic analyzer.
                // note that we also put version stamp so that we can detect changed analyzer.
                var tuple = WorkspaceAnalyzerManager.GetUniqueIdForAnalyzer(provider);

                return(ValueTuple.Create(UserDiagnosticsPrefixTableName + "_" + type.ToString() + "_" + tuple.Item1, tuple.Item2));
            }
示例#5
0
        public DiagnosticIncrementalAnalyzer(
            DiagnosticAnalyzerService owner,
            int correlationId,
            Workspace workspace,
            WorkspaceAnalyzerManager workspaceAnalyzerManager,
            AbstractHostDiagnosticUpdateSource hostDiagnosticUpdateSource)
            : base(workspace, hostDiagnosticUpdateSource)
        {
            _owner             = owner;
            _correlationId     = correlationId;
            _memberRangeMap    = new MemberRangeMap();
            _analyzersAndState = new DiagnosticAnalyzersAndStates(this, workspace, workspaceAnalyzerManager);
            _executor          = new AnalyzerExecutor(this);

            _diagnosticLogAggregator = new DiagnosticLogAggregator(_owner);
        }
示例#6
0
            public DiagnosticAnalyzersAndStates(DiagnosticIncrementalAnalyzer owner, Workspace workspace, WorkspaceAnalyzerManager workspaceAnalyzerManager)
            {
                _owner = owner;
                _sharedAnalyzersAndStates     = new WorkspaceAnalyzersAndStates(workspaceAnalyzerManager);
                _projectAnalyzersAndStatesMap = new ConcurrentDictionary <ProjectId, ProjectAnalyzersAndStates>();

                this.Workspace = workspace;
            }
 public WorkspaceAnalyzersAndStates(WorkspaceAnalyzerManager workspaceAnalyzerManager)
 {
     _workspaceAnalyzerManager         = workspaceAnalyzerManager;
     _perLanguageAnalyzersAndStatesMap = ImmutableDictionary <string, PerLanguageAnalyzersAndStates> .Empty;
 }