#pragma once #include "config.h" #include #include #include #include #include #include using std::experimental::nullopt; using std::experimental::optional; struct Project { struct Entry { std::string filename; std::vector args; // If true, this entry is inferred and was not read from disk. bool is_inferred = false; }; // Include directories for "" headers std::vector quote_include_directories; // Include directories for <> headers std::vector angle_include_directories; std::vector entries; spp::sparse_hash_map absolute_path_to_entry_index_; // Loads a project for the given |directory|. // // If |compilationDatabaseDirectory| is not empty, the compile_commands.json // file in it will be used to discover all files and args. If it's empty and // |directory| contains a compile_commands.json file, that one will be used // instead. Otherwise, a recursive directory listing of all *.cpp, *.cc, *.h, // and *.hpp files will be used. clang arguments can be specified in a // clang_args file located inside of |directory|. void Load(const std::vector& extra_flags, const std::string& compilationDatabaseDirectory, const std::string& rootDirectory, const std::string& resource_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); // Run |action| on every file in the project. void ForAllFilteredFiles( Config* config, std::function action); };