1 // Copyright 2017-2018 ccls Authors 2 // SPDX-License-Identifier: Apache-2.0 3 4 #pragma once 5 6 #include "message_handler.hh" 7 8 #include <atomic> 9 #include <mutex> 10 11 namespace ccls { 12 struct GroupMatch; 13 struct Project; 14 15 struct IncludeComplete { 16 IncludeComplete(Project *project); 17 ~IncludeComplete(); 18 19 // Starts scanning directories. Clears existing cache. 20 void rescan(); 21 22 // Ensures the one-off file is inside |completion_items|. 23 void addFile(const std::string &absolute_path); 24 25 std::optional<ccls::CompletionItem> 26 findCompletionItemForAbsolutePath(const std::string &absolute_path); 27 28 // Insert item to |completion_items|. 29 // Update |absolute_path_to_completion_item| and |inserted_paths|. 30 void insertCompletionItem(const std::string &absolute_path, 31 ccls::CompletionItem &&item); 32 33 // Guards |completion_items| when |is_scanning| is true. 34 std::mutex completion_items_mutex; 35 std::atomic<bool> is_scanning; 36 std::vector<ccls::CompletionItem> completion_items; 37 38 // Absolute file path to the completion item in |completion_items|. 39 // Keep the one with shortest include path. 40 std::unordered_map<std::string, int> absolute_path_to_completion_item; 41 42 // Only one completion item per include path. 43 std::unordered_map<std::string, int> inserted_paths; 44 45 // Cached references 46 Project *project_; 47 std::unique_ptr<GroupMatch> match_; 48 }; 49 } // namespace ccls 50