From 6c45663002b1327eeb0c21210997363f30489f3b Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Fri, 19 Jan 2018 21:11:03 -0800 Subject: [PATCH] Support #include for textDocument/references --- src/messages/text_document_references.cc | 28 +++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/messages/text_document_references.cc b/src/messages/text_document_references.cc index 6f4fa4d7..badf6a78 100644 --- a/src/messages/text_document_references.cc +++ b/src/messages/text_document_references.cc @@ -7,23 +7,22 @@ namespace { struct Ipc_TextDocumentReferences : public RequestMessage { + const static IpcId kIpcId = IpcId::TextDocumentReferences; struct lsReferenceContext { // Include the declaration of the current symbol. bool includeDeclaration; }; - struct lsReferenceParams : public lsTextDocumentPositionParams { + struct Params { lsTextDocumentIdentifier textDocument; lsPosition position; lsReferenceContext context; }; - const static IpcId kIpcId = IpcId::TextDocumentReferences; - - lsReferenceParams params; + Params params; }; MAKE_REFLECT_STRUCT(Ipc_TextDocumentReferences::lsReferenceContext, includeDeclaration); -MAKE_REFLECT_STRUCT(Ipc_TextDocumentReferences::lsReferenceParams, +MAKE_REFLECT_STRUCT(Ipc_TextDocumentReferences::Params, textDocument, position, context); @@ -75,6 +74,25 @@ struct TextDocumentReferencesHandler break; } + if (out.result.empty()) + for (const IndexInclude& include : file->def->includes) + if (include.line == request->params.position.line) { + // |include| is the line the cursor is on. + for (QueryFile& file1 : db->files) + if (file1.def) + for (const IndexInclude& include1 : file1.def->includes) + if (include1.resolved_path == include.resolved_path) { + // Another file |file1| has the same include line. + lsLocation result; + result.uri = lsDocumentUri::FromPath(file1.def->path); + result.range.start.line = result.range.end.line = + include1.line; + out.result.push_back(std::move(result)); + break; + } + break; + } + QueueManager::WriteStdout(IpcId::TextDocumentReferences, out); } };