From 7b0d48389f102f2ba642816cd74eb65817552dc0 Mon Sep 17 00:00:00 2001 From: David Driscoll Date: Thu, 18 Jul 2019 20:46:42 -0400 Subject: [PATCH 01/10] Upgraded to latest lsp-0.13 alpha for testing --- build/Packages.props | 2 +- .../Handlers/CodeLensHandler.cs | 6 +++--- .../Handlers/CompletionHandler.cs | 6 +++--- .../Handlers/DefinitionHandler.cs | 6 +++--- .../Handlers/DocumentSymbolHandler.cs | 6 +++--- .../Handlers/HoverHandler.cs | 6 +++--- .../Handlers/ReferencesHandler.cs | 6 +++--- .../Handlers/RenameHandler.cs | 8 ++++---- .../Handlers/SignatureHelpHandler.cs | 6 +++--- .../Handlers/TextDocumentSyncHandler.cs | 6 +++--- .../LanguageServerHost.cs | 18 +++++++++--------- 11 files changed, 38 insertions(+), 38 deletions(-) diff --git a/build/Packages.props b/build/Packages.props index 029f591b78..9954b71588 100644 --- a/build/Packages.props +++ b/build/Packages.props @@ -63,7 +63,7 @@ - + diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/CodeLensHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/CodeLensHandler.cs index a1f58e1c74..997b91c069 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/CodeLensHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/CodeLensHandler.cs @@ -15,7 +15,7 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - internal sealed class CodeLensHandler : ICodeLensHandler, ICodeLensResolveHandler + internal sealed class OmniSharpCodeLensHandler : ICodeLensHandler, ICodeLensResolveHandler { public static IEnumerable Enumerate(RequestHandlers handlers) { @@ -24,7 +24,7 @@ public static IEnumerable Enumerate(RequestHandlers handlers) Mef.IRequestHandler, Mef.IRequestHandler>()) { - yield return new CodeLensHandler(membersAsTreeHandler, findUsagesHandler, selector); + yield return new OmniSharpCodeLensHandler(membersAsTreeHandler, findUsagesHandler, selector); } } @@ -33,7 +33,7 @@ public static IEnumerable Enumerate(RequestHandlers handlers) private readonly Mef.IRequestHandler _findUsagesHandler; private readonly DocumentSelector _documentSelector; - public CodeLensHandler( + public OmniSharpCodeLensHandler( Mef.IRequestHandler membersAsTreeHandler, Mef.IRequestHandler findUsagesHandler, DocumentSelector documentSelector) diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/CompletionHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/CompletionHandler.cs index a16b34250f..f61bc26de2 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/CompletionHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/CompletionHandler.cs @@ -10,7 +10,7 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - class CompletionHandler : ICompletionHandler + class OmniSharpCompletionHandler : ICompletionHandler { public static IEnumerable Enumerate(RequestHandlers handlers) { @@ -18,7 +18,7 @@ public static IEnumerable Enumerate(RequestHandlers handlers) foreach (var (selector, handler) in handlers .OfType>>()) if (handler != null) - yield return new CompletionHandler(handler, selector); + yield return new OmniSharpCompletionHandler(handler, selector); } private CompletionCapability _capability; @@ -65,7 +65,7 @@ private static CompletionItemKind GetCompletionItemKind(string key) return CompletionItemKind.Property; } - public CompletionHandler(Mef.IRequestHandler> autoCompleteHandler, DocumentSelector documentSelector) + public OmniSharpCompletionHandler(Mef.IRequestHandler> autoCompleteHandler, DocumentSelector documentSelector) { _autoCompleteHandler = autoCompleteHandler; _documentSelector = documentSelector; diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/DefinitionHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/DefinitionHandler.cs index bcbd817109..94672ad41d 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/DefinitionHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/DefinitionHandler.cs @@ -11,20 +11,20 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - class DefinitionHandler : IDefinitionHandler + class OmniSharpDefinitionHandler : IDefinitionHandler { public static IEnumerable Enumerate(RequestHandlers handlers) { foreach (var (selector, handler) in handlers.OfType>()) if (handler != null) - yield return new DefinitionHandler(handler, selector); + yield return new OmniSharpDefinitionHandler(handler, selector); } private DefinitionCapability _capability; private readonly Mef.IRequestHandler _definitionHandler; private readonly DocumentSelector _documentSelector; - public DefinitionHandler(Mef.IRequestHandler definitionHandler, DocumentSelector documentSelector) + public OmniSharpDefinitionHandler(Mef.IRequestHandler definitionHandler, DocumentSelector documentSelector) { _definitionHandler = definitionHandler; _documentSelector = documentSelector; diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/DocumentSymbolHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/DocumentSymbolHandler.cs index a6ac4c6a08..7e5d92f381 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/DocumentSymbolHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/DocumentSymbolHandler.cs @@ -12,14 +12,14 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - internal sealed class DocumentSymbolHandler : IDocumentSymbolHandler + internal sealed class OmniSharpDocumentSymbolHandler : IDocumentSymbolHandler { public static IEnumerable Enumerate(RequestHandlers handlers) { foreach (var (selector, handler) in handlers .OfType>()) if (handler != null) - yield return new DocumentSymbolHandler(handler, selector); + yield return new OmniSharpDocumentSymbolHandler(handler, selector); } private DocumentSymbolCapability _capability; @@ -46,7 +46,7 @@ public static IEnumerable Enumerate(RequestHandlers handlers) { OmniSharp.Models.V2.SymbolKinds.Unknown, SymbolKind.Class }, }; - public DocumentSymbolHandler(Mef.IRequestHandler codeStructureHandler, DocumentSelector documentSelector) + public OmniSharpDocumentSymbolHandler(Mef.IRequestHandler codeStructureHandler, DocumentSelector documentSelector) { _codeStructureHandler = codeStructureHandler; _documentSelector = documentSelector; diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/HoverHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/HoverHandler.cs index 77abb4f168..4708c90d2e 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/HoverHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/HoverHandler.cs @@ -10,21 +10,21 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - class HoverHandler : IHoverHandler + class OmniSharpHoverHandler : IHoverHandler { public static IEnumerable Enumerate(RequestHandlers handlers) { foreach (var (selector, handler) in handlers .OfType>()) if (handler != null) - yield return new HoverHandler(handler, selector); + yield return new OmniSharpHoverHandler(handler, selector); } private HoverCapability _capability; private readonly Mef.IRequestHandler _definitionHandler; private readonly DocumentSelector _documentSelector; - public HoverHandler(Mef.IRequestHandler definitionHandler, DocumentSelector documentSelector) + public OmniSharpHoverHandler(Mef.IRequestHandler definitionHandler, DocumentSelector documentSelector) { _definitionHandler = definitionHandler; _documentSelector = documentSelector; diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/ReferencesHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/ReferencesHandler.cs index 310fb7df1e..5ec630ffe0 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/ReferencesHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/ReferencesHandler.cs @@ -12,21 +12,21 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - internal sealed class ReferencesHandler : IReferencesHandler + internal sealed class OmniSharpReferencesHandler : IReferencesHandler { public static IEnumerable Enumerate(RequestHandlers handlers) { foreach (var (selector, handler) in handlers .OfType>()) if (handler != null) - yield return new ReferencesHandler(handler, selector); + yield return new OmniSharpReferencesHandler(handler, selector); } private ReferencesCapability _capability; private readonly Mef.IRequestHandler _findUsagesHandler; private readonly DocumentSelector _documentSelector; - public ReferencesHandler(Mef.IRequestHandler findUsagesHandler, DocumentSelector documentSelector) + public OmniSharpReferencesHandler(Mef.IRequestHandler findUsagesHandler, DocumentSelector documentSelector) { _findUsagesHandler = findUsagesHandler; _documentSelector = documentSelector; diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/RenameHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/RenameHandler.cs index 647b599717..7211bc19c3 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/RenameHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/RenameHandler.cs @@ -11,13 +11,13 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - internal class RenameHandler : IRenameHandler + internal class OmniSharpRenameHandler : IRenameHandler { private readonly Mef.IRequestHandler _renameHandler; private readonly DocumentSelector _documentSelector; private RenameCapability _capability; - public RenameHandler(Mef.IRequestHandler renameHandler, DocumentSelector documentSelector) + public OmniSharpRenameHandler(Mef.IRequestHandler renameHandler, DocumentSelector documentSelector) { _renameHandler = renameHandler; _documentSelector = documentSelector; @@ -28,7 +28,7 @@ public static IEnumerable Enumerate(RequestHandlers handlers) foreach (var (selector, handler) in handlers .OfType>()) if (handler != null) - yield return new RenameHandler(handler, selector); + yield return new OmniSharpRenameHandler(handler, selector); } public async Task Handle(RenameParams request, CancellationToken token) @@ -51,7 +51,7 @@ public async Task Handle(RenameParams request, CancellationToken return new WorkspaceEdit(); } - var changes = omnisharpResponse.Changes.ToDictionary(change => + var changes = omnisharpResponse.Changes.ToDictionary(change => Helpers.ToUri(change.FileName), x => x.Changes.Select(edit => new TextEdit { diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/SignatureHelpHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/SignatureHelpHandler.cs index 0382118165..6a3ff2cdae 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/SignatureHelpHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/SignatureHelpHandler.cs @@ -11,13 +11,13 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - internal class SignatureHelpHandler : ISignatureHelpHandler + internal class OmniSharpSignatureHelpHandler : ISignatureHelpHandler { private readonly Mef.IRequestHandler _signatureHandler; private readonly DocumentSelector _documentSelector; private SignatureHelpCapability _capability; - public SignatureHelpHandler(Mef.IRequestHandler signatureHandler, DocumentSelector documentSelector) + public OmniSharpSignatureHelpHandler(Mef.IRequestHandler signatureHandler, DocumentSelector documentSelector) { _signatureHandler = signatureHandler; _documentSelector = documentSelector; @@ -28,7 +28,7 @@ public static IEnumerable Enumerate(RequestHandlers handlers) foreach (var (selector, handler) in handlers .OfType>()) if (handler != null) - yield return new SignatureHelpHandler(handler, selector); + yield return new OmniSharpSignatureHelpHandler(handler, selector); } public async Task Handle(SignatureHelpParams request, CancellationToken token) diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/TextDocumentSyncHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/TextDocumentSyncHandler.cs index 5669e3082c..6ef8e951c7 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/TextDocumentSyncHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/TextDocumentSyncHandler.cs @@ -18,7 +18,7 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - class TextDocumentSyncHandler : ITextDocumentSyncHandler + class OmniSharpTextDocumentSyncHandler : ITextDocumentSyncHandler { public static IEnumerable Enumerate( RequestHandlers handlers, @@ -33,7 +33,7 @@ class TextDocumentSyncHandler : ITextDocumentSyncHandler // TODO: Fix once cake has working support for incremental var documentSyncKind = TextDocumentSyncKind.Incremental; if (selector.ToString().IndexOf(".cake") > -1) documentSyncKind = TextDocumentSyncKind.Full; - yield return new TextDocumentSyncHandler(openHandler, closeHandler, bufferHandler, selector, documentSyncKind, workspace); + yield return new OmniSharpTextDocumentSyncHandler(openHandler, closeHandler, bufferHandler, selector, documentSyncKind, workspace); } } @@ -45,7 +45,7 @@ class TextDocumentSyncHandler : ITextDocumentSyncHandler private readonly Mef.IRequestHandler _bufferHandler; private readonly OmniSharpWorkspace _workspace; - public TextDocumentSyncHandler( + public OmniSharpTextDocumentSyncHandler( Mef.IRequestHandler openHandler, Mef.IRequestHandler closeHandler, Mef.IRequestHandler bufferHandler, diff --git a/src/OmniSharp.LanguageServerProtocol/LanguageServerHost.cs b/src/OmniSharp.LanguageServerProtocol/LanguageServerHost.cs index 9402f16120..e62fd48493 100644 --- a/src/OmniSharp.LanguageServerProtocol/LanguageServerHost.cs +++ b/src/OmniSharp.LanguageServerProtocol/LanguageServerHost.cs @@ -153,15 +153,15 @@ private Task Initialize(Extensions.LanguageServer.Server.ILanguageServer server, var workspace = _compositionHost.GetExport(); _compositionHost.GetExport().IsEnabled = true; - foreach (var handler in TextDocumentSyncHandler.Enumerate(_handlers, workspace) - .Concat(DefinitionHandler.Enumerate(_handlers)) - .Concat(HoverHandler.Enumerate(_handlers)) - .Concat(CompletionHandler.Enumerate(_handlers)) - .Concat(SignatureHelpHandler.Enumerate(_handlers)) - .Concat(RenameHandler.Enumerate(_handlers)) - .Concat(DocumentSymbolHandler.Enumerate(_handlers)) - .Concat(ReferencesHandler.Enumerate(_handlers)) - .Concat(CodeLensHandler.Enumerate(_handlers))) + foreach (var handler in OmniSharpTextDocumentSyncHandler.Enumerate(_handlers, workspace) + .Concat(OmniSharpDefinitionHandler.Enumerate(_handlers)) + .Concat(OmniSharpHoverHandler.Enumerate(_handlers)) + .Concat(OmniSharpCompletionHandler.Enumerate(_handlers)) + .Concat(OmniSharpSignatureHelpHandler.Enumerate(_handlers)) + .Concat(OmniSharpRenameHandler.Enumerate(_handlers)) + .Concat(OmniSharpDocumentSymbolHandler.Enumerate(_handlers)) + .Concat(OmniSharpReferencesHandler.Enumerate(_handlers)) + .Concat(OmniSharpCodeLensHandler.Enumerate(_handlers))) { server.AddHandlers(handler); } From 78e0a231d44edf7e50288cb63a223b397a9b99f7 Mon Sep 17 00:00:00 2001 From: David Driscoll Date: Thu, 18 Jul 2019 21:58:44 -0400 Subject: [PATCH 02/10] Added document, range, and on type formatters --- ...Handler.cs => OmniSharpCodeLensHandler.cs} | 0 ...ndler.cs => OmniSharpCompletionHandler.cs} | 0 ...ndler.cs => OmniSharpDefinitionHandler.cs} | 0 .../OmniSharpDocumentFormatRangeHandler.cs | 52 ++++++++++++++++++ .../OmniSharpDocumentFormattingHandler.cs | 51 +++++++++++++++++ .../OmniSharpDocumentOnTypeFormatHandler.cs | 55 +++++++++++++++++++ ...r.cs => OmniSharpDocumentSymbolHandler.cs} | 0 ...verHandler.cs => OmniSharpHoverHandler.cs} | 0 ...ndler.cs => OmniSharpReferencesHandler.cs} | 0 ...meHandler.cs => OmniSharpRenameHandler.cs} | 0 ...er.cs => OmniSharpSignatureHelpHandler.cs} | 0 ...cs => OmniSharpTextDocumentSyncHandler.cs} | 0 .../LanguageServerHost.cs | 5 +- 13 files changed, 162 insertions(+), 1 deletion(-) rename src/OmniSharp.LanguageServerProtocol/Handlers/{CodeLensHandler.cs => OmniSharpCodeLensHandler.cs} (100%) rename src/OmniSharp.LanguageServerProtocol/Handlers/{CompletionHandler.cs => OmniSharpCompletionHandler.cs} (100%) rename src/OmniSharp.LanguageServerProtocol/Handlers/{DefinitionHandler.cs => OmniSharpDefinitionHandler.cs} (100%) create mode 100644 src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentFormatRangeHandler.cs create mode 100644 src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentFormattingHandler.cs create mode 100644 src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentOnTypeFormatHandler.cs rename src/OmniSharp.LanguageServerProtocol/Handlers/{DocumentSymbolHandler.cs => OmniSharpDocumentSymbolHandler.cs} (100%) rename src/OmniSharp.LanguageServerProtocol/Handlers/{HoverHandler.cs => OmniSharpHoverHandler.cs} (100%) rename src/OmniSharp.LanguageServerProtocol/Handlers/{ReferencesHandler.cs => OmniSharpReferencesHandler.cs} (100%) rename src/OmniSharp.LanguageServerProtocol/Handlers/{RenameHandler.cs => OmniSharpRenameHandler.cs} (100%) rename src/OmniSharp.LanguageServerProtocol/Handlers/{SignatureHelpHandler.cs => OmniSharpSignatureHelpHandler.cs} (100%) rename src/OmniSharp.LanguageServerProtocol/Handlers/{TextDocumentSyncHandler.cs => OmniSharpTextDocumentSyncHandler.cs} (100%) diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/CodeLensHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpCodeLensHandler.cs similarity index 100% rename from src/OmniSharp.LanguageServerProtocol/Handlers/CodeLensHandler.cs rename to src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpCodeLensHandler.cs diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/CompletionHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpCompletionHandler.cs similarity index 100% rename from src/OmniSharp.LanguageServerProtocol/Handlers/CompletionHandler.cs rename to src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpCompletionHandler.cs diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/DefinitionHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDefinitionHandler.cs similarity index 100% rename from src/OmniSharp.LanguageServerProtocol/Handlers/DefinitionHandler.cs rename to src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDefinitionHandler.cs diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentFormatRangeHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentFormatRangeHandler.cs new file mode 100644 index 0000000000..28c7ef90bd --- /dev/null +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentFormatRangeHandler.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using OmniSharp.Extensions.JsonRpc; +using OmniSharp.Extensions.LanguageServer.Protocol.Models; +using OmniSharp.Extensions.LanguageServer.Protocol.Server; +using OmniSharp.Models.Format; + +namespace OmniSharp.LanguageServerProtocol.Handlers +{ + internal sealed class OmniSharpDocumentFormatRangeHandler : DocumentRangeFormattingHandler + { + public static IEnumerable Enumerate(RequestHandlers handlers) + { + foreach (var (selector, handler) in handlers + .OfType>()) + if (handler != null) + yield return new OmniSharpDocumentFormatRangeHandler(handler, selector); + } + + private readonly Mef.IRequestHandler _formatRangeHandler; + + public OmniSharpDocumentFormatRangeHandler(Mef.IRequestHandler formatRangeHandler, DocumentSelector documentSelector) : base(new TextDocumentRegistrationOptions() + { + DocumentSelector = documentSelector, + }) + { + _formatRangeHandler = formatRangeHandler; + } + + public async override Task Handle(DocumentRangeFormattingParams request, CancellationToken cancellationToken) + { + var omnisharpRequest = new FormatRangeRequest() + { + FileName = Helpers.FromUri(request.TextDocument.Uri), + Line = Convert.ToInt32(request.Range.Start.Line), + Column = Convert.ToInt32(request.Range.Start.Character), + EndLine = Convert.ToInt32(request.Range.End.Line), + EndColumn = Convert.ToInt32(request.Range.End.Character), + }; + + var omnisharpResponse = await _formatRangeHandler.Handle(omnisharpRequest); + return omnisharpResponse.Changes.Select(change => new TextEdit() + { + NewText = change.NewText, + Range = new Range(new Position(change.StartLine, change.StartColumn), new Position(change.EndLine, change.EndColumn)) + }).ToArray(); + } + } +} diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentFormattingHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentFormattingHandler.cs new file mode 100644 index 0000000000..eee8d46c7e --- /dev/null +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentFormattingHandler.cs @@ -0,0 +1,51 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using OmniSharp.Extensions.JsonRpc; +using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities; +using OmniSharp.Extensions.LanguageServer.Protocol.Models; +using OmniSharp.Extensions.LanguageServer.Protocol.Server; +using OmniSharp.Models.CodeFormat; +using OmniSharp.Models.MembersTree; +using OmniSharp.Models.V2.CodeStructure; + +namespace OmniSharp.LanguageServerProtocol.Handlers +{ + internal sealed class OmniSharpDocumentFormattingHandler : DocumentFormattingHandler + { + public static IEnumerable Enumerate(RequestHandlers handlers) + { + foreach (var (selector, handler) in handlers + .OfType>()) + if (handler != null) + yield return new OmniSharpDocumentFormattingHandler(handler, selector); + } + + private readonly Mef.IRequestHandler _codeFormatHandler; + + public OmniSharpDocumentFormattingHandler(Mef.IRequestHandler codeFormatHandler, DocumentSelector documentSelector) : base(new TextDocumentRegistrationOptions() + { + DocumentSelector = documentSelector, + }) + { + _codeFormatHandler = codeFormatHandler; + } + + public async override Task Handle(DocumentFormattingParams request, CancellationToken cancellationToken) + { + var omnisharpRequest = new CodeFormatRequest() + { + FileName = Helpers.FromUri(request.TextDocument.Uri), + WantsTextChanges = true + }; + + var omnisharpResponse = await _codeFormatHandler.Handle(omnisharpRequest); + return omnisharpResponse.Changes.Select(change => new TextEdit() + { + NewText = change.NewText, + Range = new Range(new Position(change.StartLine, change.StartColumn), new Position(change.EndLine, change.EndColumn)) + }).ToArray(); + } + } +} diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentOnTypeFormatHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentOnTypeFormatHandler.cs new file mode 100644 index 0000000000..8869f592d8 --- /dev/null +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentOnTypeFormatHandler.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using OmniSharp.Extensions.JsonRpc; +using OmniSharp.Extensions.LanguageServer.Protocol.Models; +using OmniSharp.Extensions.LanguageServer.Protocol.Server; +using OmniSharp.Models.Format; + +namespace OmniSharp.LanguageServerProtocol.Handlers +{ + internal sealed class OmniSharpDocumentOnTypeFormatHandler : DocumentOnTypeFormatHandler + { + public static IEnumerable Enumerate(RequestHandlers handlers) + { + foreach (var (selector, handler) in handlers + .OfType>()) + if (handler != null) + yield return new OmniSharpDocumentOnTypeFormatHandler(handler, selector); + } + + private readonly Mef.IRequestHandler _formatAfterKeystrokeHandler; + + public OmniSharpDocumentOnTypeFormatHandler(Mef.IRequestHandler formatAfterKeystrokeHandler, DocumentSelector documentSelector) : base(new DocumentOnTypeFormattingRegistrationOptions() + { + DocumentSelector = documentSelector, + FirstTriggerCharacter = ";", + // TODO: What should these be? + MoreTriggerCharacter = new[] { "}", ")" } + }) + { + _formatAfterKeystrokeHandler = formatAfterKeystrokeHandler; + } + + public async override Task Handle(DocumentOnTypeFormattingParams request, CancellationToken cancellationToken) + { + // TODO: request.options + var omnisharpRequest = new FormatAfterKeystrokeRequest() + { + Character = request.Character, + Line = Convert.ToInt32(request.Position.Line), + Column = Convert.ToInt32(request.Position.Character), + FileName = Helpers.FromUri(request.TextDocument.Uri), + }; + + var omnisharpResponse = await _formatAfterKeystrokeHandler.Handle(omnisharpRequest); + return omnisharpResponse.Changes.Select(change => new TextEdit() + { + NewText = change.NewText, + Range = new Range(new Position(change.StartLine, change.StartColumn), new Position(change.EndLine, change.EndColumn)) + }).ToArray(); + } + } +} diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/DocumentSymbolHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentSymbolHandler.cs similarity index 100% rename from src/OmniSharp.LanguageServerProtocol/Handlers/DocumentSymbolHandler.cs rename to src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentSymbolHandler.cs diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/HoverHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpHoverHandler.cs similarity index 100% rename from src/OmniSharp.LanguageServerProtocol/Handlers/HoverHandler.cs rename to src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpHoverHandler.cs diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/ReferencesHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpReferencesHandler.cs similarity index 100% rename from src/OmniSharp.LanguageServerProtocol/Handlers/ReferencesHandler.cs rename to src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpReferencesHandler.cs diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/RenameHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpRenameHandler.cs similarity index 100% rename from src/OmniSharp.LanguageServerProtocol/Handlers/RenameHandler.cs rename to src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpRenameHandler.cs diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/SignatureHelpHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpSignatureHelpHandler.cs similarity index 100% rename from src/OmniSharp.LanguageServerProtocol/Handlers/SignatureHelpHandler.cs rename to src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpSignatureHelpHandler.cs diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/TextDocumentSyncHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpTextDocumentSyncHandler.cs similarity index 100% rename from src/OmniSharp.LanguageServerProtocol/Handlers/TextDocumentSyncHandler.cs rename to src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpTextDocumentSyncHandler.cs diff --git a/src/OmniSharp.LanguageServerProtocol/LanguageServerHost.cs b/src/OmniSharp.LanguageServerProtocol/LanguageServerHost.cs index e62fd48493..e5a6662283 100644 --- a/src/OmniSharp.LanguageServerProtocol/LanguageServerHost.cs +++ b/src/OmniSharp.LanguageServerProtocol/LanguageServerHost.cs @@ -161,7 +161,10 @@ private Task Initialize(Extensions.LanguageServer.Server.ILanguageServer server, .Concat(OmniSharpRenameHandler.Enumerate(_handlers)) .Concat(OmniSharpDocumentSymbolHandler.Enumerate(_handlers)) .Concat(OmniSharpReferencesHandler.Enumerate(_handlers)) - .Concat(OmniSharpCodeLensHandler.Enumerate(_handlers))) + .Concat(OmniSharpCodeLensHandler.Enumerate(_handlers)) + .Concat(OmniSharpDocumentFormattingHandler.Enumerate(_handlers)) + .Concat(OmniSharpDocumentFormatRangeHandler.Enumerate(_handlers)) + .Concat(OmniSharpDocumentOnTypeFormatHandler.Enumerate(_handlers))) { server.AddHandlers(handler); } From 9539e299d6665b4cd0eb3c8ee1d0df1691df1bf4 Mon Sep 17 00:00:00 2001 From: David Driscoll Date: Thu, 18 Jul 2019 22:30:02 -0400 Subject: [PATCH 03/10] Converted to use the new abstract base class to simplify some of the plumbing code --- .../Handlers/OmniSharpCodeLensHandler.cs | 37 ++++-------- .../Handlers/OmniSharpCompletionHandler.cs | 39 ++++++------- .../Handlers/OmniSharpDefinitionHandler.cs | 24 ++------ .../OmniSharpDocumentSymbolHandler.cs | 24 ++------ .../Handlers/OmniSharpHoverHandler.cs | 24 ++------ .../Handlers/OmniSharpReferencesHandler.cs | 24 ++------ .../Handlers/OmniSharpRenameHandler.cs | 25 +++------ .../Handlers/OmniSharpSignatureHelpHandler.cs | 25 +++------ .../OmniSharpTextDocumentSyncHandler.cs | 56 ++++--------------- 9 files changed, 82 insertions(+), 196 deletions(-) diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpCodeLensHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpCodeLensHandler.cs index 997b91c069..9b79e8da0b 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpCodeLensHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpCodeLensHandler.cs @@ -15,7 +15,7 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - internal sealed class OmniSharpCodeLensHandler : ICodeLensHandler, ICodeLensResolveHandler + internal sealed class OmniSharpCodeLensHandler : CodeLensHandler { public static IEnumerable Enumerate(RequestHandlers handlers) { @@ -28,22 +28,24 @@ public static IEnumerable Enumerate(RequestHandlers handlers) } } - private CodeLensCapability _capability; private readonly Mef.IRequestHandler _membersAsTreeHandler; private readonly Mef.IRequestHandler _findUsagesHandler; - private readonly DocumentSelector _documentSelector; public OmniSharpCodeLensHandler( Mef.IRequestHandler membersAsTreeHandler, Mef.IRequestHandler findUsagesHandler, DocumentSelector documentSelector) + : base(new CodeLensRegistrationOptions() + { + DocumentSelector = documentSelector, + ResolveProvider = true + }) { _membersAsTreeHandler = membersAsTreeHandler; _findUsagesHandler = findUsagesHandler; - _documentSelector = documentSelector; } - public async Task Handle(CodeLensParams request, CancellationToken token) + public async override Task Handle(CodeLensParams request, CancellationToken token) { var omnisharpRequest = new MembersTreeRequest() { @@ -61,13 +63,13 @@ public async Task Handle(CodeLensParams request, Cancellation return codeLenseContainer; } - public async Task Handle(CodeLens request, CancellationToken token) + public async override Task Handle(CodeLens request, CancellationToken token) { var omnisharpRequest = new FindUsagesRequest { FileName = Helpers.FromUri(request.Data.ToObject()), - Column = (int) request.Range.Start.Character, - Line = (int) request.Range.Start.Line, + Column = (int)request.Range.Start.Character, + Line = (int)request.Range.Start.Line, OnlyThisFile = false, ExcludeDefinition = true }; @@ -85,21 +87,6 @@ public async Task Handle(CodeLens request, CancellationToken token) return request; } - - public CodeLensRegistrationOptions GetRegistrationOptions() - { - return new CodeLensRegistrationOptions() - { - DocumentSelector = _documentSelector, - ResolveProvider = true - }; - } - - public void SetCapability(CodeLensCapability capability) - { - _capability = capability; - } - private static void ToCodeLens(TextDocumentIdentifier textDocument, FileMemberElement node, List codeLensContainer) { var codeLens = new CodeLens @@ -121,12 +108,12 @@ private static void ToCodeLens(TextDocumentIdentifier textDocument, FileMemberEl } } - public bool CanResolve(CodeLens value) + public override bool CanResolve(CodeLens value) { var textDocumentUri = value.Data.ToObject(); return textDocumentUri != null && - _documentSelector.IsMatch(new TextDocumentAttributes(textDocumentUri, string.Empty)); + GetRegistrationOptions().DocumentSelector.IsMatch(new TextDocumentAttributes(textDocumentUri, string.Empty)); } } } diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpCompletionHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpCompletionHandler.cs index f61bc26de2..620093cf37 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpCompletionHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpCompletionHandler.cs @@ -10,7 +10,7 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - class OmniSharpCompletionHandler : ICompletionHandler + class OmniSharpCompletionHandler : CompletionHandler { public static IEnumerable Enumerate(RequestHandlers handlers) { @@ -21,9 +21,7 @@ public static IEnumerable Enumerate(RequestHandlers handlers) yield return new OmniSharpCompletionHandler(handler, selector); } - private CompletionCapability _capability; private readonly Mef.IRequestHandler> _autoCompleteHandler; - private readonly DocumentSelector _documentSelector; private static readonly IDictionary _kind = new Dictionary{ // types @@ -58,7 +56,7 @@ private static CompletionItemKind GetCompletionItemKind(string key) { return CompletionItemKind.Property; } - if(_kind.TryGetValue(key, out var completionItemKind)) + if (_kind.TryGetValue(key, out var completionItemKind)) { return completionItemKind; } @@ -66,12 +64,18 @@ private static CompletionItemKind GetCompletionItemKind(string key) } public OmniSharpCompletionHandler(Mef.IRequestHandler> autoCompleteHandler, DocumentSelector documentSelector) + : base(new CompletionRegistrationOptions() + { + DocumentSelector = documentSelector, + // TODO: Come along and add a service for getting autocompletion details after the fact. + ResolveProvider = false, + TriggerCharacters = new[] { ".", }, + }) { _autoCompleteHandler = autoCompleteHandler; - _documentSelector = documentSelector; } - public async Task Handle(CompletionParams request, CancellationToken token) + public async override Task Handle(CompletionParams request, CancellationToken token) { var omnisharpRequest = new AutoCompleteRequest() { @@ -81,7 +85,7 @@ public async Task Handle(CompletionParams request, CancellationT WantKind = true, WantDocumentationForEveryCompletionResult = true, WantReturnType = true, - WantSnippet =_capability.CompletionItem?.SnippetSupport ?? false + WantSnippet = Capability.CompletionItem?.SnippetSupport ?? false }; var omnisharpResponse = await _autoCompleteHandler.Handle(omnisharpRequest); @@ -89,11 +93,12 @@ public async Task Handle(CompletionParams request, CancellationT var completions = new Dictionary>(); foreach (var response in omnisharpResponse) { - var isSnippet = !string.IsNullOrEmpty(response.Snippet); - var text = isSnippet ? response.Snippet : response.CompletionText; + var isSnippet = !string.IsNullOrEmpty(response.Snippet); + var text = isSnippet ? response.Snippet : response.CompletionText; var textFormat = isSnippet ? InsertTextFormat.Snippet : InsertTextFormat.PlainText; - var completionItem = new CompletionItem { + var completionItem = new CompletionItem + { Label = response.CompletionText, Detail = !string.IsNullOrEmpty(response.ReturnType) ? response.DisplayText : @@ -104,7 +109,7 @@ public async Task Handle(CompletionParams request, CancellationT InsertTextFormat = textFormat, }; - if(!completions.ContainsKey(completionItem.Label)) + if (!completions.ContainsKey(completionItem.Label)) { completions[completionItem.Label] = new List(); } @@ -129,18 +134,14 @@ public async Task Handle(CompletionParams request, CancellationT return new CompletionList(result); } - public CompletionRegistrationOptions GetRegistrationOptions() + public override Task Handle(CompletionItem request, CancellationToken cancellationToken) { - return new CompletionRegistrationOptions() - { - DocumentSelector = _documentSelector, - TriggerCharacters = new[] { "." }, - }; + throw new NotImplementedException(); } - public void SetCapability(CompletionCapability capability) + public override bool CanResolve(CompletionItem value) { - _capability = capability; + return false; } } } diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDefinitionHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDefinitionHandler.cs index 94672ad41d..42003e07b4 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDefinitionHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDefinitionHandler.cs @@ -11,7 +11,7 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - class OmniSharpDefinitionHandler : IDefinitionHandler + class OmniSharpDefinitionHandler : DefinitionHandler { public static IEnumerable Enumerate(RequestHandlers handlers) { @@ -20,25 +20,18 @@ public static IEnumerable Enumerate(RequestHandlers handlers) yield return new OmniSharpDefinitionHandler(handler, selector); } - private DefinitionCapability _capability; private readonly Mef.IRequestHandler _definitionHandler; - private readonly DocumentSelector _documentSelector; public OmniSharpDefinitionHandler(Mef.IRequestHandler definitionHandler, DocumentSelector documentSelector) + : base(new TextDocumentRegistrationOptions() + { + DocumentSelector = documentSelector + }) { _definitionHandler = definitionHandler; - _documentSelector = documentSelector; } - public TextDocumentRegistrationOptions GetRegistrationOptions() - { - return new TextDocumentRegistrationOptions() - { - DocumentSelector = _documentSelector - }; - } - - public async Task Handle(DefinitionParams request, CancellationToken token) + public async override Task Handle(DefinitionParams request, CancellationToken token) { var omnisharpRequest = new GotoDefinitionRequest() { @@ -60,10 +53,5 @@ public async Task Handle(DefinitionParams request, Canc Range = ToRange((omnisharpResponse.Column, omnisharpResponse.Line)) }); } - - public void SetCapability(DefinitionCapability capability) - { - _capability = capability; - } } } diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentSymbolHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentSymbolHandler.cs index 7e5d92f381..73af1e33fb 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentSymbolHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpDocumentSymbolHandler.cs @@ -12,7 +12,7 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - internal sealed class OmniSharpDocumentSymbolHandler : IDocumentSymbolHandler + internal sealed class OmniSharpDocumentSymbolHandler : DocumentSymbolHandler { public static IEnumerable Enumerate(RequestHandlers handlers) { @@ -22,9 +22,7 @@ public static IEnumerable Enumerate(RequestHandlers handlers) yield return new OmniSharpDocumentSymbolHandler(handler, selector); } - private DocumentSymbolCapability _capability; private readonly Mef.IRequestHandler _codeStructureHandler; - private readonly DocumentSelector _documentSelector; private static readonly IDictionary Kinds = new Dictionary { @@ -47,12 +45,15 @@ public static IEnumerable Enumerate(RequestHandlers handlers) }; public OmniSharpDocumentSymbolHandler(Mef.IRequestHandler codeStructureHandler, DocumentSelector documentSelector) + : base(new TextDocumentRegistrationOptions() + { + DocumentSelector = documentSelector + }) { _codeStructureHandler = codeStructureHandler; - _documentSelector = documentSelector; } - public async Task Handle(DocumentSymbolParams request, CancellationToken token) + public async override Task Handle(DocumentSymbolParams request, CancellationToken token) { var omnisharpRequest = new CodeStructureRequest() { @@ -65,19 +66,6 @@ public async Task Handle(DocumentSym Array.Empty(); } - public TextDocumentRegistrationOptions GetRegistrationOptions() - { - return new TextDocumentRegistrationOptions() - { - DocumentSelector = _documentSelector - }; - } - - public void SetCapability(DocumentSymbolCapability capability) - { - _capability = capability; - } - private static SymbolInformationOrDocumentSymbol ToDocumentSymbolInformationOrDocumentSymbol(CodeElement node) { return new SymbolInformationOrDocumentSymbol(ToDocumentSymbol(node)); diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpHoverHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpHoverHandler.cs index 4708c90d2e..5cc70ba0b2 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpHoverHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpHoverHandler.cs @@ -10,7 +10,7 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - class OmniSharpHoverHandler : IHoverHandler + class OmniSharpHoverHandler : HoverHandler { public static IEnumerable Enumerate(RequestHandlers handlers) { @@ -20,25 +20,18 @@ public static IEnumerable Enumerate(RequestHandlers handlers) yield return new OmniSharpHoverHandler(handler, selector); } - private HoverCapability _capability; private readonly Mef.IRequestHandler _definitionHandler; - private readonly DocumentSelector _documentSelector; public OmniSharpHoverHandler(Mef.IRequestHandler definitionHandler, DocumentSelector documentSelector) + : base(new TextDocumentRegistrationOptions() + { + DocumentSelector = documentSelector + }) { _definitionHandler = definitionHandler; - _documentSelector = documentSelector; } - public TextDocumentRegistrationOptions GetRegistrationOptions() - { - return new TextDocumentRegistrationOptions() - { - DocumentSelector = _documentSelector - }; - } - - public async Task Handle(HoverParams request, CancellationToken token) + public async override Task Handle(HoverParams request, CancellationToken token) { var omnisharpRequest = new TypeLookupRequest() { @@ -57,10 +50,5 @@ public async Task Handle(HoverParams request, CancellationToken token) Contents = new MarkedStringsOrMarkupContent(new MarkedStringContainer(omnisharpResponse.Type, omnisharpResponse.Documentation)) }; } - - public void SetCapability(HoverCapability capability) - { - _capability = capability; - } } } diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpReferencesHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpReferencesHandler.cs index 5ec630ffe0..98ab2c1339 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpReferencesHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpReferencesHandler.cs @@ -12,7 +12,7 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - internal sealed class OmniSharpReferencesHandler : IReferencesHandler + internal sealed class OmniSharpReferencesHandler : ReferencesHandler { public static IEnumerable Enumerate(RequestHandlers handlers) { @@ -22,17 +22,18 @@ public static IEnumerable Enumerate(RequestHandlers handlers) yield return new OmniSharpReferencesHandler(handler, selector); } - private ReferencesCapability _capability; private readonly Mef.IRequestHandler _findUsagesHandler; - private readonly DocumentSelector _documentSelector; public OmniSharpReferencesHandler(Mef.IRequestHandler findUsagesHandler, DocumentSelector documentSelector) + : base(new TextDocumentRegistrationOptions() + { + DocumentSelector = documentSelector + }) { _findUsagesHandler = findUsagesHandler; - _documentSelector = documentSelector; } - public async Task Handle(ReferenceParams request, CancellationToken token) + public async override Task Handle(ReferenceParams request, CancellationToken token) { var omnisharpRequest = new FindUsagesRequest { @@ -51,18 +52,5 @@ public async Task Handle(ReferenceParams request, Cancellatio Range = x.ToRange() }).ToArray(); } - - public TextDocumentRegistrationOptions GetRegistrationOptions() - { - return new TextDocumentRegistrationOptions() - { - DocumentSelector = _documentSelector - }; - } - - public void SetCapability(ReferencesCapability capability) - { - _capability = capability; - } } } diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpRenameHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpRenameHandler.cs index 7211bc19c3..9f33960399 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpRenameHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpRenameHandler.cs @@ -11,16 +11,18 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - internal class OmniSharpRenameHandler : IRenameHandler + internal class OmniSharpRenameHandler : RenameHandler { private readonly Mef.IRequestHandler _renameHandler; - private readonly DocumentSelector _documentSelector; - private RenameCapability _capability; public OmniSharpRenameHandler(Mef.IRequestHandler renameHandler, DocumentSelector documentSelector) + : base(new RenameRegistrationOptions() + { + DocumentSelector = documentSelector, + PrepareProvider = false + }) { _renameHandler = renameHandler; - _documentSelector = documentSelector; } public static IEnumerable Enumerate(RequestHandlers handlers) @@ -31,7 +33,7 @@ public static IEnumerable Enumerate(RequestHandlers handlers) yield return new OmniSharpRenameHandler(handler, selector); } - public async Task Handle(RenameParams request, CancellationToken token) + public async override Task Handle(RenameParams request, CancellationToken token) { var omnisharpRequest = new RenameRequest { @@ -64,18 +66,5 @@ public async Task Handle(RenameParams request, CancellationToken Changes = changes }; } - - public RenameRegistrationOptions GetRegistrationOptions() - { - return new RenameRegistrationOptions - { - DocumentSelector = _documentSelector - }; - } - - public void SetCapability(RenameCapability capability) - { - _capability = capability; - } } } diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpSignatureHelpHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpSignatureHelpHandler.cs index 6a3ff2cdae..76a748c15a 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpSignatureHelpHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpSignatureHelpHandler.cs @@ -11,16 +11,18 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - internal class OmniSharpSignatureHelpHandler : ISignatureHelpHandler + internal class OmniSharpSignatureHelpHandler : SignatureHelpHandler { private readonly Mef.IRequestHandler _signatureHandler; - private readonly DocumentSelector _documentSelector; - private SignatureHelpCapability _capability; public OmniSharpSignatureHelpHandler(Mef.IRequestHandler signatureHandler, DocumentSelector documentSelector) + : base(new SignatureHelpRegistrationOptions() + { + DocumentSelector = documentSelector, + TriggerCharacters = new[] { ".", "?", "[" } + }) { _signatureHandler = signatureHandler; - _documentSelector = documentSelector; } public static IEnumerable Enumerate(RequestHandlers handlers) @@ -31,7 +33,7 @@ public static IEnumerable Enumerate(RequestHandlers handlers) yield return new OmniSharpSignatureHelpHandler(handler, selector); } - public async Task Handle(SignatureHelpParams request, CancellationToken token) + public async override Task Handle(SignatureHelpParams request, CancellationToken token) { var omnisharpRequest = new SignatureHelpRequest { @@ -67,18 +69,5 @@ public async Task Handle(SignatureHelpParams request, Cancellatio Signatures = signatures }; } - - public SignatureHelpRegistrationOptions GetRegistrationOptions() - { - return new SignatureHelpRegistrationOptions - { - DocumentSelector = _documentSelector - }; - } - - public void SetCapability(SignatureHelpCapability capability) - { - _capability = capability; - } } } diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpTextDocumentSyncHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpTextDocumentSyncHandler.cs index 6ef8e951c7..c4f4b39975 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpTextDocumentSyncHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpTextDocumentSyncHandler.cs @@ -18,7 +18,7 @@ namespace OmniSharp.LanguageServerProtocol.Handlers { - class OmniSharpTextDocumentSyncHandler : ITextDocumentSyncHandler + class OmniSharpTextDocumentSyncHandler : TextDocumentSyncHandler { public static IEnumerable Enumerate( RequestHandlers handlers, @@ -38,8 +38,6 @@ class OmniSharpTextDocumentSyncHandler : ITextDocumentSyncHandler } // TODO Make this configurable? - private readonly DocumentSelector _documentSelector; - private SynchronizationCapability _capability; private readonly Mef.IRequestHandler _openHandler; private readonly Mef.IRequestHandler _closeHandler; private readonly Mef.IRequestHandler _bufferHandler; @@ -52,25 +50,26 @@ class OmniSharpTextDocumentSyncHandler : ITextDocumentSyncHandler DocumentSelector documentSelector, TextDocumentSyncKind documentSyncKind, OmniSharpWorkspace workspace) + : base(documentSyncKind, new TextDocumentSaveRegistrationOptions() + { + DocumentSelector = documentSelector, + IncludeText = true, + }) { _openHandler = openHandler; _closeHandler = closeHandler; _bufferHandler = bufferHandler; _workspace = workspace; - _documentSelector = documentSelector; - Change = documentSyncKind; } - public TextDocumentSyncKind Change { get; } - - public TextDocumentAttributes GetTextDocumentAttributes(Uri uri) + public override TextDocumentAttributes GetTextDocumentAttributes(Uri uri) { var document = _workspace.GetDocument(Helpers.FromUri(uri)); if (document == null) return new TextDocumentAttributes(uri, ""); return new TextDocumentAttributes(uri, ""); } - public async Task Handle(DidChangeTextDocumentParams notification, CancellationToken cancellationToken) + public async override Task Handle(DidChangeTextDocumentParams notification, CancellationToken cancellationToken) { var contentChanges = notification.ContentChanges.ToArray(); if (contentChanges.Length == 1 && contentChanges[0].Range == null) @@ -105,7 +104,7 @@ await _bufferHandler.Handle(new UpdateBufferRequest() return Unit.Value; } - public async Task Handle(DidOpenTextDocumentParams notification, CancellationToken cancellationToken) + public async override Task Handle(DidOpenTextDocumentParams notification, CancellationToken cancellationToken) { if (_openHandler != null) { @@ -119,7 +118,7 @@ await _openHandler.Handle(new FileOpenRequest() return Unit.Value; } - public async Task Handle(DidCloseTextDocumentParams notification, CancellationToken cancellationToken) + public async override Task Handle(DidCloseTextDocumentParams notification, CancellationToken cancellationToken) { if (_closeHandler != null) { @@ -132,9 +131,9 @@ await _closeHandler.Handle(new FileCloseRequest() return Unit.Value; } - public async Task Handle(DidSaveTextDocumentParams notification, CancellationToken cancellationToken) + public async override Task Handle(DidSaveTextDocumentParams notification, CancellationToken cancellationToken) { - if (_capability?.DidSave == true) + if (Capability?.DidSave == true) { await _bufferHandler.Handle(new UpdateBufferRequest() { @@ -144,36 +143,5 @@ await _bufferHandler.Handle(new UpdateBufferRequest() } return Unit.Value; } - - TextDocumentChangeRegistrationOptions IRegistration.GetRegistrationOptions() - { - return new TextDocumentChangeRegistrationOptions() - { - DocumentSelector = _documentSelector, - SyncKind = Change - }; - } - - TextDocumentRegistrationOptions IRegistration.GetRegistrationOptions() - { - return new TextDocumentRegistrationOptions() - { - DocumentSelector = _documentSelector, - }; - } - - TextDocumentSaveRegistrationOptions IRegistration.GetRegistrationOptions() - { - return new TextDocumentSaveRegistrationOptions() - { - DocumentSelector = _documentSelector, - IncludeText = true - }; - } - - public void SetCapability(SynchronizationCapability capability) - { - _capability = capability; - } } } From fa04352e99fe031acefadbd14748355be9dfa7d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Bj=C3=B6rkstr=C3=B6m?= Date: Mon, 22 Jul 2019 00:23:32 +0300 Subject: [PATCH 04/10] Use stable version of LSP --- build/Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Packages.props b/build/Packages.props index 9954b71588..e54e37ddd5 100644 --- a/build/Packages.props +++ b/build/Packages.props @@ -63,7 +63,7 @@ - + From f245380b32fe86190658707b872e5a14eb59c0ed Mon Sep 17 00:00:00 2001 From: Filip W Date: Mon, 22 Jul 2019 08:48:22 +0200 Subject: [PATCH 05/10] Update LanguageServerHost.cs From 04f8216f3c3056118fc79375589ea7356e41f580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Bj=C3=B6rkstr=C3=B6m?= Date: Sun, 4 Aug 2019 23:06:27 +0300 Subject: [PATCH 06/10] Updated changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d22a565c2..c351a76704 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Changelog All changes to the project will be documented in this file. +## [1.35.0] - not yet released +* Updated LSP libraries to 0.13 which fixes problems with clients not supporting dynamic registrations. ([#1505](https://github.com/OmniSharp/omnisharp-roslyn/issues/1505), [#1525](https://github.com/OmniSharp/omnisharp-roslyn/issues/1525), PR: [#1562](https://github.com/OmniSharp/omnisharp-roslyn/pull/1562)) + ## [1.34.1] - 2019-07-31 * Fixed a regression introduced in 1.32.20 which caused `AllowUnsafeCode` in csproj to also enable `TreatWarningsAsErrors` behavior ([#1565](https://github.com/OmniSharp/omnisharp-roslyn/issues/1565), PR: [#1567](https://github.com/OmniSharp/omnisharp-roslyn/pull/1567)) * Update to Roslyn `3.3.0-beta2-19376-02` (PR: [#1574](https://github.com/OmniSharp/omnisharp-roslyn/pull/1574)) From 8d0ab4cf026e5eff58646764c73eb55f174cb894 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Bj=C3=B6rkstr=C3=B6m?= Date: Mon, 19 Aug 2019 22:47:40 +0300 Subject: [PATCH 07/10] Disable ProjectWithComplexAnalyzersTests to see if it fixes hanging build on Linux agents in Azure DevOps. --- .../OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs b/tests/OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs index a8ec00e1e5..783b6e8a6f 100644 --- a/tests/OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs +++ b/tests/OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs @@ -12,7 +12,7 @@ public ProjectWithComplexAnalyzersTests(ITestOutputHelper output) : base(output) { } - [Fact] + [Fact(Skip = "Possible thread starvation on Linux.")] public async Task CanLoadComplexAnalyzers() { using (var testProject = await TestAssets.Instance.GetTestProjectAsync("ProjectWithComplexAnalyzers")) From 761283856efe7b0fb93f2047dbc10a17e1afccb2 Mon Sep 17 00:00:00 2001 From: filipw Date: Tue, 20 Aug 2019 08:46:43 +0200 Subject: [PATCH 08/10] added a condition to skip a test on Linux --- tests/TestUtility/ConditionalFactAttribute.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/TestUtility/ConditionalFactAttribute.cs b/tests/TestUtility/ConditionalFactAttribute.cs index 6d2f7bd5df..85ba8801c2 100644 --- a/tests/TestUtility/ConditionalFactAttribute.cs +++ b/tests/TestUtility/ConditionalFactAttribute.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.InteropServices; using OmniSharp.Utilities; using Xunit; @@ -53,4 +54,10 @@ public class WindowsOnly : SkipCondition public override bool ShouldSkip => !PlatformHelper.IsWindows; public override string SkipReason => "Can only be run on Windows"; } + + public class NotOnLinux : SkipCondition + { + public override bool ShouldSkip => RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + public override string SkipReason => "Cannot be run on Linux"; + } } From cd4393a25ba69f739f960121894da47707f6ae8a Mon Sep 17 00:00:00 2001 From: filipw Date: Tue, 20 Aug 2019 08:46:58 +0200 Subject: [PATCH 09/10] use conditional fact to skip the test only on Linux --- .../ProjectWithComplexAnalyzersTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs b/tests/OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs index 783b6e8a6f..8bcd15d447 100644 --- a/tests/OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs +++ b/tests/OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs @@ -12,7 +12,8 @@ public ProjectWithComplexAnalyzersTests(ITestOutputHelper output) : base(output) { } - [Fact(Skip = "Possible thread starvation on Linux.")] + // possible thread starvation on Linux when running in Azure DevOps + [ConditionalFact(typeof(NotOnLinux))] public async Task CanLoadComplexAnalyzers() { using (var testProject = await TestAssets.Instance.GetTestProjectAsync("ProjectWithComplexAnalyzers")) From 78f3c7dc9bcb1d67e826d8f1b50be536af47fa34 Mon Sep 17 00:00:00 2001 From: filipw Date: Tue, 20 Aug 2019 11:26:10 +0200 Subject: [PATCH 10/10] run the complex analyzer test only on Windows --- .../ProjectWithComplexAnalyzersTests.cs | 4 ++-- tests/TestUtility/ConditionalFactAttribute.cs | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/tests/OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs b/tests/OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs index 8bcd15d447..4a19dd8833 100644 --- a/tests/OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs +++ b/tests/OmniSharp.MSBuild.Tests/ProjectWithComplexAnalyzersTests.cs @@ -12,8 +12,8 @@ public ProjectWithComplexAnalyzersTests(ITestOutputHelper output) : base(output) { } - // possible thread starvation on Linux when running in Azure DevOps - [ConditionalFact(typeof(NotOnLinux))] + // possible thread starvation on *nix when running in Azure DevOps + [ConditionalFact(typeof(WindowsOnly))] public async Task CanLoadComplexAnalyzers() { using (var testProject = await TestAssets.Instance.GetTestProjectAsync("ProjectWithComplexAnalyzers")) diff --git a/tests/TestUtility/ConditionalFactAttribute.cs b/tests/TestUtility/ConditionalFactAttribute.cs index 85ba8801c2..69ebe89c80 100644 --- a/tests/TestUtility/ConditionalFactAttribute.cs +++ b/tests/TestUtility/ConditionalFactAttribute.cs @@ -54,10 +54,4 @@ public class WindowsOnly : SkipCondition public override bool ShouldSkip => !PlatformHelper.IsWindows; public override string SkipReason => "Can only be run on Windows"; } - - public class NotOnLinux : SkipCondition - { - public override bool ShouldSkip => RuntimeInformation.IsOSPlatform(OSPlatform.Linux); - public override string SkipReason => "Cannot be run on Linux"; - } }