#include "atomic_object.h" #include "language_server_api.h" #include "libclangmm/CompletionString.h" #include "libclangmm/Index.h" #include "libclangmm/TranslationUnit.h" #include "project.h" #include "working_files.h" #include #include struct CompletionSession { CompilationEntry file; // The active translation unit. std::unique_ptr active; std::unique_ptr active_index; // Updated translation unit. If |is_updated_ready| is true, then |updated| // contains more recent state than |active| and the two should be swapped. // TODO: implement this. Needs changes in Refresh and CodeComplete. //bool is_updated_ready = false; //std::unique_ptr updated; //std::unique_ptr updated_index; CompletionSession(const CompilationEntry& file, WorkingFiles* working_files); ~CompletionSession(); // Refresh file index. void Refresh(std::vector& unsaved); }; struct CompletionManager { std::vector> sessions; Project* project; WorkingFiles* working_files; using OnComplete = std::function results)>; struct CompletionRequest { lsTextDocumentPositionParams location; OnComplete on_complete; }; AtomicObject completion_request; CompletionManager(Project* project, WorkingFiles* working_files); // Start a code completion at the given location. |on_complete| will run when // completion results are available. |on_complete| may run on any thread. void CodeComplete(const lsTextDocumentPositionParams& completion_location, const OnComplete& on_complete); CompletionSession* GetOrOpenSession(const std::string& filename); };