#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 |directory| contains a compile_commands.json file, that will be used to // discover all files and args. 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& 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); };