Skip to content

Commit

Permalink
Revert "UtilityAnalyzer: Use RegisterCompilationStartAction" (#7262)
Browse files Browse the repository at this point in the history
  • Loading branch information
mary-georgiou-sonarsource authored May 25, 2023
1 parent 566a34c commit fd38a91
Show file tree
Hide file tree
Showing 8 changed files with 22 additions and 139 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ internal SonarCompilationStartAnalysisContext(SonarAnalysisContext analysisConte
public void RegisterSymbolAction(Action<SonarSymbolReportingContext> action, params SymbolKind[] symbolKinds) =>
Context.RegisterSymbolAction(x => action(new(AnalysisContext, x)), symbolKinds);

public void RegisterSemanticModelAction(Action<SonarSematicModelReportingContext> action) =>
Context.RegisterSemanticModelAction(x => action(new(AnalysisContext, x)));

public void RegisterCompilationEndAction(Action<SonarCompilationReportingContext> action) =>
Context.RegisterCompilationEndAction(x => action(new(AnalysisContext, x)));

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,6 @@ public ReportingContext(SonarSymbolReportingContext context, Diagnostic diagnost
public ReportingContext(SonarCodeBlockReportingContext context, Diagnostic diagnostic)
: this(diagnostic, context.Context.ReportDiagnostic, context.Compilation, context.Tree) { }

public ReportingContext(SonarSematicModelReportingContext context, Diagnostic diagnostic)
: this(diagnostic, context.Context.ReportDiagnostic, context.Compilation, context.Tree) { }

private ReportingContext(Diagnostic diagnostic,
Action<Diagnostic> roslynReportDiagnostic,
Compilation compilation,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public abstract class AnalysisWarningAnalyzerBase : UtilityAnalyzerBase
protected AnalysisWarningAnalyzerBase() : base(DiagnosticId, Title) { }

protected sealed override void Initialize(SonarAnalysisContext context) =>
context.RegisterCompilationStartAction(c =>
context.RegisterCompilationAction(c =>
{
ReadParameters(c);
if (IsAnalyzerEnabled && !RoslynHelper.IsRoslynCfgSupported(MinimalSupportedRoslynVersion)) // MsBuild 15 is bound with Roslyn 2.x, where Roslyn CFG is not available.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ internal static TextRange GetTextRange(FileLinePositionSpan lineSpan) =>
EndOffset = lineSpan.EndLinePosition.Character
};

protected void ReadParameters(SonarCompilationStartAnalysisContext context)
protected void ReadParameters(SonarCompilationReportingContext context)
{
var outPath = context.ProjectConfiguration().OutPath;
// For backward compatibility with S4MSB <= 5.0
Expand Down Expand Up @@ -87,39 +87,31 @@ public abstract class UtilityAnalyzerBase<TSyntaxKind, TMessage> : UtilityAnalyz
protected UtilityAnalyzerBase(string diagnosticId, string title) : base(diagnosticId, title) { }

protected sealed override void Initialize(SonarAnalysisContext context) =>
context.RegisterCompilationStartAction(startContext =>
context.RegisterCompilationAction(context =>
{
ReadParameters(startContext);
ReadParameters(context);
if (!IsAnalyzerEnabled)
{
return;
}

var treeMessages = new List<TMessage>();
startContext.RegisterSemanticModelAction(modelContext =>
{
if (ShouldGenerateMetrics(modelContext))
{
treeMessages.Add(CreateMessage(modelContext.Tree, modelContext.SemanticModel));
}
});
var treeMessages = context.Compilation.SyntaxTrees
.Where(x => ShouldGenerateMetrics(context, x))
.Select(x => CreateMessage(x, context.Compilation.GetSemanticModel(x)));

startContext.RegisterCompilationEndAction(endContext =>
var allMessages = CreateAnalysisMessages(context)
.Concat(treeMessages)
.WhereNotNull()
.ToArray();
lock (FileWriteLock)
{
var allMessages = CreateAnalysisMessages(endContext)
.Concat(treeMessages)
.WhereNotNull()
.ToArray();
lock (FileWriteLock)
Directory.CreateDirectory(OutPath);
using var stream = File.Create(Path.Combine(OutPath, FileName));
foreach (var message in allMessages)
{
Directory.CreateDirectory(OutPath);
using var stream = File.Create(Path.Combine(OutPath, FileName));
foreach (var message in allMessages)
{
message.WriteDelimitedTo(stream);
}
message.WriteDelimitedTo(stream);
}
});
}
});

protected virtual bool ShouldGenerateMetrics(SyntaxTree tree) =>
Expand All @@ -128,8 +120,8 @@ protected virtual bool ShouldGenerateMetrics(SyntaxTree tree) =>
&& FileExtensionWhitelist.Contains(Path.GetExtension(tree.FilePath))
&& (AnalyzeGeneratedCode || !Language.GeneratedCodeRecognizer.IsGenerated(tree));

private bool ShouldGenerateMetrics(SonarSematicModelReportingContext context) =>
(AnalyzeUnchangedFiles || !context.IsUnchanged(context.Tree))
&& ShouldGenerateMetrics(context.Tree);
private bool ShouldGenerateMetrics(SonarCompilationReportingContext context, SyntaxTree tree) =>
(AnalyzeUnchangedFiles || !context.IsUnchanged(tree))
&& ShouldGenerateMetrics(tree);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -142,17 +142,6 @@ public void SonarCompilationStartAnalysisContext_RegisterCompilationEndAction()
startContext.AssertExpectedInvocationCounts(expectedCompilationEndCount: 1);
}

[TestMethod]
public void SonarCompilationStartAnalysisContext_RegisterSemanticModel()
{
var context = new DummyAnalysisContext(TestContext);
var startContext = new DummyCompilationStartAnalysisContext(context);
var sut = new SonarCompilationStartAnalysisContext(new(context, DummyMainDescriptor), startContext);
sut.RegisterSemanticModelAction(_ => { });

startContext.AssertExpectedInvocationCounts(expectedSemanticModelCount: 1);
}

[TestMethod]
public void SonarCompilationStartAnalysisContext_RegisterSymbolAction()
{
Expand All @@ -175,18 +164,6 @@ public void SonarCompilationStartAnalysisContext_RegisterNodeAction()
startContext.AssertExpectedInvocationCounts(expectedNodeCount: 0); // RegisterNodeAction doesn't use DummyCompilationStartAnalysisContext to register but a newly created context
}

[TestMethod]
public void SonarCompilationStartAnalysisContext_RegisterSemanticModel_ReportsIssue()
{
var context = new DummyAnalysisContext(TestContext);
var startContext = new DummyCompilationStartAnalysisContext(context);
var sut = new SonarCompilationStartAnalysisContext(new(context, DummyMainDescriptor), startContext);
var diagnostic = Diagnostic.Create(DiagnosticDescriptorFactory.CreateUtility("TEST", "Test report"), context.Tree.GetRoot().GetLocation());
sut.RegisterSemanticModelAction(x => x.ReportIssue(diagnostic));

startContext.RaisedDiagnostic.Should().NotBeNull().And.BeSameAs(diagnostic);
}

[TestMethod]
public void SonarCompilationStartAnalysisContext_RegisterCompilationEnd_ReportsIssue()
{
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.VisualBasic;
using Moq;
using SonarAnalyzer.AnalysisContext;
using SonarAnalyzer.Common;
using SonarAnalyzer.Extensions;
using SonarAnalyzer.Rules;

namespace SonarAnalyzer.UnitTest.Rules.Utilities
Expand Down Expand Up @@ -139,8 +137,8 @@ public TestUtilityAnalyzer(string language, params string[] additionalPaths) : b
LanguageNames.VisualBasic => VisualBasicCompilation.Create(null),
_ => throw new InvalidOperationException($"Unexpected {nameof(language)}: {language}")
};
var context = new Mock<CompilationStartAnalysisContext>(compilation, new AnalyzerOptions(additionalFiles), default).Object;
ReadParameters(new SonarCompilationStartAnalysisContext(AnalysisScaffolding.CreateSonarAnalysisContext(), context));
var context = new CompilationAnalysisContext(compilation, new AnalyzerOptions(additionalFiles), null, null, default);
ReadParameters(new(AnalysisScaffolding.CreateSonarAnalysisContext(), context));
}

protected override void Initialize(SonarAnalysisContext context) =>
Expand Down

0 comments on commit fd38a91

Please sign in to comment.