// Copyright 2017-2018 ccls Authors // SPDX-License-Identifier: Apache-2.0 #pragma once #include "config.h" #include "method.h" #include #include #include #include #include struct WorkingFiles; struct Project { struct Entry { std::string directory; std::string filename; std::vector args; // If true, this entry is inferred and was not read from disk. bool is_inferred = false; int id = -1; }; // Include directories for "" headers std::vector quote_include_directories; // Include directories for <> headers std::vector angle_include_directories; std::vector entries; std::mutex mutex_; std::unordered_map path_to_entry_index; // Loads a project for the given |directory|. // // If |config->compilationDatabaseDirectory| is not empty, look for .ccls or // compile_commands.json in it, otherwise they are retrieved in // |root_directory|. // For .ccls, recursive directory listing is used and files with known // suffixes are indexed. .ccls files can exist in subdirectories and they // will affect flags in their subtrees (relative paths are relative to the // project root, not subdirectories). For compile_commands.json, its entries // are indexed. void Load(const std::string &root_directory); // Lookup the CompilationEntry for |filename|. If no entry was found this // will infer one based on existing project structure. Entry FindCompilationEntryForFile(const std::string &filename); // If the client has overridden the flags, or specified them for a file // that is not in the compilation_database.json make sure those changes // are permanent. void SetArgsForFile(const std::vector &args, const std::string &path); void Index(WorkingFiles *wfiles, lsRequestId id); };