hokein created this revision.
hokein added reviewers: ilya-biryukov, ioeric.
Herald added subscribers: arphaman, jkorous, MaskRay.
Repository:
rCTE Clang Tools Extra
https://reviews.llvm.org/D50896
Files:
clangd/ClangdLSPServer.cpp
clangd/ClangdLSPServer.h
clangd/ClangdServer.cpp
clangd/ClangdServer.h
clangd/Protocol.cpp
clangd/Protocol.h
clangd/ProtocolHandlers.cpp
clangd/ProtocolHandlers.h
clangd/XRefs.cpp
clangd/XRefs.h
test/clangd/initialize-params-invalid.test
test/clangd/initialize-params.test
Index: test/clangd/initialize-params.test
===================================================================
--- test/clangd/initialize-params.test
+++ test/clangd/initialize-params.test
@@ -29,6 +29,7 @@
# CHECK-NEXT: ]
# CHECK-NEXT: },
# CHECK-NEXT: "hoverProvider": true,
+# CHECK-NEXT: "referencesProvider": false,
# CHECK-NEXT: "renameProvider": true,
# CHECK-NEXT: "signatureHelpProvider": {
# CHECK-NEXT: "triggerCharacters": [
Index: test/clangd/initialize-params-invalid.test
===================================================================
--- test/clangd/initialize-params-invalid.test
+++ test/clangd/initialize-params-invalid.test
@@ -29,6 +29,7 @@
# CHECK-NEXT: ]
# CHECK-NEXT: },
# CHECK-NEXT: "hoverProvider": true,
+# CHECK-NEXT: "referencesProvider": false,
# CHECK-NEXT: "renameProvider": true,
# CHECK-NEXT: "signatureHelpProvider": {
# CHECK-NEXT: "triggerCharacters": [
Index: clangd/XRefs.h
===================================================================
--- clangd/XRefs.h
+++ clangd/XRefs.h
@@ -34,6 +34,11 @@
/// Get the hover information when hovering at \p Pos.
llvm::Optional<Hover> getHover(ParsedAST &AST, Position Pos);
+/// Get references of symbol at a \p Pos.
+std::vector<Location> references(ParsedAST &AST, Position Pos,
+ bool includeDeclaration,
+ const SymbolIndex *Index = nullptr);
+
} // namespace clangd
} // namespace clang
Index: clangd/XRefs.cpp
===================================================================
--- clangd/XRefs.cpp
+++ clangd/XRefs.cpp
@@ -17,6 +17,7 @@
#include "clang/Index/IndexingAction.h"
#include "clang/Index/USRGeneration.h"
#include "llvm/Support/Path.h"
+
namespace clang {
namespace clangd {
using namespace llvm;
@@ -660,5 +661,12 @@
return None;
}
+std::vector<Location> references(ParsedAST &AST, Position Pos,
+ bool IncludeDeclaration,
+ const SymbolIndex *Index) {
+ // FIXME: implement it.
+ return {};
+}
+
} // namespace clangd
} // namespace clang
Index: clangd/ProtocolHandlers.h
===================================================================
--- clangd/ProtocolHandlers.h
+++ clangd/ProtocolHandlers.h
@@ -55,6 +55,7 @@
virtual void onDocumentHighlight(TextDocumentPositionParams &Params) = 0;
virtual void onHover(TextDocumentPositionParams &Params) = 0;
virtual void onChangeConfiguration(DidChangeConfigurationParams &Params) = 0;
+ virtual void onReference(ReferenceParams &Params) = 0;
};
void registerCallbackHandlers(JSONRPCDispatcher &Dispatcher,
Index: clangd/ProtocolHandlers.cpp
===================================================================
--- clangd/ProtocolHandlers.cpp
+++ clangd/ProtocolHandlers.cpp
@@ -75,4 +75,5 @@
Register("workspace/didChangeConfiguration",
&ProtocolCallbacks::onChangeConfiguration);
Register("workspace/symbol", &ProtocolCallbacks::onWorkspaceSymbol);
+ Register("textDocument/references", &ProtocolCallbacks::onReference);
}
Index: clangd/Protocol.h
===================================================================
--- clangd/Protocol.h
+++ clangd/Protocol.h
@@ -867,6 +867,17 @@
llvm::json::Value toJSON(const DocumentHighlight &DH);
llvm::raw_ostream &operator<<(llvm::raw_ostream &, const DocumentHighlight &);
+struct ReferenceContext {
+ // Include the declaration of the current symbol.
+ bool includeDeclaration;
+};
+bool fromJSON(const llvm::json::Value &, ReferenceContext &);
+
+struct ReferenceParams : public TextDocumentPositionParams {
+ ReferenceContext context;
+};
+bool fromJSON(const llvm::json::Value &, ReferenceParams &);
+
} // namespace clangd
} // namespace clang
Index: clangd/Protocol.cpp
===================================================================
--- clangd/Protocol.cpp
+++ clangd/Protocol.cpp
@@ -615,5 +615,16 @@
O.map("compilationDatabaseChanges", CCPC.compilationDatabaseChanges);
}
+bool fromJSON(const json::Value &Params, ReferenceContext &RC) {
+ json::ObjectMapper O(Params);
+ return O && O.map("includeDeclaration", RC.includeDeclaration);
+}
+
+bool fromJSON(const json::Value &Params, ReferenceParams &R) {
+ json::ObjectMapper O(Params);
+ return O && O.map("context", R.context) &&
+ O.map("textDocument", R.textDocument) && O.map("position", R.position);
+}
+
} // namespace clangd
} // namespace clang
Index: clangd/ClangdServer.h
===================================================================
--- clangd/ClangdServer.h
+++ clangd/ClangdServer.h
@@ -154,6 +154,10 @@
void documentSymbols(StringRef File,
Callback<std::vector<SymbolInformation>> CB);
+ /// Retrieve locations for symbol references.
+ void references(PathRef File, Position Pos, bool includeDeclaration,
+ Callback<std::vector<Location>> CB);
+
/// Run formatting for \p Rng inside \p File with content \p Code.
llvm::Expected<tooling::Replacements> formatRange(StringRef Code,
PathRef File, Range Rng);
Index: clangd/ClangdServer.cpp
===================================================================
--- clangd/ClangdServer.cpp
+++ clangd/ClangdServer.cpp
@@ -464,6 +464,19 @@
Bind(Action, std::move(CB)));
}
+void ClangdServer::references(PathRef File, Position Pos,
+ bool includeDeclaration,
+ Callback<std::vector<Location>> CB) {
+ auto Action = [Pos, includeDeclaration, this](
+ Callback<std::vector<Location>> CB, llvm::Expected<InputsAndAST> InpAST) {
+ if (!InpAST)
+ return CB(InpAST.takeError());
+ CB(clangd::references(InpAST->AST, Pos, includeDeclaration, Index));
+ };
+
+ WorkScheduler.runWithAST("References", File, Bind(Action, std::move(CB)));
+}
+
std::vector<std::pair<Path, std::size_t>>
ClangdServer::getUsedBytesPerFile() const {
return WorkScheduler.getUsedBytesPerFile();
Index: clangd/ClangdLSPServer.h
===================================================================
--- clangd/ClangdLSPServer.h
+++ clangd/ClangdLSPServer.h
@@ -75,6 +75,7 @@
void onRename(RenameParams &Parames) override;
void onHover(TextDocumentPositionParams &Params) override;
void onChangeConfiguration(DidChangeConfigurationParams &Params) override;
+ void onReference(ReferenceParams &Params) override;
std::vector<Fix> getFixes(StringRef File, const clangd::Diagnostic &D);
Index: clangd/ClangdLSPServer.cpp
===================================================================
--- clangd/ClangdLSPServer.cpp
+++ clangd/ClangdLSPServer.cpp
@@ -101,8 +101,7 @@
{"documentRangeFormattingProvider", true},
{"documentOnTypeFormattingProvider",
json::Object{
- {"firstTriggerCharacter", "}"},
- {"moreTriggerCharacter", {}},
+ {"firstTriggerCharacter", "}"}, {"moreTriggerCharacter", {}},
}},
{"codeActionProvider", true},
{"completionProvider",
@@ -120,6 +119,7 @@
{"renameProvider", true},
{"documentSymbolProvider", true},
{"workspaceSymbolProvider", true},
+ {"referencesProvider", false},
{"executeCommandProvider",
json::Object{
{"commands", {ExecuteCommandParams::CLANGD_APPLY_FIX_COMMAND}},
@@ -436,6 +436,18 @@
applyConfiguration(Params.settings);
}
+void ClangdLSPServer::onReference(ReferenceParams &Params) {
+ Server.references(Params.textDocument.uri.file(), Params.position,
+ Params.context.includeDeclaration,
+ [](llvm::Expected<std::vector<Location>> Locations) {
+ if (!Locations)
+ return replyError(
+ ErrorCode::InternalError,
+ llvm::toString(Locations.takeError()));
+ reply(llvm::json::Array(*Locations));
+ });
+}
+
ClangdLSPServer::ClangdLSPServer(JSONOutput &Out,
const clangd::CodeCompleteOptions &CCOpts,
llvm::Optional<Path> CompileCommandsDir,
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits