Skip to content

Commit

Permalink
SLVS-1557 Fix analyzers being replaced rather than added (#5779)
Browse files Browse the repository at this point in the history
  • Loading branch information
georgii-borovinskikh-sonarsource authored Oct 28, 2024
1 parent 9a98e29 commit 2468792
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,27 @@ public void AddAnalyzer_CurrentSolutionContainsAnalyzer()
var roslynWorkspaceWrapper = CreateWorkspaceWrapper();
var analyzers = ImmutableArray.Create(analyzerFileReference);

var solutionAfterAddition = roslynWorkspaceWrapper.CurrentSolution.WithAnalyzerReferences(analyzers);
var solutionAfterAddition = roslynWorkspaceWrapper.CurrentSolution.AddAnalyzerReferences(analyzers);
roslynWorkspaceWrapper.TryApplyChanges(solutionAfterAddition).Should().BeTrue();

roslynWorkspaceWrapper.CurrentSolution.GetRoslynSolution().AnalyzerReferences.Contains(analyzerFileReference).Should().BeTrue();
roslynWorkspaceWrapper.CurrentSolution.GetRoslynSolution().AnalyzerReferences.Should().Contain(analyzerFileReference);
}

[TestMethod]
public void AddExtraAnalyzer_CurrentSolutionContainsBothAnalyzers()
{
var analyzerFileReference = new AnalyzerFileReference(@"C:\abc", Substitute.For<IAnalyzerAssemblyLoader>());
var extraAnalyzerFileReference = new AnalyzerFileReference(@"C:\abc", Substitute.For<IAnalyzerAssemblyLoader>());
var roslynWorkspaceWrapper = CreateWorkspaceWrapper();
var extraAnalyzers = ImmutableArray.Create(extraAnalyzerFileReference);
roslynWorkspaceWrapper.TryApplyChanges(roslynWorkspaceWrapper.CurrentSolution.AddAnalyzerReferences(ImmutableArray.Create(analyzerFileReference))).Should().BeTrue();

var solutionAfterAddition = roslynWorkspaceWrapper.CurrentSolution.AddAnalyzerReferences(extraAnalyzers);
roslynWorkspaceWrapper.TryApplyChanges(solutionAfterAddition).Should().BeTrue();

var solutionAnalyzers = roslynWorkspaceWrapper.CurrentSolution.GetRoslynSolution().AnalyzerReferences;
solutionAnalyzers.Should().Contain(analyzerFileReference);
solutionAnalyzers.Should().Contain(extraAnalyzerFileReference);
}

[TestMethod]
Expand All @@ -54,13 +71,13 @@ public void AddAndRemoveAnalyzer_CurrentSolutionNoLongerContainsAnalyzer()
var roslynWorkspaceWrapper = CreateWorkspaceWrapper();
var analyzers = ImmutableArray.Create(analyzerFileReference);

var solutionAfterAddition = roslynWorkspaceWrapper.CurrentSolution.WithAnalyzerReferences(analyzers);
var solutionAfterAddition = roslynWorkspaceWrapper.CurrentSolution.AddAnalyzerReferences(analyzers);
roslynWorkspaceWrapper.TryApplyChanges(solutionAfterAddition).Should().BeTrue();

var solutionAfterRemoval = roslynWorkspaceWrapper.CurrentSolution.RemoveAnalyzerReferences(analyzers);
roslynWorkspaceWrapper.TryApplyChanges(solutionAfterRemoval).Should().BeTrue();

roslynWorkspaceWrapper.CurrentSolution.GetRoslynSolution().AnalyzerReferences.Contains(analyzerFileReference).Should().BeFalse();
roslynWorkspaceWrapper.CurrentSolution.GetRoslynSolution().AnalyzerReferences.Should().NotContain(analyzerFileReference);
}

[TestMethod]
Expand All @@ -73,7 +90,7 @@ public void RemoveAnalyzer_IsNotPresentInTheCurrentSolution_AppliesNoChange()
var solutionAfterRemoval = roslynWorkspaceWrapper.CurrentSolution.RemoveAnalyzerReferences(analyzers);
roslynWorkspaceWrapper.TryApplyChanges(solutionAfterRemoval).Should().BeTrue();

