Skip to content

Added the latest changes from 1.16 spec. Moniker, CodeAction Resolve, DefaultBehavior and more #382

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

Merged
merged 1 commit into from
Oct 4, 2020
Merged
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
2 changes: 2 additions & 0 deletions LSP.sln.DotSettings
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RemoveRedundantBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnnecessaryWhitespace/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseNullPropagationWhenPossible/@EntryIndexedValue">SUGGESTION</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/SweaWarningsMode/@EntryValue">ShowAndRun</s:String>
<s:Boolean x:Key="/Default/CodeInspection/Roslyn/UseRoslynInSwea/@EntryValue">True</s:Boolean>
<s:String x:Key="/Default/CodeStyle/CodeCleanup/Profiles/=Full_0020Cleanup/@EntryIndexedValue">&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;Profile name="Full Cleanup"&gt;&lt;CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="False" ArrangeAttributes="True" ArrangeArgumentsStyle="True" ArrangeCodeBodyStyle="True" ArrangeVarStyle="True" ArrangeTrailingCommas="False" /&gt;&lt;RemoveCodeRedundancies&gt;True&lt;/RemoveCodeRedundancies&gt;&lt;CSUseAutoProperty&gt;True&lt;/CSUseAutoProperty&gt;&lt;CSMakeFieldReadonly&gt;True&lt;/CSMakeFieldReadonly&gt;&lt;CSMakeAutoPropertyGetOnly&gt;True&lt;/CSMakeAutoPropertyGetOnly&gt;&lt;CSArrangeQualifiers&gt;True&lt;/CSArrangeQualifiers&gt;&lt;CSFixBuiltinTypeReferences&gt;True&lt;/CSFixBuiltinTypeReferences&gt;&lt;CSOptimizeUsings&gt;&lt;OptimizeUsings&gt;True&lt;/OptimizeUsings&gt;&lt;EmbraceInRegion&gt;False&lt;/EmbraceInRegion&gt;&lt;RegionName&gt;&lt;/RegionName&gt;&lt;/CSOptimizeUsings&gt;&lt;CSShortenReferences&gt;True&lt;/CSShortenReferences&gt;&lt;CSReformatCode&gt;True&lt;/CSReformatCode&gt;&lt;CSharpFormatDocComments&gt;True&lt;/CSharpFormatDocComments&gt;&lt;XAMLCollapseEmptyTags&gt;False&lt;/XAMLCollapseEmptyTags&gt;&lt;IDEA_SETTINGS&gt;&amp;lt;profile version="1.0"&amp;gt;&#xD;
&amp;lt;option name="myName" value="Full Cleanup" /&amp;gt;&#xD;
Expand Down Expand Up @@ -238,6 +239,7 @@
&lt;/Entry&gt;&#xD;
&lt;/TypePattern&gt;&#xD;
&lt;/Patterns&gt;</s:String>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EFeature_002EServices_002EDaemon_002ESettings_002EMigration_002ESwaWarningsModeSettingsMigrate/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
Expand Down
2 changes: 1 addition & 1 deletion language-server-protocol.sha.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-- This is the last commit we caught up with https://github.com/Microsoft/language-server-protocol/commits/gh-pages
lastSha: 56cf06cf95a2eea4e528558fb228d1698d952571
lastSha: 1cf527d8410a493789de4992f78ee9874a4fd215

https://github.com/Microsoft/language-server-protocol/compare/<lastSha>..gh-pages
109 changes: 64 additions & 45 deletions src/Client/LanguageClientRegistrationManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,18 @@ internal class LanguageClientRegistrationManager : IRegisterCapabilityHandler, I
private readonly ILspHandlerTypeDescriptorProvider _handlerTypeDescriptorProvider;
private readonly ILogger<LanguageClientRegistrationManager> _logger;
private readonly ConcurrentDictionary<string, Registration> _registrations;
private readonly ReplaySubject<IEnumerable<Registration>> _registrationSubject;
private ReplaySubject<IEnumerable<Registration>> _registrationSubject = new ReplaySubject<IEnumerable<Registration>>(1);

public LanguageClientRegistrationManager(
ISerializer serializer,
ILspHandlerTypeDescriptorProvider handlerTypeDescriptorProvider,
ILogger<LanguageClientRegistrationManager> logger)
ILogger<LanguageClientRegistrationManager> logger
)
{
_serializer = serializer;
_handlerTypeDescriptorProvider = handlerTypeDescriptorProvider;
_logger = logger;
_registrations = new ConcurrentDictionary<string, Registration>(StringComparer.OrdinalIgnoreCase);
_registrationSubject = new ReplaySubject<IEnumerable<Registration>>(1);
}

Task<Unit> IRequestHandler<RegistrationParams, Unit>.Handle(RegistrationParams request, CancellationToken cancellationToken)
Expand All @@ -46,7 +46,11 @@ Task<Unit> IRequestHandler<RegistrationParams, Unit>.Handle(RegistrationParams r
Register(request.Registrations.ToArray());
}

_registrationSubject.OnNext(_registrations.Values);
if (!_registrationSubject.IsDisposed)
{
_registrationSubject.OnNext(_registrations.Values);
}

return Unit.Task;
}

Expand All @@ -60,15 +64,17 @@ Task<Unit> IRequestHandler<UnregistrationParams, Unit>.Handle(UnregistrationPara
}
}

_registrationSubject.OnNext(_registrations.Values);
if (!_registrationSubject.IsDisposed)
{
_registrationSubject.OnNext(_registrations.Values);
}

return Unit.Task;
}

public void RegisterCapabilities(ServerCapabilities serverCapabilities)
{
foreach (var registrationOptions in LspHandlerDescriptorHelpers.GetStaticRegistrationOptions(
serverCapabilities
))
foreach (var registrationOptions in LspHandlerDescriptorHelpers.GetStaticRegistrationOptions(serverCapabilities))
{
var method = _handlerTypeDescriptorProvider.GetMethodForRegistrationOptions(registrationOptions);
if (method == null)
Expand All @@ -88,34 +94,30 @@ public void RegisterCapabilities(ServerCapabilities serverCapabilities)
}
}

if (serverCapabilities.Workspace == null)
if (serverCapabilities.Workspace != null)
{
_registrationSubject.OnNext(_registrations.Values);
return;
}

foreach (var registrationOptions in LspHandlerDescriptorHelpers.GetStaticRegistrationOptions(
serverCapabilities
.Workspace
))
{
var method = _handlerTypeDescriptorProvider.GetMethodForRegistrationOptions(registrationOptions);
if (method == null)
foreach (var registrationOptions in LspHandlerDescriptorHelpers.GetStaticRegistrationOptions(serverCapabilities.Workspace))
{
// TODO: Log this
continue;
}

if (registrationOptions.Id != null)
{
var reg = new Registration {
Id = registrationOptions.Id,
Method = method,
RegisterOptions = registrationOptions
};
_registrations.AddOrUpdate(registrationOptions.Id, x => reg, (a, b) => reg);
var method = _handlerTypeDescriptorProvider.GetMethodForRegistrationOptions(registrationOptions);
if (method == null)
{
// TODO: Log this
continue;
}

if (registrationOptions.Id != null)
{
var reg = new Registration {
Id = registrationOptions.Id,
Method = method,
RegisterOptions = registrationOptions
};
_registrations.AddOrUpdate(registrationOptions.Id, x => reg, (a, b) => reg);
}
}
}

_registrationSubject.OnNext(_registrations.Values);
}

private void Register(params Registration[] registrations)
Expand Down Expand Up @@ -145,7 +147,18 @@ private void Register(Registration registration)
_registrations.AddOrUpdate(deserializedRegistration.Id, x => deserializedRegistration, (a, b) => deserializedRegistration);
}

public IObservable<IEnumerable<Registration>> Registrations => _registrationSubject.AsObservable();
public IObservable<IEnumerable<Registration>> Registrations
{
get {
if (_registrationSubject.IsDisposed)
{
return Observable.Empty<IEnumerable<Registration>>();
}

return _registrationSubject.AsObservable();
}
}

public IEnumerable<Registration> CurrentRegistrations => _registrations.Values;

