//===--- USRFinder.h - Clang refactoring library --------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// \file /// \brief Methods for determining the USR of a symbol at a location in source /// code. /// //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLING_REFACTOR_RENAME_USR_FINDER_H #define LLVM_CLANG_TOOLING_REFACTOR_RENAME_USR_FINDER_H #include "clang/AST/AST.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include #include using namespace llvm; using namespace clang::ast_matchers; namespace clang { class ASTContext; class Decl; class SourceLocation; class NamedDecl; namespace tooling { // Given an AST context and a point, returns a NamedDecl identifying the symbol // at the point. Returns null if nothing is found at the point. const NamedDecl *getNamedDeclAt(const ASTContext &Context, const SourceLocation Point); // Given an AST context and a fully qualified name, returns a NamedDecl // identifying the symbol with a matching name. Returns null if nothing is // found for the name. const NamedDecl *getNamedDeclFor(const ASTContext &Context, const std::string &Name); // Converts a Decl into a USR. std::string getUSRForDecl(const Decl *Decl); // FIXME: Implement RecursiveASTVisitor::VisitNestedNameSpecifier instead. class NestedNameSpecifierLocFinder : public MatchFinder::MatchCallback { public: explicit NestedNameSpecifierLocFinder(ASTContext &Context) : Context(Context) {} std::vector getNestedNameSpecifierLocations() { addMatchers(); Finder.matchAST(Context); return Locations; } private: void addMatchers() { const auto NestedNameSpecifierLocMatcher = nestedNameSpecifierLoc().bind("nestedNameSpecifierLoc"); Finder.addMatcher(NestedNameSpecifierLocMatcher, this); } void run(const MatchFinder::MatchResult &Result) override { const auto *NNS = Result.Nodes.getNodeAs( "nestedNameSpecifierLoc"); Locations.push_back(*NNS); } ASTContext &Context; std::vector Locations; MatchFinder Finder; }; } // end namespace tooling } // end namespace clang #endif // LLVM_CLANG_TOOLING_REFACTOR_RENAME_USR_FINDER_H