Skip to content

Commit

Permalink
Cleanup SyntaxTrackerBase (#9225)
Browse files Browse the repository at this point in the history
  • Loading branch information
costin-zaharia-sonarsource committed May 7, 2024
1 parent 97d7805 commit 28d9df3
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,9 @@ public abstract class SonarTreeReportingContextBase<TContext> : SonarReportingCo
public void ReportIssue(DiagnosticDescriptor rule, SyntaxToken locationToken, IEnumerable<SyntaxNode> additionalLocations, params object[] messageArgs) =>
ReportIssueCore(Diagnostic.Create(rule, locationToken.GetLocation(), additionalLocations.Select(x => x.GetLocation()), messageArgs));

public void ReportIssue(DiagnosticDescriptor rule, Location location, IEnumerable<Location> additionalLocations, ImmutableDictionary<string, string> properties, params object[] messageArgs) =>
ReportIssueCore(Diagnostic.Create(rule, location, additionalLocations, properties, messageArgs));

public void ReportIssue(DiagnosticDescriptor rule, Location location, params object[] messageArgs) =>
ReportIssueCore(Diagnostic.Create(rule, location, messageArgs));
}
Expand Down
30 changes: 13 additions & 17 deletions analyzers/src/SonarAnalyzer.Common/Trackers/SyntaxTrackerBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,48 +28,44 @@ public abstract class SyntaxTrackerBase<TSyntaxKind, TContext> : TrackerBase<TSy
protected abstract TContext CreateContext(SonarSyntaxNodeReportingContext context);

public void Track(TrackerInput input, params Condition[] conditions) =>
Track(input, Array.Empty<object>(), conditions);
Track(input, [], conditions);

public void Track(TrackerInput input, object[] diagnosticMessageArgs, params Condition[] conditions)
{
input.Context.RegisterCompilationStartAction(c =>
{
if (input.IsEnabled(c.Options))
{
c.RegisterNodeAction(
Language.GeneratedCodeRecognizer,
TrackAndReportIfNecessary,
TrackedSyntaxKinds);
c.RegisterNodeAction(Language.GeneratedCodeRecognizer, TrackAndReportIfNecessary, TrackedSyntaxKinds);
}
});

void TrackAndReportIfNecessary(SonarSyntaxNodeReportingContext c)
{
if (CreateContext(c) is { } trackingContext
&& conditions.All(c => c(trackingContext))
&& trackingContext.PrimaryLocation != null
&& Array.TrueForAll(conditions, x => x(trackingContext))
&& trackingContext.PrimaryLocation is not null
&& trackingContext.PrimaryLocation != Location.None)
{
c.ReportIssue(
Diagnostic.Create(input.Rule,
trackingContext.PrimaryLocation,
trackingContext.SecondaryLocations.ToAdditionalLocations(),
trackingContext.SecondaryLocations.ToProperties(),
diagnosticMessageArgs));
c.ReportIssue(input.Rule,
trackingContext.PrimaryLocation,
trackingContext.SecondaryLocations.ToAdditionalLocations(),
trackingContext.SecondaryLocations.ToProperties(),
diagnosticMessageArgs);
}
}
}

public Condition ExceptWhen(Condition condition) =>
value => !condition(value);
x => !condition(x);

public Condition And(Condition condition1, Condition condition2) =>
value => condition1(value) && condition2(value);
x => condition1(x) && condition2(x);

public Condition Or(Condition condition1, Condition condition2) =>
value => condition1(value) || condition2(value);
x => condition1(x) || condition2(x);

public Condition Or(Condition condition1, Condition condition2, Condition condition3) =>
value => condition1(value) || condition2(value) || condition3(value);
x => condition1(x) || condition2(x) || condition3(x);
}
}

0 comments on commit 28d9df3

Please sign in to comment.