#include "atomic_object.h" #include "language_server_api.h" #include "libclangmm/Index.h" #include "libclangmm/TranslationUnit.h" #include "project.h" #include "working_files.h" #include #include #include struct CompletionSession { Project::Entry file; WorkingFiles* working_files; // Acquired when the session is being used. std::mutex usage_lock; // 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 Project::Entry& file, WorkingFiles* working_files); ~CompletionSession(); }; struct CompletionManager { std::vector> sessions; IndexerConfig* config; Project* project; WorkingFiles* working_files; using OnComplete = std::function results, NonElidedVector diagnostics)>; struct CompletionRequest { lsTextDocumentPositionParams location; OnComplete on_complete; }; AtomicObject completion_request; // Request that the given path be reparsed. AtomicObject reparse_request; CompletionManager(IndexerConfig* config, 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); // Set the new active session. We will drop clang state for all other // sessions and begin reparsing the session for |filename| to ensure // completions are always fast. void UpdateActiveSession(const std::string& filename); };