clang  3.7.0
PPConditionalDirectiveRecord.h
Go to the documentation of this file.
1 //===--- PPConditionalDirectiveRecord.h - Preprocessing Directives-*- C++ -*-=//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the PPConditionalDirectiveRecord class, which maintains
11 // a record of conditional directive regions.
12 //
13 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_LEX_PPCONDITIONALDIRECTIVERECORD_H
15 #define LLVM_CLANG_LEX_PPCONDITIONALDIRECTIVERECORD_H
16 
18 #include "clang/Lex/PPCallbacks.h"
19 #include "llvm/ADT/SmallVector.h"
20 #include <vector>
21 
22 namespace clang {
23 
24 /// \brief Records preprocessor conditional directive regions and allows
25 /// querying in which region source locations belong to.
27  SourceManager &SourceMgr;
28 
29  SmallVector<SourceLocation, 6> CondDirectiveStack;
30 
31  class CondDirectiveLoc {
32  SourceLocation Loc;
33  SourceLocation RegionLoc;
34 
35  public:
36  CondDirectiveLoc(SourceLocation Loc, SourceLocation RegionLoc)
37  : Loc(Loc), RegionLoc(RegionLoc) {}
38 
39  SourceLocation getLoc() const { return Loc; }
40  SourceLocation getRegionLoc() const { return RegionLoc; }
41 
42  class Comp {
43  SourceManager &SM;
44  public:
45  explicit Comp(SourceManager &SM) : SM(SM) {}
46  bool operator()(const CondDirectiveLoc &LHS,
47  const CondDirectiveLoc &RHS) {
48  return SM.isBeforeInTranslationUnit(LHS.getLoc(), RHS.getLoc());
49  }
50  bool operator()(const CondDirectiveLoc &LHS, SourceLocation RHS) {
51  return SM.isBeforeInTranslationUnit(LHS.getLoc(), RHS);
52  }
53  bool operator()(SourceLocation LHS, const CondDirectiveLoc &RHS) {
54  return SM.isBeforeInTranslationUnit(LHS, RHS.getLoc());
55  }
56  };
57  };
58 
59  typedef std::vector<CondDirectiveLoc> CondDirectiveLocsTy;
60  /// \brief The locations of conditional directives in source order.
61  CondDirectiveLocsTy CondDirectiveLocs;
62 
63  void addCondDirectiveLoc(CondDirectiveLoc DirLoc);
64 
65 public:
66  /// \brief Construct a new preprocessing record.
68 
69  size_t getTotalMemory() const;
70 
71  SourceManager &getSourceManager() const { return SourceMgr; }
72 
73  /// \brief Returns true if the given range intersects with a conditional
74  /// directive. if a \#if/\#endif block is fully contained within the range,
75  /// this function will return false.
77 
78  /// \brief Returns true if the given locations are in different regions,
79  /// separated by conditional directive blocks.
81  SourceLocation RHS) const {
84  }
85 
87 
88 private:
89  void If(SourceLocation Loc, SourceRange ConditionRange,
90  ConditionValueKind ConditionValue) override;
91  void Elif(SourceLocation Loc, SourceRange ConditionRange,
92  ConditionValueKind ConditionValue, SourceLocation IfLoc) override;
93  void Ifdef(SourceLocation Loc, const Token &MacroNameTok,
94  const MacroDefinition &MD) override;
95  void Ifndef(SourceLocation Loc, const Token &MacroNameTok,
96  const MacroDefinition &MD) override;
97  void Else(SourceLocation Loc, SourceLocation IfLoc) override;
98  void Endif(SourceLocation Loc, SourceLocation IfLoc) override;
99 };
100 
101 } // end namespace clang
102 
103 #endif // LLVM_CLANG_LEX_PPCONDITIONALDIRECTIVERECORD_H
PPConditionalDirectiveRecord(SourceManager &SM)
Construct a new preprocessing record.
A description of the current definition of a macro.
Definition: MacroInfo.h:564
bool rangeIntersectsConditionalDirective(SourceRange Range) const
Returns true if the given range intersects with a conditional directive. if a #if/#endif block is ful...
This interface provides a way to observe the actions of the preprocessor as it does its thing...
Definition: PPCallbacks.h:38
SourceManager & SM
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
bool areInDifferentConditionalDirectiveRegion(SourceLocation LHS, SourceLocation RHS) const
Returns true if the given locations are in different regions, separated by conditional directive bloc...
Encodes a location in the source. The SourceManager can decode this to get at the full include stack...
Records preprocessor conditional directive regions and allows querying in which region source locatio...
SourceLocation findConditionalDirectiveRegionLoc(SourceLocation Loc) const
bool operator()(SourceLocation LHS, const CondDirectiveLoc &RHS)
Defines the PPCallbacks interface.
Defines the clang::SourceLocation class and associated facilities.
bool operator()(const CondDirectiveLoc &LHS, const CondDirectiveLoc &RHS)
A trivial tuple used to represent a source range.
This class handles loading and caching of source files into memory.
bool operator()(const CondDirectiveLoc &LHS, SourceLocation RHS)