diff options
Diffstat (limited to 'clang-tools-extra/clangd/ClangdLSPServer.cpp')
-rw-r--r-- | clang-tools-extra/clangd/ClangdLSPServer.cpp | 242 |
1 files changed, 110 insertions, 132 deletions
diff --git a/clang-tools-extra/clangd/ClangdLSPServer.cpp b/clang-tools-extra/clangd/ClangdLSPServer.cpp index a9bdd06914d..f98f2c426e0 100644 --- a/clang-tools-extra/clangd/ClangdLSPServer.cpp +++ b/clang-tools-extra/clangd/ClangdLSPServer.cpp @@ -613,9 +613,10 @@ void ClangdLSPServer::onCommand(const ExecuteCommandParams &Params, llvm::inconvertibleErrorCode(), "trying to apply a code action for a non-added file")); - auto Action = [this, ApplyEdit, ReplyAfterApplyingEdit]( - decltype(Reply) Reply, URIForFile File, std::string Code, - llvm::Expected<Tweak::Effect> R) { + auto Action = [this, ApplyEdit, ReplyAfterApplyingEdit, + Reply = std::move(Reply), File = Params.tweakArgs->file, + Code = std::move(*Code)]( + llvm::Expected<Tweak::Effect> R) mutable { if (!R) return Reply(R.takeError()); @@ -636,8 +637,7 @@ void ClangdLSPServer::onCommand(const ExecuteCommandParams &Params, }; Server->applyTweak(Params.tweakArgs->file.file(), Params.tweakArgs->selection, Params.tweakArgs->tweakID, - Bind(Action, std::move(Reply), Params.tweakArgs->file, - std::move(*Code))); + std::move(Action)); } else { // We should not get here because ExecuteCommandParams would not have // parsed in the first place and this handler should not be called. But if @@ -653,17 +653,15 @@ void ClangdLSPServer::onWorkspaceSymbol( Callback<std::vector<SymbolInformation>> Reply) { Server->workspaceSymbols( Params.query, CCOpts.Limit, - Bind( - [this](decltype(Reply) Reply, - llvm::Expected<std::vector<SymbolInformation>> Items) { - if (!Items) - return Reply(Items.takeError()); - for (auto &Sym : *Items) - Sym.kind = adjustKindToCapability(Sym.kind, SupportedSymbolKinds); - - Reply(std::move(*Items)); - }, - std::move(Reply))); + [Reply = std::move(Reply), + this](llvm::Expected<std::vector<SymbolInformation>> Items) mutable { + if (!Items) + return Reply(Items.takeError()); + for (auto &Sym : *Items) + Sym.kind = adjustKindToCapability(Sym.kind, SupportedSymbolKinds); + + Reply(std::move(*Items)); + }); } void ClangdLSPServer::onPrepareRename(const TextDocumentPositionParams &Params, @@ -680,19 +678,16 @@ void ClangdLSPServer::onRename(const RenameParams &Params, return Reply(llvm::make_error<LSPError>( "onRename called for non-added file", ErrorCode::InvalidParams)); - Server->rename( - File, Params.position, Params.newName, /*WantFormat=*/true, - Bind( - [File, Code, Params](decltype(Reply) Reply, - llvm::Expected<std::vector<TextEdit>> Edits) { - if (!Edits) - return Reply(Edits.takeError()); - - WorkspaceEdit WE; - WE.changes = {{Params.textDocument.uri.uri(), *Edits}}; - Reply(WE); - }, - std::move(Reply))); + Server->rename(File, Params.position, Params.newName, /*WantFormat=*/true, + [File, Code, Params, Reply = std::move(Reply)]( + llvm::Expected<std::vector<TextEdit>> Edits) mutable { + if (!Edits) + return Reply(Edits.takeError()); + + WorkspaceEdit WE; + WE.changes = {{Params.textDocument.uri.uri(), *Edits}}; + Reply(WE); + }); } void ClangdLSPServer::onDocumentDidClose( @@ -796,18 +791,16 @@ void ClangdLSPServer::onDocumentSymbol(const DocumentSymbolParams &Params, URIForFile FileURI = Params.textDocument.uri; Server->documentSymbols( Params.textDocument.uri.file(), - Bind( - [this, FileURI](decltype(Reply) Reply, - llvm::Expected<std::vector<DocumentSymbol>> Items) { - if (!Items) - return Reply(Items.takeError()); - adjustSymbolKinds(*Items, SupportedSymbolKinds); - if (SupportsHierarchicalDocumentSymbol) - return Reply(std::move(*Items)); - else - return Reply(flattenSymbolHierarchy(*Items, FileURI)); - }, - std::move(Reply))); + [this, FileURI, Reply = std::move(Reply)]( + llvm::Expected<std::vector<DocumentSymbol>> Items) mutable { + if (!Items) + return Reply(Items.takeError()); + adjustSymbolKinds(*Items, SupportedSymbolKinds); + if (SupportsHierarchicalDocumentSymbol) + return Reply(std::move(*Items)); + else + return Reply(flattenSymbolHierarchy(*Items, FileURI)); + }); } static llvm::Optional<Command> asCommand(const CodeAction &Action) { @@ -846,9 +839,9 @@ void ClangdLSPServer::onCodeAction(const CodeActionParams &Params, // Now enumerate the semantic code actions. auto ConsumeActions = - [this](decltype(Reply) Reply, URIForFile File, std::string Code, - Range Selection, std::vector<CodeAction> FixIts, - llvm::Expected<std::vector<ClangdServer::TweakRef>> Tweaks) { + [Reply = std::move(Reply), File, Code = std::move(*Code), + Selection = Params.range, FixIts = std::move(FixIts), this]( + llvm::Expected<std::vector<ClangdServer::TweakRef>> Tweaks) mutable { if (!Tweaks) return Reply(Tweaks.takeError()); @@ -867,10 +860,7 @@ void ClangdLSPServer::onCodeAction(const CodeActionParams &Params, return Reply(llvm::json::Array(Commands)); }; - Server->enumerateTweaks(File.file(), Params.range, - Bind(ConsumeActions, std::move(Reply), File, - std::move(*Code), Params.range, - std::move(FixIts))); + Server->enumerateTweaks(File.file(), Params.range, std::move(ConsumeActions)); } void ClangdLSPServer::onCompletion(const CompletionParams &Params, @@ -882,43 +872,39 @@ void ClangdLSPServer::onCompletion(const CompletionParams &Params, return Reply(CompletionList()); } Server->codeComplete(Params.textDocument.uri.file(), Params.position, CCOpts, - Bind( - [this](decltype(Reply) Reply, - llvm::Expected<CodeCompleteResult> List) { - if (!List) - return Reply(List.takeError()); - CompletionList LSPList; - LSPList.isIncomplete = List->HasMore; - for (const auto &R : List->Completions) { - CompletionItem C = R.render(CCOpts); - C.kind = adjustKindToCapability( - C.kind, SupportedCompletionItemKinds); - LSPList.items.push_back(std::move(C)); - } - return Reply(std::move(LSPList)); - }, - std::move(Reply))); + [Reply = std::move(Reply), + this](llvm::Expected<CodeCompleteResult> List) mutable { + if (!List) + return Reply(List.takeError()); + CompletionList LSPList; + LSPList.isIncomplete = List->HasMore; + for (const auto &R : List->Completions) { + CompletionItem C = R.render(CCOpts); + C.kind = adjustKindToCapability( + C.kind, SupportedCompletionItemKinds); + LSPList.items.push_back(std::move(C)); + } + return Reply(std::move(LSPList)); + }); } void ClangdLSPServer::onSignatureHelp(const TextDocumentPositionParams &Params, Callback<SignatureHelp> Reply) { Server->signatureHelp(Params.textDocument.uri.file(), Params.position, - Bind( - [this](decltype(Reply) Reply, - llvm::Expected<SignatureHelp> Signature) { - if (!Signature) - return Reply(Signature.takeError()); - if (SupportsOffsetsInSignatureHelp) - return Reply(std::move(*Signature)); - // Strip out the offsets from signature help for - // clients that only support string labels. - for (auto &SigInfo : Signature->signatures) { - for (auto &Param : SigInfo.parameters) - Param.labelOffsets.reset(); - } - return Reply(std::move(*Signature)); - }, - std::move(Reply))); + [Reply = std::move(Reply), this]( + llvm::Expected<SignatureHelp> Signature) mutable { + if (!Signature) + return Reply(Signature.takeError()); + if (SupportsOffsetsInSignatureHelp) + return Reply(std::move(*Signature)); + // Strip out the offsets from signature help for + // clients that only support string labels. + for (auto &SigInfo : Signature->signatures) { + for (auto &Param : SigInfo.parameters) + Param.labelOffsets.reset(); + } + return Reply(std::move(*Signature)); + }); } // Go to definition has a toggle function: if def and decl are distinct, then @@ -945,20 +931,18 @@ void ClangdLSPServer::onGoToDefinition(const TextDocumentPositionParams &Params, Callback<std::vector<Location>> Reply) { Server->locateSymbolAt( Params.textDocument.uri.file(), Params.position, - Bind( - [&, Params](decltype(Reply) Reply, - llvm::Expected<std::vector<LocatedSymbol>> Symbols) { - if (!Symbols) - return Reply(Symbols.takeError()); - std::vector<Location> Defs; - for (auto &S : *Symbols) { - if (Location *Toggle = getToggle(Params, S)) - return Reply(std::vector<Location>{std::move(*Toggle)}); - Defs.push_back(S.Definition.getValueOr(S.PreferredDeclaration)); - } - Reply(std::move(Defs)); - }, - std::move(Reply))); + [Params, Reply = std::move(Reply)]( + llvm::Expected<std::vector<LocatedSymbol>> Symbols) mutable { + if (!Symbols) + return Reply(Symbols.takeError()); + std::vector<Location> Defs; + for (auto &S : *Symbols) { + if (Location *Toggle = getToggle(Params, S)) + return Reply(std::vector<Location>{std::move(*Toggle)}); + Defs.push_back(S.Definition.getValueOr(S.PreferredDeclaration)); + } + Reply(std::move(Defs)); + }); } void ClangdLSPServer::onGoToDeclaration( @@ -966,20 +950,18 @@ void ClangdLSPServer::onGoToDeclaration( Callback<std::vector<Location>> Reply) { Server->locateSymbolAt( Params.textDocument.uri.file(), Params.position, - Bind( - [&, Params](decltype(Reply) Reply, - llvm::Expected<std::vector<LocatedSymbol>> Symbols) { - if (!Symbols) - return Reply(Symbols.takeError()); - std::vector<Location> Decls; - for (auto &S : *Symbols) { - if (Location *Toggle = getToggle(Params, S)) - return Reply(std::vector<Location>{std::move(*Toggle)}); - Decls.push_back(std::move(S.PreferredDeclaration)); - } - Reply(std::move(Decls)); - }, - std::move(Reply))); + [Params, Reply = std::move(Reply)]( + llvm::Expected<std::vector<LocatedSymbol>> Symbols) mutable { + if (!Symbols) + return Reply(Symbols.takeError()); + std::vector<Location> Decls; + for (auto &S : *Symbols) { + if (Location *Toggle = getToggle(Params, S)) + return Reply(std::vector<Location>{std::move(*Toggle)}); + Decls.push_back(std::move(S.PreferredDeclaration)); + } + Reply(std::move(Decls)); + }); } void ClangdLSPServer::onSwitchSourceHeader( @@ -1001,30 +983,26 @@ void ClangdLSPServer::onDocumentHighlight( void ClangdLSPServer::onHover(const TextDocumentPositionParams &Params, Callback<llvm::Optional<Hover>> Reply) { Server->findHover(Params.textDocument.uri.file(), Params.position, - Bind( - [this](decltype(Reply) Reply, - llvm::Expected<llvm::Optional<HoverInfo>> H) { - if (!H) - return Reply(H.takeError()); - if (!*H) - return Reply(llvm::None); - - Hover R; - R.contents.kind = HoverContentFormat; - R.range = (*H)->SymRange; - switch (HoverContentFormat) { - case MarkupKind::PlainText: - R.contents.value = - (*H)->present().renderAsPlainText(); - return Reply(std::move(R)); - case MarkupKind::Markdown: - R.contents.value = - (*H)->present().renderAsMarkdown(); - return Reply(std::move(R)); - }; - llvm_unreachable("unhandled MarkupKind"); - }, - std::move(Reply))); + [Reply = std::move(Reply), this]( + llvm::Expected<llvm::Optional<HoverInfo>> H) mutable { + if (!H) + return Reply(H.takeError()); + if (!*H) + return Reply(llvm::None); + + Hover R; + R.contents.kind = HoverContentFormat; + R.range = (*H)->SymRange; + switch (HoverContentFormat) { + case MarkupKind::PlainText: + R.contents.value = (*H)->present().renderAsPlainText(); + return Reply(std::move(R)); + case MarkupKind::Markdown: + R.contents.value = (*H)->present().renderAsMarkdown(); + return Reply(std::move(R)); + }; + llvm_unreachable("unhandled MarkupKind"); + }); } void ClangdLSPServer::onTypeHierarchy( |