From bc04693ae7d0defc85355a82cad632d46e70c74a Mon Sep 17 00:00:00 2001 From: Riatre Foo Date: Wed, 31 Oct 2018 01:31:17 +0800 Subject: [PATCH] Make lsRange in documentLink narrower. --- src/messages/textDocument_document.cc | 33 ++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/messages/textDocument_document.cc b/src/messages/textDocument_document.cc index 06f2ca96..ce539177 100644 --- a/src/messages/textDocument_document.cc +++ b/src/messages/textDocument_document.cc @@ -94,9 +94,36 @@ void MessageHandler::textDocument_documentLink(TextDocumentParam ¶m, return; std::vector result; - for (const IndexInclude &include : file->def->includes) - result.push_back({lsRange{{include.line, 0}, {include.line + 1, 0}}, - DocumentUri::FromPath(include.resolved_path)}); + for (const IndexInclude &include : file->def->includes) { + WorkingFile *wf = + wfiles->GetFileByFilename(param.textDocument.uri.GetPath()); + if (!wf) + continue; + std::optional bpos = + wf->GetBufferPosFromIndexPos(include.line, nullptr, false); + if (!bpos) + continue; + + auto line = wf->buffer_lines[*bpos]; + int start_column = -1; + int end_column = -1; + char quote_type = 0; + for (size_t i = 0; i < line.size(); i++) { + if (!quote_type && (line[i] == '"' || line[i] == '<')) { + start_column = i + 1; + quote_type = line[i]; + } else if ((quote_type == '"' && line[i] == '"') || + (quote_type == '<' && line[i] == '>')) { + end_column = i; + break; + } + } + if (!quote_type || start_column == -1 || end_column == -1) + continue; + result.push_back( + {lsRange{{include.line, start_column}, {include.line, end_column}}, + DocumentUri::FromPath(include.resolved_path)}); + } reply(result); } // namespace ccls