diff --git a/LSP.sln.DotSettings b/LSP.sln.DotSettings
index 5f6d29ea7..885217588 100644
--- a/LSP.sln.DotSettings
+++ b/LSP.sln.DotSettings
@@ -14,6 +14,7 @@
WARNING
WARNING
SUGGESTION
+ ShowAndRun
True
<?xml version="1.0" encoding="utf-16"?><Profile name="Full Cleanup"><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="False" ArrangeAttributes="True" ArrangeArgumentsStyle="True" ArrangeCodeBodyStyle="True" ArrangeVarStyle="True" ArrangeTrailingCommas="False" /><RemoveCodeRedundancies>True</RemoveCodeRedundancies><CSUseAutoProperty>True</CSUseAutoProperty><CSMakeFieldReadonly>True</CSMakeFieldReadonly><CSMakeAutoPropertyGetOnly>True</CSMakeAutoPropertyGetOnly><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings><EmbraceInRegion>False</EmbraceInRegion><RegionName></RegionName></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><CSReformatCode>True</CSReformatCode><CSharpFormatDocComments>True</CSharpFormatDocComments><XAMLCollapseEmptyTags>False</XAMLCollapseEmptyTags><IDEA_SETTINGS><profile version="1.0">
<option name="myName" value="Full Cleanup" />
@@ -238,6 +239,7 @@
</Entry>
</TypePattern>
</Patterns>
+ True
True
True
True
diff --git a/language-server-protocol.sha.txt b/language-server-protocol.sha.txt
index bb2a55802..c9be7de30 100644
--- a/language-server-protocol.sha.txt
+++ b/language-server-protocol.sha.txt
@@ -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/..gh-pages
diff --git a/src/Client/LanguageClientRegistrationManager.cs b/src/Client/LanguageClientRegistrationManager.cs
index f42eb9d60..1ef32e538 100644
--- a/src/Client/LanguageClientRegistrationManager.cs
+++ b/src/Client/LanguageClientRegistrationManager.cs
@@ -25,18 +25,18 @@ internal class LanguageClientRegistrationManager : IRegisterCapabilityHandler, I
private readonly ILspHandlerTypeDescriptorProvider _handlerTypeDescriptorProvider;
private readonly ILogger _logger;
private readonly ConcurrentDictionary _registrations;
- private readonly ReplaySubject> _registrationSubject;
+ private ReplaySubject> _registrationSubject = new ReplaySubject>(1);
public LanguageClientRegistrationManager(
ISerializer serializer,
ILspHandlerTypeDescriptorProvider handlerTypeDescriptorProvider,
- ILogger logger)
+ ILogger logger
+ )
{
_serializer = serializer;
_handlerTypeDescriptorProvider = handlerTypeDescriptorProvider;
_logger = logger;
_registrations = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase);
- _registrationSubject = new ReplaySubject>(1);
}
Task IRequestHandler.Handle(RegistrationParams request, CancellationToken cancellationToken)
@@ -46,7 +46,11 @@ Task IRequestHandler.Handle(RegistrationParams r
Register(request.Registrations.ToArray());
}
- _registrationSubject.OnNext(_registrations.Values);
+ if (!_registrationSubject.IsDisposed)
+ {
+ _registrationSubject.OnNext(_registrations.Values);
+ }
+
return Unit.Task;
}
@@ -60,15 +64,17 @@ Task IRequestHandler.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)
@@ -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)
@@ -145,7 +147,18 @@ private void Register(Registration registration)
_registrations.AddOrUpdate(deserializedRegistration.Id, x => deserializedRegistration, (a, b) => deserializedRegistration);
}
- public IObservable> Registrations => _registrationSubject.AsObservable();
+ public IObservable> Registrations
+ {
+ get {
+ if (_registrationSubject.IsDisposed)
+ {
+ return Observable.Empty>();
+ }
+
+ return _registrationSubject.AsObservable();
+ }
+ }
+
public IEnumerable CurrentRegistrations => _registrations.Values;
public IEnumerable GetRegistrationsForMethod(string method) => _registrations.Select(z => z.Value).Where(x => x.Method == method);
@@ -154,19 +167,25 @@ public IEnumerable 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();
+ }
}
}
diff --git a/src/Client/LanguageClientWorkspaceFoldersManager.cs b/src/Client/LanguageClientWorkspaceFoldersManager.cs
index 88730e8da..050d6514d 100644
--- a/src/Client/LanguageClientWorkspaceFoldersManager.cs
+++ b/src/Client/LanguageClientWorkspaceFoldersManager.cs
@@ -34,7 +34,7 @@ public LanguageClientWorkspaceFoldersManager(IWorkspaceLanguageClient client, IE
Task?> IRequestHandler?>.
Handle(WorkspaceFolderParams request, CancellationToken cancellationToken) =>
- Task.FromResult< Container?>(new Container(_workspaceFolders.Values));
+ Task.FromResult?>(new Container(_workspaceFolders.Values));
public void Add(DocumentUri uri, string name) => Add(new WorkspaceFolder { Name = name, Uri = uri });
@@ -60,7 +60,10 @@ public void Add(IEnumerable 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));
@@ -89,13 +92,20 @@ public void Remove(IEnumerable items)
}
}
);
- _workspaceFoldersSubject.OnNext(_workspaceFolders.Values);
+ if (!_workspaceFoldersSubject.IsDisposed)
+ {
+ _workspaceFoldersSubject.OnNext(_workspaceFolders.Values);
+ }
}
- public IObservable> WorkspaceFolders => _workspaceFoldersSubject.AsObservable();
+ public IObservable> WorkspaceFolders => _workspaceFoldersSubject.IsDisposed ? Observable.Empty>() : _workspaceFoldersSubject.AsObservable();
public IEnumerable CurrentWorkspaceFolders => _workspaceFolders.Values;
- public void Dispose() => _workspaceFoldersSubject.Dispose();
+ public void Dispose()
+ {
+ if (_workspaceFoldersSubject.IsDisposed) return;
+ _workspaceFoldersSubject.Dispose();
+ }
}
}
diff --git a/src/Dap.Client/ProgressObservable.cs b/src/Dap.Client/ProgressObservable.cs
index 46c59c3c3..c961689b3 100644
--- a/src/Dap.Client/ProgressObservable.cs
+++ b/src/Dap.Client/ProgressObservable.cs
@@ -26,13 +26,29 @@ public ProgressObservable(ProgressToken token)
public ProgressToken ProgressToken { get; }
- void IObserver.OnCompleted() => _dataSubject.OnCompleted();
+ void IObserver.OnCompleted()
+ {
+ if (_dataSubject.IsDisposed) return;
+ _dataSubject.OnCompleted();
+ }
- void IObserver.OnError(Exception error) => _dataSubject.OnError(error);
+ void IObserver.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 observer) => _disposable.IsDisposed ? Disposable.Empty : _dataSubject.Subscribe(observer);
}
diff --git a/src/JsonRpc/AggregateResponse.cs b/src/JsonRpc/AggregateResponse.cs
index e68f69abf..a96c5af74 100644
--- a/src/JsonRpc/AggregateResponse.cs
+++ b/src/JsonRpc/AggregateResponse.cs
@@ -4,12 +4,23 @@
namespace OmniSharp.Extensions.JsonRpc
{
- public class AggregateResponse where T : IEnumerable
+ public class AggregateResponse: IEnumerable where T : IEnumerable
{
public IEnumerable Items { get; }
public AggregateResponse(IEnumerable items) => Items = items.ToArray();
public AggregateResponse(IEnumerable