Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SLVS-1551 Remove the AnalyzerUpdatedForConnection #5775

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -79,20 +79,6 @@ public void MefCtor_CheckIsSingleton()
MefTestHelpers.CheckIsSingletonMefComponent<SolutionRoslynAnalyzerManager>();
}

[TestMethod]
public void Ctor_SubscribesToConnectedModeAnalyzerProviderEvent()
{
var connectedModeAnalyzerProvider = Substitute.For<IConnectedModeRoslynAnalyzerProvider>();
new SolutionRoslynAnalyzerManager(
embeddedRoslynAnalyzerProvider,
connectedModeAnalyzerProvider,
roslynWorkspaceWrapper,
analyzerComparer,
logger);

connectedModeAnalyzerProvider.Received().AnalyzerUpdatedForConnection += Arg.Any<EventHandler<AnalyzerUpdatedForConnectionEventArgs>>();
}

[TestMethod]
public void OnSolutionChanged_NoOpenSolution_DoesNothing()
{
Expand Down Expand Up @@ -225,90 +211,6 @@ public void OnSolutionChanged_DifferentSolutionOpened_RegistersAnalyzers()
roslynWorkspaceWrapper.TryApplyChanges(v2Solution);
});
}

[TestMethod]
public void HandleConnectedModeAnalyzerUpdate_Standalone_Ignored()
{
var v1Solution = Substitute.For<IRoslynSolutionWrapper>();
SetUpStandaloneSolution(v1Solution, "solution");
EnableDefaultEmbeddedAnalyzers();

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

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

[TestMethod]
public void HandleConnectedModeAnalyzerUpdate_Connected_DifferentConnection_Ignored()
{
var v1Solution = Substitute.For<IRoslynSolutionWrapper>();
SetUpBoundSolution(v1Solution, "solution");
EnableDefaultEmbeddedAnalyzers();

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

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

[TestMethod]
public void HandleConnectedModeAnalyzerUpdate_Connected_NewAnalyzerSet()
{
var connectionWithSameId = new ServerConnection.SonarCloud(((ServerConnection.SonarCloud)connectedModeConfiguration.Project.ServerConnection).OrganizationKey);
var differentConnectedAnalyzers = ImmutableArray.Create(new AnalyzerFileReference(@"C:\path\connected2", Substitute.For<IAnalyzerAssemblyLoader>()));
var v1Solution = Substitute.For<IRoslynSolutionWrapper>();
var v2Solution = Substitute.For<IRoslynSolutionWrapper>();
var v3Solution = Substitute.For<IRoslynSolutionWrapper>();
SetUpBoundSolution(v1Solution, "solution");
SetUpCurrentSolutionSequence(v1Solution, v2Solution);
embeddedRoslynAnalyzerProvider.Get().Returns(differentConnectedAnalyzers);
SetUpAnalyzerRemoval(v1Solution, v2Solution, connectedAnalyzers);
SetUpAnalyzerAddition(v2Solution, v3Solution, differentConnectedAnalyzers);

testSubject.HandleConnectedModeAnalyzerUpdate(null, new AnalyzerUpdatedForConnectionEventArgs(connectionWithSameId, connectedAnalyzers));

Received.InOrder(() =>
{
connectedModeRoslynAnalyzerProvider.GetOrNull(connectionWithSameId);
analyzerComparer.Equals(connectedAnalyzers, differentConnectedAnalyzers);
v1Solution.RemoveAnalyzerReferences(connectedAnalyzers);
roslynWorkspaceWrapper.TryApplyChanges(v2Solution);
v2Solution.WithAnalyzerReferences(differentConnectedAnalyzers);
roslynWorkspaceWrapper.TryApplyChanges(v3Solution);
});
}

[TestMethod]
public void HandleConnectedModeAnalyzerUpdate_Connected_AnalyzersDidNotChange_DoesNotReRegisterConnected()
{
var connectionWithSameId = new ServerConnection.SonarCloud(((ServerConnection.SonarCloud)connectedModeConfiguration.Project.ServerConnection).OrganizationKey);
var sameSetOfConnectedAnalyzers = ImmutableArray.Create(new AnalyzerFileReference(@"C:\path\connected", Substitute.For<IAnalyzerAssemblyLoader>()));
var v1Solution = Substitute.For<IRoslynSolutionWrapper>();
SetUpBoundSolution(v1Solution, "solution");
SetUpCurrentSolutionSequence(v1Solution);
connectedModeRoslynAnalyzerProvider.GetOrNull(connectionWithSameId).Returns(sameSetOfConnectedAnalyzers);
analyzerComparer.Equals(connectedAnalyzers, sameSetOfConnectedAnalyzers).Returns(true);

testSubject.HandleConnectedModeAnalyzerUpdate(null, new AnalyzerUpdatedForConnectionEventArgs(connectionWithSameId, sameSetOfConnectedAnalyzers));

Received.InOrder(() =>
{
connectedModeRoslynAnalyzerProvider.GetOrNull(connectionWithSameId);
analyzerComparer.Equals(connectedAnalyzers, sameSetOfConnectedAnalyzers);
});
embeddedRoslynAnalyzerProvider.DidNotReceiveWithAnyArgs().Get();
v1Solution.ReceivedCalls().Should().BeEmpty();
roslynWorkspaceWrapper.DidNotReceiveWithAnyArgs().TryApplyChanges(default);
}

[TestMethod]
public void Dispose_UnsubscribesToConnectedModeAnalyzerProviderEvent()
{
testSubject.Dispose();

connectedModeRoslynAnalyzerProvider.Received().AnalyzerUpdatedForConnection -= Arg.Any<EventHandler<AnalyzerUpdatedForConnectionEventArgs>>();
}

[TestMethod]
public void OnSolutionChanged_Disposed_Throws()
Expand All @@ -318,15 +220,6 @@ public void OnSolutionChanged_Disposed_Throws()

act.Should().Throw<ObjectDisposedException>();
}

[TestMethod]
public void HandleConnectedModeAnalyzerUpdate_Disposed_Throws()
{
var act = () => testSubject.HandleConnectedModeAnalyzerUpdate(null, new AnalyzerUpdatedForConnectionEventArgs(connectedModeConfiguration.Project.ServerConnection, embeddedAnalyzers));
testSubject.Dispose();

act.Should().Throw<ObjectDisposedException>();
}

private void SetUpCurrentSolutionSequence(IRoslynSolutionWrapper solution, params IRoslynSolutionWrapper[] solutions)
{
Expand Down Expand Up @@ -359,12 +252,6 @@ private void SetUpStandaloneSolution(IRoslynSolutionWrapper solution, string sol
EnableDefaultEmbeddedAnalyzers();
SimulateSolutionSet(solution, solutionName, BindingConfiguration.Standalone, embeddedAnalyzers);
}

private void SetUpBoundSolution(IRoslynSolutionWrapper solution, string solutionName)
{
connectedModeRoslynAnalyzerProvider.GetOrNull(default).ReturnsForAnyArgs(connectedAnalyzers);
SimulateSolutionSet(solution, solutionName, connectedModeConfiguration, connectedAnalyzers);
}

private void SimulateSolutionSet(IRoslynSolutionWrapper resultingSolution, string solutionName, BindingConfiguration bindingConfiguration, ImmutableArray<AnalyzerFileReference> analyzers)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,4 @@ public ConnectedModeRoslynAnalyzerProvider()
{
return null;
}

public event EventHandler<AnalyzerUpdatedForConnectionEventArgs> AnalyzerUpdatedForConnection;
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,4 @@ public interface IConnectedModeRoslynAnalyzerProvider
/// Returns SonarAnalyzer.CSharp & SonarAnalyzer.VisualBasic analyzer DLLs that are downloaded from the server for the current binding
/// </summary>
ImmutableArray<AnalyzerFileReference>? GetOrNull(ServerConnection connection);
/// <summary>
/// Provides updates about the analyzers for a given connection
/// </summary>
/// <remarks>
/// Internally this reacts to SLCore synchronization and updates to the cached Connected Mode analyzers
/// </remarks>
event EventHandler<AnalyzerUpdatedForConnectionEventArgs> AnalyzerUpdatedForConnection;
}

[ExcludeFromCodeCoverage]
public class AnalyzerUpdatedForConnectionEventArgs(ServerConnection connection, ImmutableArray<AnalyzerFileReference>? analyzers) : EventArgs
{
public ServerConnection Connection { get; } = connection;
public ImmutableArray<AnalyzerFileReference>? Analyzers { get; } = analyzers;
}
16 changes: 0 additions & 16 deletions src/Infrastructure.VS/Roslyn/SolutionRoslynAnalyzerManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,6 @@ public SolutionRoslynAnalyzerManager(
this.roslynWorkspace = roslynWorkspace;
this.analyzerComparer = analyzerComparer;
this.logger = logger;

connectedModeAnalyzerProvider.AnalyzerUpdatedForConnection += HandleConnectedModeAnalyzerUpdate;
}

public void OnSolutionChanged(string solutionName, BindingConfiguration bindingConfiguration)
Expand Down Expand Up @@ -114,23 +112,9 @@ public void Dispose()
{
return;
}
connectedModeAnalyzerProvider.AnalyzerUpdatedForConnection -= HandleConnectedModeAnalyzerUpdate;
disposed = true;
}

internal /* for testing */ void HandleConnectedModeAnalyzerUpdate(object sender, AnalyzerUpdatedForConnectionEventArgs args)
{
lock (lockObject)
{
ThrowIfDisposed();

if (args.Connection is not null && currentState?.BindingConfiguration.Project?.ServerConnection.Id == args.Connection.Id)
{
UpdateAnalyzersIfChanged(ChooseAnalyzers(args.Connection));
}
}
}

private void UpdateCurrentSolutionInfo(string solutionName, BindingConfiguration bindingConfiguration, out bool isSameSolution)
{
if (currentState is { SolutionName: var currentSolutionName } && solutionName == currentSolutionName)
Expand Down