37 Definition(
const TokenSequence &, std::size_t firstToken, std::size_t tokens);
38 Definition(
const std::vector<std::string> &argNames,
const TokenSequence &,
39 std::size_t firstToken, std::size_t tokens,
bool isVariadic =
false);
40 Definition(
const std::string &predefined,
AllSources &);
43 bool isFunctionLike()
const {
return isFunctionLike_; }
44 std::size_t argumentCount()
const {
return argNames_.size(); }
45 bool isVariadic()
const {
return isVariadic_; }
46 bool isDisabled()
const {
return isDisabled_; }
47 bool isPredefined()
const {
return isPredefined_; }
48 const TokenSequence &replacement()
const {
return replacement_; }
50 bool set_isDisabled(
bool disable);
53 bool inIfExpression =
false);
55 void Print(llvm::raw_ostream &out,
const char *macroName =
"")
const;
58 static TokenSequence Tokenize(
const std::vector<std::string> &argNames,
59 const TokenSequence &token, std::size_t firstToken, std::size_t tokens);
63 std::size_t GetArgumentIndex(
const CharBlock &token)
const;
65 bool isFunctionLike_{
false};
66 bool isVariadic_{
false};
67 bool isDisabled_{
false};
68 bool isPredefined_{
false};
69 std::vector<std::string> argNames_;
78 const AllSources &allSources()
const {
return allSources_; }
79 AllSources &allSources() {
return allSources_; }
81 void DefineStandardMacros();
82 void Define(
const std::string ¯o,
const std::string &value);
83 void Undefine(std::string macro);
85 bool IsNameDefinedEmpty(
const CharBlock &);
86 bool IsFunctionLikeDefinition(
const CharBlock &);
87 bool AnyDefinitions()
const {
return !definitions_.empty(); }
88 bool InConditional()
const {
return !ifStack_.empty(); }
97 std::optional<TokenSequence> MacroReplacement(
const TokenSequence &,
99 std::optional<std::size_t> *partialFunctionLikeMacro =
nullptr,
100 bool inIfExpression =
false);
105 void PrintMacros(llvm::raw_ostream &out)
const;
108 enum class IsElseActive { No, Yes };
109 enum class CanDeadElseAppear { No, Yes };
113 std::optional<std::size_t> *partialFunctionLikeMacro =
nullptr,
114 bool inIfExpression =
false);
115 void SkipDisabledConditionalCode(
116 const std::string &, IsElseActive,
Prescanner &, ProvenanceRange);
117 bool IsIfPredicateTrue(
const TokenSequence &expr, std::size_t first,
123 std::list<std::string> names_;
124 std::unordered_map<CharBlock, Definition> definitions_;
125 std::stack<CanDeadElseAppear> ifStack_;
127 unsigned int counterVal_{0};