static HostAnalyzerStateSets CreateLanguageSpecificAnalyzerMap(string language, DiagnosticAnalyzerInfoCache analyzerInfoCache) { var analyzersPerReference = analyzerInfoCache.GetOrCreateHostDiagnosticAnalyzersPerReference(language); var analyzerMap = CreateStateSetMap(analyzerInfoCache, language, analyzersPerReference.Values); VerifyUniqueStateNames(analyzerMap.Values); return(new HostAnalyzerStateSets(analyzerInfoCache, language, analyzerMap)); }
public ImmutableArray <StateSet> CreateBuildOnlyProjectStateSet(Project project) { var hostStateSets = GetOrCreateHostStateSets(project.Language).OrderedStateSets; if (!project.SupportsCompilation) { // languages which don't use our compilation model but diagnostic framework, // all their analyzer should be host analyzers. return all host analyzers // for the language return(hostStateSets); } // now create analyzer to host stateset map var hostStateSetMap = hostStateSets.ToDictionary(s => s.Analyzer, s => s); // create project analyzer reference identity map var referenceIdentities = project.AnalyzerReferences.Select(r => _analyzerInfoCache.GetAnalyzerReferenceIdentity(r)).ToSet(); // create build only stateSet array var stateSets = ImmutableArray.CreateBuilder <StateSet>(); // we always include compiler analyzer in build only state var compilerAnalyzer = _analyzerInfoCache.GetCompilerDiagnosticAnalyzer(project.Language); if (compilerAnalyzer == null) { // only way to get here is if MEF is corrupted. FailFast.OnFatalException(new Exception("How can this happen?")); } if (hostStateSetMap.TryGetValue(compilerAnalyzer, out var compilerStateSet)) { stateSets.Add(compilerStateSet); } // now add all project analyzers stateSets.AddRange(GetOrUpdateProjectAnalyzerMap(project).Values); // now add analyzers that exist in both host and project var analyzerMap = _analyzerInfoCache.GetOrCreateHostDiagnosticAnalyzersPerReference(project.Language); foreach (var(identity, analyzers) in analyzerMap) { if (!referenceIdentities.Contains(identity)) { // it is from host analyzer package rather than project analyzer reference // which build doesn't have continue; } // if same analyzer exists both in host (vsix) and in analyzer reference, // we include it in build only analyzer. foreach (var analyzer in analyzers) { if (hostStateSetMap.TryGetValue(analyzer, out var stateSet) && stateSet != compilerStateSet) { stateSets.Add(stateSet); } } } return(stateSets.ToImmutable()); }