roslynWorkspaceWrapper.CurrentSolution.GetRoslynSolution().AnalyzerReferences.Contains(analyzerFileReference).Should().BeFalse();
roslynWorkspaceWrapper.CurrentSolution.GetRoslynSolution().AnalyzerReferences.Should().NotContain(analyzerFileReference);
}

[TestMethod]
Expand All @@ -85,10 +102,10 @@ public void AddMultipleAndRemoveOneAnalyzer_CurrentSolutionContainsOneAnalyzer()
var analyzersToRemove = ImmutableArray.Create(analyzerFileReference1);
var roslynWorkspaceWrapper = CreateWorkspaceWrapper();

roslynWorkspaceWrapper.TryApplyChanges(roslynWorkspaceWrapper.CurrentSolution.WithAnalyzerReferences(analyzersToAdd)).Should().BeTrue();
roslynWorkspaceWrapper.TryApplyChanges(roslynWorkspaceWrapper.CurrentSolution.AddAnalyzerReferences(analyzersToAdd)).Should().BeTrue();
roslynWorkspaceWrapper.TryApplyChanges(roslynWorkspaceWrapper.CurrentSolution.RemoveAnalyzerReferences(analyzersToRemove)).Should().BeTrue();
roslynWorkspaceWrapper.CurrentSolution.GetRoslynSolution().AnalyzerReferences.Contains(analyzerFileReference1).Should().BeFalse();
roslynWorkspaceWrapper.CurrentSolution.GetRoslynSolution().AnalyzerReferences.Contains(analyzerFileReference2).Should().BeTrue();
roslynWorkspaceWrapper.CurrentSolution.GetRoslynSolution().AnalyzerReferences.Should().NotContain(analyzerFileReference1);
roslynWorkspaceWrapper.CurrentSolution.GetRoslynSolution().AnalyzerReferences.Should().Contain(analyzerFileReference2);
}

private static IRoslynWorkspaceWrapper CreateWorkspaceWrapper()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ public void OnSolutionChanged_StandaloneSolution_BindingSet_RemovesStandaloneAnd
analyzerComparer.Equals(embeddedAnalyzers, connectedAnalyzers);
v1Solution.RemoveAnalyzerReferences(embeddedAnalyzers);
roslynWorkspaceWrapper.TryApplyChanges(v2Solution);
v2Solution.WithAnalyzerReferences(connectedAnalyzers);
v2Solution.AddAnalyzerReferences(connectedAnalyzers);
roslynWorkspaceWrapper.TryApplyChanges(v3Solution);
});
embeddedRoslynAnalyzerProvider.DidNotReceiveWithAnyArgs().Get();
Expand Down Expand Up @@ -180,7 +180,7 @@ public void OnSolutionChanged_SolutionClosedAndReopened_RegistersAnalyzersAgain(
testSubject.OnSolutionChanged(null, BindingConfiguration.Standalone);
testSubject.OnSolutionChanged(solutionName, BindingConfiguration.Standalone);

v2Solution.Received().WithAnalyzerReferences(embeddedAnalyzers);
v2Solution.Received().AddAnalyzerReferences(embeddedAnalyzers);
roslynWorkspaceWrapper.Received().TryApplyChanges(v3Solution);
}

Expand All @@ -200,7 +200,7 @@ public void OnSolutionChanged_SolutionClosedAndReopenedAsBound_RegistersConnecte
roslynWorkspaceWrapper.CurrentSolution.Returns(v2Solution); // simulate solution closed and opened, so this is a different version now
testSubject.OnSolutionChanged(solutionName, connectedModeConfiguration);

v2Solution.Received().WithAnalyzerReferences(connectedAnalyzers);
v2Solution.Received().AddAnalyzerReferences(connectedAnalyzers);
roslynWorkspaceWrapper.Received().TryApplyChanges(v3Solution);
}

Expand All @@ -221,7 +221,7 @@ public void OnSolutionChanged_DifferentSolutionOpened_RegistersAnalyzers()

Received.InOrder(() =>
{
v1Solution.WithAnalyzerReferences(connectedAnalyzers);
v1Solution.AddAnalyzerReferences(connectedAnalyzers);
roslynWorkspaceWrapper.TryApplyChanges(v2Solution);
});
}
Expand All @@ -235,7 +235,7 @@ public void HandleConnectedModeAnalyzerUpdate_Standalone_Ignored()

