//===-- FindAllMacros.h - find all macros -----------------------*- 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
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CLANG_TOOLS_EXTRA_FIND_ALL_SYMBOLS_FIND_ALL_MACROS_H
#define LLVM_CLANG_TOOLS_EXTRA_FIND_ALL_SYMBOLS_FIND_ALL_MACROS_H

#include "SymbolInfo.h"
#include "SymbolReporter.h"
#include "clang/Lex/PPCallbacks.h"

namespace clang {
class MacroInfo;
namespace find_all_symbols {

class HeaderMapCollector;

/// \brief A preprocessor that collects all macro symbols.
/// The contexts of a macro will be ignored since they are not available during
/// preprocessing period.
class FindAllMacros : public clang::PPCallbacks {
public:
  explicit FindAllMacros(SymbolReporter *Reporter, SourceManager *SM,
                         HeaderMapCollector *Collector = nullptr)
      : Reporter(Reporter), SM(SM), Collector(Collector) {}

  void MacroDefined(const Token &MacroNameTok,
                    const MacroDirective *MD) override;

  void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD,
                    SourceRange Range, const MacroArgs *Args) override;

  void Ifdef(SourceLocation Loc, const Token &MacroNameTok,
             const MacroDefinition &MD) override;

  void Ifndef(SourceLocation Loc, const Token &MacroNameTok,
              const MacroDefinition &MD) override;

  void EndOfMainFile() override;

private:
  llvm::Optional<SymbolInfo> CreateMacroSymbol(const Token &MacroNameTok,
                                               const MacroInfo *MD);
  // Not a callback, just a common path for all usage types.
  void MacroUsed(const Token &Name, const MacroDefinition &MD);

  SymbolInfo::SignalMap FileSymbols;
  // Reporter for SymbolInfo.
  SymbolReporter *const Reporter;
  SourceManager *const SM;
  // A remapping header file collector allowing clients to include a different
  // header.
  HeaderMapCollector *const Collector;
};

} // namespace find_all_symbols
} // namespace clang

#endif // LLVM_CLANG_TOOLS_EXTRA_FIND_ALL_SYMBOLS_FIND_ALL_MACROS_H
