#pragma once #include "CompilationUnit.h" #include "Module.h" #include "Preamble.h" #include "Support/FileSystem.h" namespace clang { class CodeCompleteConsumer; } namespace clice { struct CompilationParams { /// The kind of this compilation. CompilationKind kind; /// Whether to run clang-tidy. bool clang_tidy = false; /// Output file path. llvm::SmallString<128> output_file; std::string directory; bool arguments_from_database = false; /// Responsible for storing the arguments. std::vector arguments; llvm::IntrusiveRefCntPtr vfs = new ThreadSafeFS(); /// Information about reuse PCH. std::pair pch; /// Information about reuse PCM(name, path). llvm::StringMap pcms; /// Code completion file:offset. std::tuple completion; /// The memory buffers for all remapped file. llvm::StringMap> buffers; /// A flag to inform to stop compilation, this is very useful /// to cancel old compilation task. std::shared_ptr stop = std::make_shared(false); void add_remapped_file(llvm::StringRef path, llvm::StringRef content, std::uint32_t bound = -1) { if(bound != -1) { assert(bound <= content.size()); content = content.substr(0, bound); } buffers.try_emplace(path, llvm::MemoryBuffer::getMemBufferCopy(content)); } }; /// Only preprocess ths source flie. CompilationUnit preprocess(CompilationParams& params); /// Build AST from given file path and content. If pch or pcm provided, apply them to the compiler. /// Note this function will not check whether we need to update the PCH or PCM, caller should check /// their reusability and update in time. CompilationUnit compile(CompilationParams& params); /// Build PCH from given file path and content. CompilationUnit compile(CompilationParams& params, PCHInfo& out); /// Build PCM from given file path and content. CompilationUnit compile(CompilationParams& params, PCMInfo& out); /// Run code completion at the given location. CompilationUnit complete(CompilationParams& params, clang::CodeCompleteConsumer* consumer); } // namespace clice