//===-- 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 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