public IEnumerable<Registration> GetRegistrationsForMethod(string method) => _registrations.Select(z => z.Value).Where(x => x.Method == method);
Expand All @@ -154,19 +167,25 @@ public IEnumerable<Registration> GetRegistrationsMatchingSelector(DocumentSelect
_registrations
.Select(z => z.Value)
.Where(
x => x.RegisterOptions is ITextDocumentRegistrationOptions ro && ro.DocumentSelector
.Join(
documentSelector,
z => z.HasLanguage ? z.Language :
z.HasScheme ? z.Scheme :
z.HasPattern ? z.Pattern : string.Empty,
z => z.HasLanguage ? z.Language :
z.HasScheme ? z.Scheme :
z.HasPattern ? z.Pattern : string.Empty, (a, b) => a
)
.Any(y => y.HasLanguage || y.HasPattern || y.HasScheme)
x => x.RegisterOptions is ITextDocumentRegistrationOptions ro &&
ro.DocumentSelector != null &&
ro.DocumentSelector
.Join(
documentSelector,
z => z.HasLanguage ? z.Language :
z.HasScheme ? z.Scheme :
z.HasPattern ? z.Pattern : string.Empty,
z => z.HasLanguage ? z.Language :
z.HasScheme ? z.Scheme :
z.HasPattern ? z.Pattern : string.Empty, (a, b) => a
)
.Any(y => y.HasLanguage || y.HasPattern || y.HasScheme)
);

public void Dispose() => _registrationSubject.Dispose();
public void Dispose()
{
if (_registrationSubject.IsDisposed) return;
_registrationSubject.Dispose();
}
}
}
20 changes: 15 additions & 5 deletions src/Client/LanguageClientWorkspaceFoldersManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public LanguageClientWorkspaceFoldersManager(IWorkspaceLanguageClient client, IE

Task<Container<WorkspaceFolder>?> IRequestHandler<WorkspaceFolderParams, Container<WorkspaceFolder>?>.
Handle(WorkspaceFolderParams request, CancellationToken cancellationToken) =>
Task.FromResult< Container<WorkspaceFolder>?>(new Container<WorkspaceFolder>(_workspaceFolders.Values));
Task.FromResult<Container<WorkspaceFolder>?>(new Container<WorkspaceFolder>(_workspaceFolders.Values));

public void Add(DocumentUri uri, string name) => Add(new WorkspaceFolder { Name = name, Uri = uri });

Expand All @@ -60,7 +60,10 @@ public void Add(IEnumerable<WorkspaceFolder> workspaceFolders)
}
}
);
_workspaceFoldersSubject.OnNext(_workspaceFolders.Values);
if (!_workspaceFoldersSubject.IsDisposed)
{
_workspaceFoldersSubject.OnNext(_workspaceFolders.Values);
}
}

public void Remove(DocumentUri name) => Remove(_workspaceFolders.Values.Where(z => z.Uri == name));
Expand Down Expand Up @@ -89,13 +92,20 @@ public void Remove(IEnumerable<WorkspaceFolder> items)
}
}
);
_workspaceFoldersSubject.OnNext(_workspaceFolders.Values);
if (!_workspaceFoldersSubject.IsDisposed)
{
_workspaceFoldersSubject.OnNext(_workspaceFolders.Values);
}
}

public IObservable<IEnumerable<WorkspaceFolder>> WorkspaceFolders => _workspaceFoldersSubject.AsObservable();
public IObservable<IEnumerable<WorkspaceFolder>> WorkspaceFolders => _workspaceFoldersSubject.IsDisposed ? Observable.Empty<IEnumerable<WorkspaceFolder>>() : _workspaceFoldersSubject.AsObservable();

public IEnumerable<WorkspaceFolder> CurrentWorkspaceFolders => _workspaceFolders.Values;

public void Dispose() => _workspaceFoldersSubject.Dispose();
public void Dispose()
{
if (_workspaceFoldersSubject.IsDisposed) return;
_workspaceFoldersSubject.Dispose();
}
}
}
24 changes: 20 additions & 4 deletions src/Dap.Client/ProgressObservable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,29 @@ public ProgressObservable(ProgressToken token)

public ProgressToken ProgressToken { get; }

void IObserver<ProgressEvent>.OnCompleted() => _dataSubject.OnCompleted();
void IObserver<ProgressEvent>.OnCompleted()
{
if (_dataSubject.IsDisposed) return;
_dataSubject.OnCompleted();
}

