Skip to content

Commit

Permalink
fixed an issue where workspace folders could be null, and this would …
Browse files Browse the repository at this point in the history
…cause issues (#346)

* fixed an issue where workspace folders could be null, and this would cause issues

* Change timings on test... SettleNext() was never awaited

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
  • Loading branch information
david-driscoll and mergify[bot] authored Sep 1, 2020
1 parent c451a74 commit 09d9466
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 8 deletions.
7 changes: 6 additions & 1 deletion src/Server/LanguageServerWorkspaceFolderManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,11 @@ async Task IOnLanguageServerStarted.OnStarted(ILanguageServer server, Cancellati
IsSupported = server.ClientSettings?.Capabilities?.Workspace?.WorkspaceFolders.IsSupported == true;
if (IsSupported)
{
await Refresh().LastOrDefaultAsync().ToTask(cancellationToken);
foreach (var folder in server.ClientSettings?.WorkspaceFolders ?? Enumerable.Empty<WorkspaceFolder>())
{
_workspaceFolders.AddOrUpdate(folder.Uri, folder, (a, b) => folder);
_workspaceFoldersChangedSubject.OnNext(new WorkspaceFolderChange(WorkspaceFolderEvent.Add, folder));
}
}
}

Expand All @@ -65,6 +69,7 @@ public IObservable<WorkspaceFolder> Refresh() => Observable.Create<WorkspaceFold
return Observable.FromAsync(ct => _server.RequestWorkspaceFolders(new WorkspaceFolderParams(), ct))
.Do(
workspaceFolders => {
workspaceFolders ??= new Container<WorkspaceFolder>();
var existingFolders = new HashSet<WorkspaceFolder>(_workspaceFolders.Values.Join(workspaceFolders, z => z.Uri, z => z.Uri, (a, b) => b));
var additions = new HashSet<WorkspaceFolder>();
var removals = new HashSet<WorkspaceFolder>();
Expand Down
60 changes: 53 additions & 7 deletions test/Lsp.Tests/Integration/WorkspaceFolderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Linq;
using System.Reactive.Linq;
using System.Reactive.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;
using NSubstitute;
Expand All @@ -11,6 +12,9 @@
using OmniSharp.Extensions.LanguageServer.Client;
using OmniSharp.Extensions.LanguageServer.Protocol;
using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities;
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
using OmniSharp.Extensions.LanguageServer.Protocol.Server;
using OmniSharp.Extensions.LanguageServer.Protocol.Workspace;
using OmniSharp.Extensions.LanguageServer.Server;
using Serilog.Events;
using Xunit;
Expand All @@ -21,10 +25,7 @@ namespace Lsp.Tests.Integration
public class WorkspaceFolderTests : LanguageProtocolTestBase
{
public WorkspaceFolderTests(ITestOutputHelper outputHelper) : base(
new JsonRpcTestOptions()
.ConfigureForXUnit(outputHelper, LogEventLevel.Verbose)
.WithWaitTime(TimeSpan.FromSeconds(1))
.WithTimeout(TimeSpan.FromSeconds(2))
new JsonRpcTestOptions().ConfigureForXUnit(outputHelper, LogEventLevel.Verbose)
)
{
}
Expand Down Expand Up @@ -60,7 +61,7 @@ public async Task Should_Add_A_Workspace_Folder()

client.WorkspaceFoldersManager.Add("/abcd/", nameof(Should_Add_A_Workspace_Folder));

SettleNext();
await SettleNext();

folders.Should().HaveCount(1);
folders[0].Event.Should().Be(WorkspaceFolderEvent.Add);
Expand Down Expand Up @@ -89,7 +90,7 @@ public async Task Should_Remove_Workspace_Folder_by_name()

client.WorkspaceFoldersManager.Remove(nameof(Should_Remove_Workspace_Folder_by_name));

SettleNext();
await SettleNext();

folders.Should().HaveCount(1);
folders[0].Event.Should().Be(WorkspaceFolderEvent.Remove);
Expand All @@ -109,13 +110,58 @@ public async Task Should_Remove_Workspace_Folder_by_uri()

client.WorkspaceFoldersManager.Remove(DocumentUri.From("/abcd/"));

SettleNext();
await SettleNext();

folders.Should().HaveCount(1);
folders[0].Event.Should().Be(WorkspaceFolderEvent.Remove);
folders[0].Folder.Name.Should().Be(nameof(Should_Remove_Workspace_Folder_by_uri));
}

[Fact]
public async Task Should_Handle_Null_Workspace_Folders()
{
var workspaceLanguageServer = Substitute.For<IWorkspaceLanguageServer>();
var languageServer = Substitute.For<ILanguageServer>();
languageServer.ClientSettings.Returns(
new InitializeParams() {
Capabilities = new ClientCapabilities() {
Workspace = new WorkspaceClientCapabilities() {
WorkspaceFolders = true
}
},
WorkspaceFolders = null
}
);
var workspaceFolders = new LanguageServerWorkspaceFolderManager(workspaceLanguageServer);
var started = (IOnLanguageServerStarted) workspaceFolders;
await started.OnStarted(languageServer, CancellationToken);
}

[Fact]
public async Task Should_Handle_Null_Workspace_Folders_On_Refresh()
{
var workspaceLanguageServer = Substitute.For<IWorkspaceLanguageServer>();
var languageServer = Substitute.For<ILanguageServer>();
languageServer.ClientSettings.Returns(
new InitializeParams() {
Capabilities = new ClientCapabilities() {
Workspace = new WorkspaceClientCapabilities() {
WorkspaceFolders = true
}
},
WorkspaceFolders = null
}
);
languageServer.SendRequest(Arg.Any<WorkspaceFolderParams>(), Arg.Any<CancellationToken>()).Returns((Container<WorkspaceFolder> ) null);
var workspaceFolders = new LanguageServerWorkspaceFolderManager(workspaceLanguageServer);
var started = (IOnLanguageServerStarted) workspaceFolders;
await started.OnStarted(languageServer, CancellationToken);

var result = await workspaceFolders.Refresh().ToArray();

result.Should().BeEmpty();
}

private void ConfigureClient(LanguageClientOptions options) =>
options.WithClientCapabilities(
new ClientCapabilities {
Expand Down

0 comments on commit 09d9466

Please sign in to comment.