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]; }
/// <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)); }
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); }
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; }