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