#pragma once #include #include #include #include "test/annotation.h" #include "test/test.h" #include "command/command.h" #include "compile/compilation.h" #include "support/logging.h" namespace clice::testing { struct Tester { CompilationParams params; CompilationDatabase database; std::optional unit; std::string src_path; AnnotatedSources sources; /// Owns argument strings so that params.arguments (const char*) remains valid. std::vector owned_args; /// The VFS used for compilation. llvm::IntrusiveRefCntPtr vfs; struct ModuleFile { std::string filename; std::string content; }; std::vector module_files; std::vector pcm_paths; ~Tester(); void add_main(llvm::StringRef file, llvm::StringRef content) { src_path = file.str(); sources.add_source(file, content); } void add_file(llvm::StringRef name, llvm::StringRef content) { sources.add_source(name, content); } void add_files(llvm::StringRef main_file, llvm::StringRef content) { src_path = main_file.str(); sources.add_sources(content); } void add_module(llvm::StringRef filename, llvm::StringRef content) { module_files.push_back({filename.str(), content.str()}); } /// Fast VFS-only path: uses -cc1 directly, no system headers. void prepare(llvm::StringRef standard = "-std=c++20"); bool compile(llvm::StringRef standard = "-std=c++20"); bool compile_with_pch(llvm::StringRef standard = "-std=c++20"); bool compile_with_modules(llvm::StringRef standard = "-std=c++20"); /// Driver path: uses CompilationDatabase + toolchain cache, has system headers. void prepare_driver(llvm::StringRef standard = "-std=c++20"); bool compile_driver(llvm::StringRef standard = "-std=c++20"); bool compile_driver_with_pch(llvm::StringRef standard = "-std=c++20"); bool try_compile(); std::uint32_t operator[](llvm::StringRef file, llvm::StringRef pos) { return sources.all_files.lookup(file).offsets.lookup(pos); } std::uint32_t point(llvm::StringRef name = "", llvm::StringRef file = ""); llvm::ArrayRef nameless_points(llvm::StringRef file = ""); LocalSourceRange range(llvm::StringRef name = "", llvm::StringRef file = ""); void clear(); }; } // namespace clice::testing