#pragma once #include "Clang.h" namespace clice { struct Include { /// The path of the included file. llvm::StringRef path; /// Location of the directive identifier. clang::SourceLocation loc; /// Range of the filename. clang::SourceRange range; }; struct Condition { enum class BranchKind : uint8_t { If = 0, Elif, Ifdef, Elifdef, Ifndef, Elifndef, Else, EndIf, }; using enum BranchKind; enum class ConditionValue : uint8_t { True = 0, False, Skipped, None, }; using enum ConditionValue; /// Kind of the branch. BranchKind kind; /// Value of the condition. ConditionValue value; /// Location of the directive identifier. clang::SourceLocation loc; /// Range of the condition. clang::SourceRange conditionRange; }; struct MacroRef { enum class Kind : uint8_t { Def = 0, Ref, Undef, }; using enum Kind; /// The macro definition information. const clang::MacroInfo* macro; /// Kind of the macro reference. Kind kind; /// The location of the macro name. clang::SourceLocation loc; }; /// Do we need to store pragma information? struct Pragma {}; struct Directive { std::vector includes; std::vector conditions; std::vector macros; /// Tell preprocessor to collect directives information and store them in `directives`. static void attach(clang::Preprocessor& pp, llvm::DenseMap& directives); }; } // namespace clice