void IObserver<ProgressEvent>.OnError(Exception error) => _dataSubject.OnError(error);
void IObserver<ProgressEvent>.OnError(Exception error)
{
if (_dataSubject.IsDisposed) return;
_dataSubject.OnError(error);
}

public void OnNext(ProgressEvent value) => _dataSubject.OnNext(value);
public void OnNext(ProgressEvent value)
{
if (_dataSubject.IsDisposed) return;
_dataSubject.OnNext(value);
}

public void Dispose() => _disposable.Dispose();
public void Dispose()
{
if (_disposable.IsDisposed) return;
_disposable.Dispose();
}

public IDisposable Subscribe(IObserver<ProgressEvent> observer) => _disposable.IsDisposed ? Disposable.Empty : _dataSubject.Subscribe(observer);
}
Expand Down
13 changes: 12 additions & 1 deletion src/JsonRpc/AggregateResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,23 @@

namespace OmniSharp.Extensions.JsonRpc
{
public class AggregateResponse<T> where T : IEnumerable
public class AggregateResponse<T>: IEnumerable where T : IEnumerable
{
public IEnumerable<T> Items { get; }

public AggregateResponse(IEnumerable<T> items) => Items = items.ToArray();

public AggregateResponse(IEnumerable<object> items) => Items = items.OfType<T>().ToArray();

public IEnumerator GetEnumerator()
{
foreach (var item in Items)
{
foreach (var v in item)
{
yield return v;
}
}
}
}
}
2 changes: 1 addition & 1 deletion src/JsonRpc/OutputHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ ILogger<OutputHandler> logger

public void Send(object? value)
{
if (_queue.IsDisposed || value == null) return;
if (_queue.IsDisposed || _disposable.IsDisposed || value == null) return;
_queue.OnNext(value);
}

Expand Down
3 changes: 2 additions & 1 deletion src/JsonRpc/RequestRouterBase.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
Expand Down Expand Up @@ -109,7 +110,7 @@ public virtual async Task<ErrorResponse> RouteRequest(IRequestDescriptor<TDescri

using var scope = _serviceScopeFactory.CreateScope();
// TODO: Do we want to support more handlers as "aggregate"?
if (typeof(IEnumerable<object>).IsAssignableFrom(descriptors.Default!.Response) && !typeof(JToken).IsAssignableFrom(descriptors.Default!.Response))
if (typeof(IEnumerable).IsAssignableFrom(descriptors.Default!.Response) && typeof(string) != descriptors.Default!.Response && !typeof(JToken).IsAssignableFrom(descriptors.Default!.Response))
{
var responses = await Task.WhenAll(descriptors.Select(descriptor => InnerRoute(_serviceScopeFactory, request, descriptor, @params, token, _logger))).ConfigureAwait(false);
var errorResponse = responses.FirstOrDefault(x => x.IsError);
Expand Down
32 changes: 18 additions & 14 deletions src/JsonRpc/ResponseRouter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,22 +81,22 @@ public async Task<TResponse> Returning<TResponse>(CancellationToken cancellation

cancellationToken.ThrowIfCancellationRequested();

_router.OutputHandler.Value.Send(
new OutgoingRequest {
Method = _method,
Params = _params,
Id = nextId
}
);
cancellationToken.Register(
() => {
if (tcs.Task.IsCompleted) return;
_router.CancelRequest(new CancelParams { Id = nextId });
}
);

try
{
_router.OutputHandler.Value.Send(
new OutgoingRequest {
Method = _method,
Params = _params,
Id = nextId
}
);
cancellationToken.Register(
() => {
if (tcs.Task.IsCompleted) return;
_router.CancelRequest(new CancelParams { Id = nextId });
}
);

var result = await tcs.Task.ConfigureAwait(false);
if (typeof(TResponse) == typeof(Unit))
{
Expand All @@ -105,6 +105,10 @@ public async Task<TResponse> Returning<TResponse>(CancellationToken cancellation

return result.ToObject<TResponse>(_router.Serializer.JsonSerializer);
}
catch (ObjectDisposedException)
{
throw;
}
finally
{
_router.Requests.TryRemove(nextId, out _);
Expand Down
Loading