summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/ClangdLSPServer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clangd/ClangdLSPServer.cpp')
-rw-r--r--clang-tools-extra/clangd/ClangdLSPServer.cpp242
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(
OpenPOWER on IntegriCloud