//===--- Lookup.cpp - Framework for clang refactoring tools ---------------===// // // 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 // //===----------------------------------------------------------------------===// // // This file defines helper methods for clang tools performing name lookup. // //===----------------------------------------------------------------------===// #include "clang/Tooling/Refactoring/Lookup.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclarationName.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" #include "llvm/ADT/SmallVector.h" usingnamespaceclang; usingnamespaceclang::tooling; // Gets all namespaces that \p Context is in as a vector (ignoring anonymous // namespaces). The inner namespaces come before outer namespaces in the vector. // For example, if the context is in the following namespace: // `namespace a { namespace b { namespace c ( ... ) } }`, // the vector will be `{c, b, a}`. static llvm::SmallVector<const NamespaceDecl *, 4> getAllNamedNamespaces(const DeclContext *Context) { … } // Returns true if the context in which the type is used and the context in // which the type is declared are the same semantical namespace but different // lexical namespaces. static bool usingFromDifferentCanonicalNamespace(const DeclContext *FromContext, const DeclContext *UseContext) { … } static StringRef getBestNamespaceSubstr(const DeclContext *DeclA, StringRef NewName, bool HadLeadingColonColon) { … } /// Check if the name specifier begins with a written "::". static bool isFullyQualified(const NestedNameSpecifier *NNS) { … } // Adds more scope specifier to the spelled name until the spelling is not // ambiguous. A spelling is ambiguous if the resolution of the symbol is // ambiguous. For example, if QName is "::y::bar", the spelling is "y::bar", and // context contains a nested namespace "a::y", then "y::bar" can be resolved to // ::a::y::bar in the context, which can cause compile error. // FIXME: consider using namespaces. static std::string disambiguateSpellingInScope(StringRef Spelling, StringRef QName, const DeclContext &UseContext, SourceLocation UseLoc) { … } std::string tooling::replaceNestedName(const NestedNameSpecifier *Use, SourceLocation UseLoc, const DeclContext *UseContext, const NamedDecl *FromDecl, StringRef ReplacementString) { … }