testSubject.HandleConnectedModeAnalyzerUpdate(null, new AnalyzerUpdatedForConnectionEventArgs(new ServerConnection.SonarCloud("someorg"), connectedAnalyzers));

v1Solution.DidNotReceiveWithAnyArgs().WithAnalyzerReferences(default);
v1Solution.DidNotReceiveWithAnyArgs().AddAnalyzerReferences(default);
v1Solution.DidNotReceiveWithAnyArgs().RemoveAnalyzerReferences(default);
}

Expand All @@ -248,7 +248,7 @@ public void HandleConnectedModeAnalyzerUpdate_Connected_DifferentConnection_Igno

testSubject.HandleConnectedModeAnalyzerUpdate(null, new AnalyzerUpdatedForConnectionEventArgs(new ServerConnection.SonarCloud("some other org"), connectedAnalyzers));

v1Solution.DidNotReceiveWithAnyArgs().WithAnalyzerReferences(default);
v1Solution.DidNotReceiveWithAnyArgs().AddAnalyzerReferences(default);
v1Solution.DidNotReceiveWithAnyArgs().RemoveAnalyzerReferences(default);
}

Expand All @@ -274,7 +274,7 @@ public void HandleConnectedModeAnalyzerUpdate_Connected_NewAnalyzerSet()
analyzerComparer.Equals(connectedAnalyzers, differentConnectedAnalyzers);
v1Solution.RemoveAnalyzerReferences(connectedAnalyzers);
roslynWorkspaceWrapper.TryApplyChanges(v2Solution);
v2Solution.WithAnalyzerReferences(differentConnectedAnalyzers);
v2Solution.AddAnalyzerReferences(differentConnectedAnalyzers);
roslynWorkspaceWrapper.TryApplyChanges(v3Solution);
});
}
Expand Down Expand Up @@ -337,7 +337,7 @@ private void SetUpAnalyzerAddition(IRoslynSolutionWrapper originalSolution,
IRoslynSolutionWrapper resultingSolution,
ImmutableArray<AnalyzerFileReference> analyzers)
{
originalSolution.WithAnalyzerReferences(analyzers).Returns(resultingSolution);
originalSolution.AddAnalyzerReferences(analyzers).Returns(resultingSolution);
roslynWorkspaceWrapper.TryApplyChanges(resultingSolution).Returns(true);
}

Expand Down
6 changes: 3 additions & 3 deletions src/Infrastructure.VS/Roslyn/IRoslynSolutionWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ namespace SonarLint.VisualStudio.Infrastructure.VS.Roslyn;
internal interface IRoslynSolutionWrapper
{
IRoslynSolutionWrapper RemoveAnalyzerReferences(ImmutableArray<AnalyzerFileReference> analyzers);
IRoslynSolutionWrapper WithAnalyzerReferences(ImmutableArray<AnalyzerFileReference> analyzers);
IRoslynSolutionWrapper AddAnalyzerReferences(ImmutableArray<AnalyzerFileReference> analyzers);
Solution GetRoslynSolution();
}

Expand All @@ -43,8 +43,8 @@ public IRoslynSolutionWrapper RemoveAnalyzerReferences(ImmutableArray<AnalyzerFi
? current.RemoveAnalyzerReference(analyzer)
: current));

public IRoslynSolutionWrapper WithAnalyzerReferences(ImmutableArray<AnalyzerFileReference> analyzers) =>
new RoslynSolutionWrapper(solution.WithAnalyzerReferences(analyzers));
public IRoslynSolutionWrapper AddAnalyzerReferences(ImmutableArray<AnalyzerFileReference> analyzers) =>
new RoslynSolutionWrapper(solution.AddAnalyzerReferences(analyzers));

public Solution GetRoslynSolution() => solution;
}
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ private void UpdateAnalyzers(ImmutableArray<AnalyzerFileReference> analyzersToUs

private void AddAnalyzer(ImmutableArray<AnalyzerFileReference> analyzerToUse)
{
if (!roslynWorkspace.TryApplyChanges(roslynWorkspace.CurrentSolution.WithAnalyzerReferences(analyzerToUse)))
if (!roslynWorkspace.TryApplyChanges(roslynWorkspace.CurrentSolution.AddAnalyzerReferences(analyzerToUse)))
{
const string message = "Failed to add analyzer references while adding analyzers";
Debug.Assert(true, message);
Expand Down

0 comments on commit 2468792

Please sign in to comment.