| //===-- FindAllMacros.cpp - find all macros ---------------------*- C++ -*-===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #include "FindAllMacros.h" | 
 | #include "HeaderMapCollector.h" | 
 | #include "PathConfig.h" | 
 | #include "SymbolInfo.h" | 
 | #include "clang/Basic/IdentifierTable.h" | 
 | #include "clang/Basic/SourceManager.h" | 
 | #include "clang/Lex/MacroInfo.h" | 
 | #include "clang/Lex/Token.h" | 
 | #include "llvm/Support/Path.h" | 
 |  | 
 | namespace clang { | 
 | namespace find_all_symbols { | 
 |  | 
 | llvm::Optional<SymbolInfo> | 
 | FindAllMacros::CreateMacroSymbol(const Token &MacroNameTok, | 
 |                                  const MacroInfo *info) { | 
 |   std::string FilePath = | 
 |       getIncludePath(*SM, info->getDefinitionLoc(), Collector); | 
 |   if (FilePath.empty()) | 
 |     return llvm::None; | 
 |   return SymbolInfo(MacroNameTok.getIdentifierInfo()->getName(), | 
 |                     SymbolInfo::SymbolKind::Macro, FilePath, {}); | 
 | } | 
 |  | 
 | void FindAllMacros::MacroDefined(const Token &MacroNameTok, | 
 |                                  const MacroDirective *MD) { | 
 |   if (auto Symbol = CreateMacroSymbol(MacroNameTok, MD->getMacroInfo())) | 
 |     ++FileSymbols[*Symbol].Seen; | 
 | } | 
 |  | 
 | void FindAllMacros::MacroUsed(const Token &Name, const MacroDefinition &MD) { | 
 |   if (!MD || !SM->isInMainFile(SM->getExpansionLoc(Name.getLocation()))) | 
 |     return; | 
 |   if (auto Symbol = CreateMacroSymbol(Name, MD.getMacroInfo())) | 
 |     ++FileSymbols[*Symbol].Used; | 
 | } | 
 |  | 
 | void FindAllMacros::MacroExpands(const Token &MacroNameTok, | 
 |                                  const MacroDefinition &MD, SourceRange Range, | 
 |                                  const MacroArgs *Args) { | 
 |   MacroUsed(MacroNameTok, MD); | 
 | } | 
 |  | 
 | void FindAllMacros::Ifdef(SourceLocation Loc, const Token &MacroNameTok, | 
 |                           const MacroDefinition &MD) { | 
 |   MacroUsed(MacroNameTok, MD); | 
 | } | 
 |  | 
 | void FindAllMacros::Ifndef(SourceLocation Loc, const Token &MacroNameTok, | 
 |                            const MacroDefinition &MD) { | 
 |   MacroUsed(MacroNameTok, MD); | 
 | } | 
 |  | 
 | void FindAllMacros::EndOfMainFile() { | 
 |   Reporter->reportSymbols(SM->getFileEntryForID(SM->getMainFileID())->getName(), | 
 |                           FileSymbols); | 
 |   FileSymbols.clear(); | 
 | } | 
 |  | 
 | } // namespace find_all_symbols | 
 | } // namespace clang |