//===- MacroInfo.h - Information about #defined identifiers -----*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // /// \file /// Defines the clang::MacroInfo and clang::MacroDirective classes. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_LEX_MACROINFO_H #define LLVM_CLANG_LEX_MACROINFO_H #include "clang/Lex/Token.h" #include "clang/Basic/LLVM.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/Allocator.h" #include <algorithm> #include <cassert> namespace clang { class DefMacroDirective; class IdentifierInfo; class Module; class Preprocessor; class SourceManager; /// Encapsulates the data about a macro definition (e.g. its tokens). /// /// There's an instance of this class for every #define. class MacroInfo { … }; /// Encapsulates changes to the "macros namespace" (the location where /// the macro name became active, the location where it was undefined, etc.). /// /// MacroDirectives, associated with an identifier, are used to model the macro /// history. Usually a macro definition (MacroInfo) is where a macro name /// becomes active (MacroDirective) but #pragma push_macro / pop_macro can /// create additional DefMacroDirectives for the same MacroInfo. class MacroDirective { … }; /// A directive for a defined macro or a macro imported from a module. class DefMacroDirective : public MacroDirective { … }; /// A directive for an undefined macro. class UndefMacroDirective : public MacroDirective { … }; /// A directive for setting the module visibility of a macro. class VisibilityMacroDirective : public MacroDirective { … }; inline SourceLocation MacroDirective::DefInfo::getLocation() const { … } inline MacroInfo *MacroDirective::DefInfo::getMacroInfo() { … } inline MacroDirective::DefInfo MacroDirective::DefInfo::getPreviousDefinition() { … } /// Represents a macro directive exported by a module. /// /// There's an instance of this class for every macro #define or #undef that is /// the final directive for a macro name within a module. These entities also /// represent the macro override graph. /// /// These are stored in a FoldingSet in the preprocessor. class ModuleMacro : public llvm::FoldingSetNode { … }; /// A description of the current definition of a macro. /// /// The definition of a macro comprises a set of (at least one) defining /// entities, which are either local MacroDirectives or imported ModuleMacros. class MacroDefinition { … }; } // namespace clang #endif // LLVM_CLANG_LEX_MACROINFO_H