Skip to content

Commit

Permalink
Remove unnecessary language tracking in the diagnostic service (#77100)
Browse files Browse the repository at this point in the history
  • Loading branch information
CyrusNajmabadi authored Feb 7, 2025
2 parents d134e86 + d5535e9 commit eeb5c70
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ static HostAnalyzerStateSets CreateLanguageSpecificAnalyzerMap(HostAnalyzerState
var analyzersPerReference = state.HostAnalyzers.GetOrCreateHostDiagnosticAnalyzersPerReference(language);

var (hostAnalyzerCollection, projectAnalyzerCollection) = GetAnalyzerCollections(analyzersPerReference, state.ReferenceIdsToRedirect);
var analyzerMap = CreateStateSetMap(language, projectAnalyzerCollection, hostAnalyzerCollection, includeWorkspacePlaceholderAnalyzers: true);
var analyzerMap = CreateStateSetMap(projectAnalyzerCollection, hostAnalyzerCollection, includeWorkspacePlaceholderAnalyzers: true);

return new HostAnalyzerStateSets(analyzerMap);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ private ProjectAnalyzerStateSets CreateProjectStateSets(Project project)
return ProjectAnalyzerStateSets.Default;
}

var newMap = CreateStateSetMap(project.Language, analyzersPerReference.Values, [], includeWorkspacePlaceholderAnalyzers: false);
var newMap = CreateStateSetMap(analyzersPerReference.Values, [], includeWorkspacePlaceholderAnalyzers: false);
var skippedAnalyzersInfo = project.GetSkippedAnalyzersInfo(_analyzerInfoCache);
return new ProjectAnalyzerStateSets(project.AnalyzerReferences, analyzersPerReference, newMap, skippedAnalyzersInfo);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,15 +69,6 @@ public IEnumerable<StateSet> GetStateSets(ProjectId projectId)
: hostStateSets;
}

/// <summary>
/// Return <see cref="StateSet"/>s for the given <see cref="Project"/>.
/// This will never create new <see cref="StateSet"/> but will return ones already created.
/// Difference with <see cref="GetStateSets(ProjectId)"/> is that
/// this will only return <see cref="StateSet"/>s that have same language as <paramref name="project"/>.
/// </summary>
public IEnumerable<StateSet> GetStateSets(Project project)
=> GetStateSets(project.Id).Where(s => s.Language == project.Language);

/// <summary>
/// Return <see cref="StateSet"/>s for the given <see cref="Project"/>.
/// This will either return already created <see cref="StateSet"/>s for the specific snapshot of <see cref="Project"/> or
Expand Down Expand Up @@ -115,7 +106,6 @@ private void RaiseProjectAnalyzerReferenceChanged(ProjectAnalyzerReferenceChange
=> ProjectAnalyzerReferenceChanged?.Invoke(this, args);

private static ImmutableDictionary<DiagnosticAnalyzer, StateSet> CreateStateSetMap(
string language,
IEnumerable<ImmutableArray<DiagnosticAnalyzer>> projectAnalyzerCollection,
IEnumerable<ImmutableArray<DiagnosticAnalyzer>> hostAnalyzerCollection,
bool includeWorkspacePlaceholderAnalyzers)
Expand All @@ -124,8 +114,8 @@ private static ImmutableDictionary<DiagnosticAnalyzer, StateSet> CreateStateSetM

if (includeWorkspacePlaceholderAnalyzers)
{
builder.Add(FileContentLoadAnalyzer.Instance, new StateSet(language, FileContentLoadAnalyzer.Instance, isHostAnalyzer: true));
builder.Add(GeneratorDiagnosticsPlaceholderAnalyzer.Instance, new StateSet(language, GeneratorDiagnosticsPlaceholderAnalyzer.Instance, isHostAnalyzer: true));
builder.Add(FileContentLoadAnalyzer.Instance, new StateSet(FileContentLoadAnalyzer.Instance, isHostAnalyzer: true));
builder.Add(GeneratorDiagnosticsPlaceholderAnalyzer.Instance, new StateSet(GeneratorDiagnosticsPlaceholderAnalyzer.Instance, isHostAnalyzer: true));
}

foreach (var analyzers in projectAnalyzerCollection)
Expand All @@ -143,7 +133,7 @@ private static ImmutableDictionary<DiagnosticAnalyzer, StateSet> CreateStateSetM
continue;
}

builder.Add(analyzer, new StateSet(language, analyzer, isHostAnalyzer: false));
builder.Add(analyzer, new StateSet(analyzer, isHostAnalyzer: false));
}
}

Expand All @@ -162,38 +152,15 @@ private static ImmutableDictionary<DiagnosticAnalyzer, StateSet> CreateStateSetM
continue;
}

builder.Add(analyzer, new StateSet(language, analyzer, isHostAnalyzer: true));
builder.Add(analyzer, new StateSet(analyzer, isHostAnalyzer: true));
}
}

return builder.ToImmutable();
}

private readonly struct HostAnalyzerStateSetKey : IEquatable<HostAnalyzerStateSetKey>
{
public HostAnalyzerStateSetKey(string language, bool hasSdkCodeStyleAnalyzers, IReadOnlyList<AnalyzerReference> analyzerReferences)
{
Language = language;
HasSdkCodeStyleAnalyzers = hasSdkCodeStyleAnalyzers;
AnalyzerReferences = analyzerReferences;
}

public string Language { get; }
public bool HasSdkCodeStyleAnalyzers { get; }
public IReadOnlyList<AnalyzerReference> AnalyzerReferences { get; }

public bool Equals(HostAnalyzerStateSetKey other)
=> Language == other.Language &&
HasSdkCodeStyleAnalyzers == other.HasSdkCodeStyleAnalyzers &&
AnalyzerReferences == other.AnalyzerReferences;

public override bool Equals(object? obj)
=> obj is HostAnalyzerStateSetKey key && Equals(key);

public override int GetHashCode()
=> Hash.Combine(Language.GetHashCode(),
Hash.Combine(HasSdkCodeStyleAnalyzers.GetHashCode(), AnalyzerReferences.GetHashCode()));
}
private readonly record struct HostAnalyzerStateSetKey(
string Language, bool HasSdkCodeStyleAnalyzers, IReadOnlyList<AnalyzerReference> AnalyzerReferences);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,14 @@ internal partial class DiagnosticIncrementalAnalyzer
/// </summary>
private sealed class StateSet
{
public readonly string Language;
public readonly DiagnosticAnalyzer Analyzer;
public readonly bool IsHostAnalyzer;

private readonly ConcurrentSet<DocumentId> _activeDocuments;
private readonly ConcurrentDictionary<ProjectId, ProjectState> _projectStates;

public StateSet(string language, DiagnosticAnalyzer analyzer, bool isHostAnalyzer)
public StateSet(DiagnosticAnalyzer analyzer, bool isHostAnalyzer)
{
Language = language;
Analyzer = analyzer;
IsHostAnalyzer = isHostAnalyzer;

Expand Down

0 comments on commit eeb5c70

Please sign in to comment.