xref: /llvm-project/clang-tools-extra/clang-include-fixer/find-all-symbols/FindAllMacros.h (revision f71ffd3b735b4d6ae3c12be1806cdd6205b3b378)
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