From fe3b9c4a8a1ae21e1942210403a3857a24bb56c8 Mon Sep 17 00:00:00 2001 From: Jacob Dufault Date: Mon, 29 Jan 2018 21:52:38 -0800 Subject: [PATCH] Revert "Fix completion of headers." This reverts commit ce0aab3afa4b7d80d46c901d1bb8234ac18fa70b. --- src/config.h | 3 +-- src/include_complete.cc | 22 ++++++++++++++++----- src/lex_utils.cc | 25 ++---------------------- src/lex_utils.h | 4 +--- src/messages/text_document_completion.cc | 12 +++++------- 5 files changed, 26 insertions(+), 40 deletions(-) diff --git a/src/config.h b/src/config.h index d6c9905c..405716fc 100644 --- a/src/config.h +++ b/src/config.h @@ -104,8 +104,7 @@ struct Config { // An example value is { ".h", ".hpp" } // // This is significantly faster than using a regex. - std::vector includeCompletionWhitelistLiteralEnding = { - ".h", ".hpp", ".hh"}; + std::vector includeCompletionWhitelistLiteralEnding; // Regex patterns to match include completion candidates against. They // receive the absolute file path. // diff --git a/src/include_complete.cc b/src/include_complete.cc index 54d1ca57..5f10aaa3 100644 --- a/src/include_complete.cc +++ b/src/include_complete.cc @@ -78,18 +78,30 @@ bool TrimPath(Project* project, lsCompletionItem BuildCompletionItem(Config* config, const std::string& path, - bool /*use_angle_brackets*/, + bool use_angle_brackets, bool is_stl) { lsCompletionItem item; - item.label = ElideLongPath(config, path); + if (use_angle_brackets) + item.label = "#include <" + ElideLongPath(config, path) + ">"; + else + item.label = "#include \"" + ElideLongPath(config, path) + "\""; + item.detail = path; + + // Replace the entire existing content. + // NOTE: When submitting completion items, textEdit->range must be updated. item.textEdit = lsTextEdit(); - item.textEdit->newText = path; + if (use_angle_brackets) + item.textEdit->newText = "#include <" + path + ">"; + else + item.textEdit->newText = "#include \"" + path + "\""; + item.insertTextFormat = lsInsertTextFormat::PlainText; if (is_stl) item.kind = lsCompletionItemKind::Module; else item.kind = lsCompletionItemKind::File; + return item; } @@ -115,8 +127,8 @@ void IncludeComplete::Rescan() { Timer timer; InsertStlIncludes(); - // InsertIncludesFromDirectory(config_->projectRoot, - // false /*use_angle_brackets*/); + InsertIncludesFromDirectory(config_->projectRoot, + false /*use_angle_brackets*/); for (const std::string& dir : project_->quote_include_directories) InsertIncludesFromDirectory(dir, false /*use_angle_brackets*/); for (const std::string& dir : project_->angle_include_directories) diff --git a/src/lex_utils.cc b/src/lex_utils.cc index 20fab59e..0f5bd63d 100644 --- a/src/lex_utils.cc +++ b/src/lex_utils.cc @@ -45,32 +45,11 @@ lsPosition CharPos(const std::string& search, return result; } -std::tuple ShouldRunIncludeCompletion( - const std::string& line) { +bool ShouldRunIncludeCompletion(const std::string& line) { size_t start = 0; while (start < line.size() && isspace(line[start])) ++start; - if (start >= line.size() || line[start] != '#') - return std::make_tuple(false, "", ""); - ++start; - if (line.compare(start, 7, "include") == 0) { - start += 7; - while (start < line.size() && isspace(line[start])) - ++start; - } - std::string surrounding, prefix; - if (start >= line.size()) - return std::make_tuple(false, "", ""); - else if (line[start] == '"') - surrounding = "\"\""; - else if (line[start] == '<') - surrounding = "<>"; - else - return std::make_tuple(false, "", ""); - ++start; - if (start < line.size()) - prefix = line.substr(start); - return std::make_tuple(true, surrounding, prefix); + return start < line.size() && line[start] == '#'; } // TODO: eliminate |line_number| param. diff --git a/src/lex_utils.h b/src/lex_utils.h index 9933bded..69355ba4 100644 --- a/src/lex_utils.h +++ b/src/lex_utils.h @@ -3,7 +3,6 @@ #include "language_server_api.h" #include -#include // Utility method to map |position| to an offset inside of |content|. int GetOffsetForPosition(lsPosition position, const std::string& content); @@ -12,8 +11,7 @@ lsPosition CharPos(const std::string& search, char character, int character_offset = 0); -std::tuple ShouldRunIncludeCompletion( - const std::string& line); +bool ShouldRunIncludeCompletion(const std::string& line); // TODO: eliminate |line_number| param. optional ExtractQuotedRange(int line_number, const std::string& line); diff --git a/src/messages/text_document_completion.cc b/src/messages/text_document_completion.cc index 3c5faee7..1286e511 100644 --- a/src/messages/text_document_completion.cc +++ b/src/messages/text_document_completion.cc @@ -283,10 +283,7 @@ struct TextDocumentCompletionHandler : MessageHandler { &existing_completion); } - bool yes; - std::string surrounding, prefix; - std::tie(yes, surrounding, prefix) = ShouldRunIncludeCompletion(buffer_line); - if (yes) { + if (ShouldRunIncludeCompletion(buffer_line)) { Out_TextDocumentComplete out; out.id = request->id; @@ -299,17 +296,18 @@ struct TextDocumentCompletionHandler : MessageHandler { include_complete->completion_items.end()); if (lock) lock.unlock(); + + // Update textEdit params. for (lsCompletionItem& item : out.result.items) { item.textEdit->range.start.line = request->params.position.line; item.textEdit->range.start.character = 0; item.textEdit->range.end.line = request->params.position.line; item.textEdit->range.end.character = (int)buffer_line.size(); - item.textEdit->newText = std::string("#include ") + surrounding[0] + - item.textEdit->newText + surrounding[1]; } } - FilterAndSortCompletionResponse(&out, prefix, + TrimInPlace(buffer_line); + FilterAndSortCompletionResponse(&out, buffer_line, config->completion.filterAndSort); QueueManager::WriteStdout(IpcId::TextDocumentCompletion, out); } else {