143356f56SNico Weber //===-- FindAllMacros.h - find all macros -----------------------*- C++ -*-===// 243356f56SNico Weber // 343356f56SNico Weber // 443356f56SNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 543356f56SNico Weber // See https://llvm.org/LICENSE.txt for license information. 643356f56SNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 743356f56SNico Weber // 843356f56SNico Weber //===----------------------------------------------------------------------===// 943356f56SNico Weber 1043356f56SNico Weber #ifndef LLVM_CLANG_TOOLS_EXTRA_FIND_ALL_SYMBOLS_FIND_ALL_MACROS_H 1143356f56SNico Weber #define LLVM_CLANG_TOOLS_EXTRA_FIND_ALL_SYMBOLS_FIND_ALL_MACROS_H 1243356f56SNico Weber 1343356f56SNico Weber #include "SymbolInfo.h" 1443356f56SNico Weber #include "SymbolReporter.h" 1543356f56SNico Weber #include "clang/Lex/PPCallbacks.h" 1671f55735SKazu Hirata #include <optional> 1743356f56SNico Weber 1843356f56SNico Weber namespace clang { 1943356f56SNico Weber class MacroInfo; 2043356f56SNico Weber namespace find_all_symbols { 2143356f56SNico Weber 2243356f56SNico Weber class HeaderMapCollector; 2343356f56SNico Weber 24282dc72cSDmitri Gribenko /// A preprocessor that collects all macro symbols. 2543356f56SNico Weber /// The contexts of a macro will be ignored since they are not available during 2643356f56SNico Weber /// preprocessing period. 2743356f56SNico Weber class FindAllMacros : public clang::PPCallbacks { 2843356f56SNico Weber public: 2943356f56SNico Weber explicit FindAllMacros(SymbolReporter *Reporter, SourceManager *SM, 3043356f56SNico Weber HeaderMapCollector *Collector = nullptr) Reporter(Reporter)3143356f56SNico Weber : Reporter(Reporter), SM(SM), Collector(Collector) {} 3243356f56SNico Weber 3343356f56SNico Weber void MacroDefined(const Token &MacroNameTok, 3443356f56SNico Weber const MacroDirective *MD) override; 3543356f56SNico Weber 3643356f56SNico Weber void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD, 3743356f56SNico Weber SourceRange Range, const MacroArgs *Args) override; 3843356f56SNico Weber 3943356f56SNico Weber void Ifdef(SourceLocation Loc, const Token &MacroNameTok, 4043356f56SNico Weber const MacroDefinition &MD) override; 4143356f56SNico Weber 4243356f56SNico Weber void Ifndef(SourceLocation Loc, const Token &MacroNameTok, 4343356f56SNico Weber const MacroDefinition &MD) override; 4443356f56SNico Weber 4543356f56SNico Weber void EndOfMainFile() override; 4643356f56SNico Weber 4743356f56SNico Weber private: 48*f71ffd3bSKazu Hirata std::optional<SymbolInfo> CreateMacroSymbol(const Token &MacroNameTok, 4943356f56SNico Weber const MacroInfo *MD); 5043356f56SNico Weber // Not a callback, just a common path for all usage types. 5143356f56SNico Weber void MacroUsed(const Token &Name, const MacroDefinition &MD); 5243356f56SNico Weber 5343356f56SNico Weber SymbolInfo::SignalMap FileSymbols; 5443356f56SNico Weber // Reporter for SymbolInfo. 5543356f56SNico Weber SymbolReporter *const Reporter; 5643356f56SNico Weber SourceManager *const SM; 5743356f56SNico Weber // A remapping header file collector allowing clients to include a different 5843356f56SNico Weber // header. 5943356f56SNico Weber HeaderMapCollector *const Collector; 6043356f56SNico Weber }; 6143356f56SNico Weber 6243356f56SNico Weber } // namespace find_all_symbols 6343356f56SNico Weber } // namespace clang 6443356f56SNico Weber 6543356f56SNico Weber #endif // LLVM_CLANG_TOOLS_EXTRA_FIND_ALL_SYMBOLS_FIND_ALL_MACROS_H 66