NestedNameSpecifier.h revision 6bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89
1b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang//===--- NestedNameSpecifier.h - C++ nested name specifiers -----*- C++ -*-===// 2b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// 3b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// The LLVM Compiler Infrastructure 4b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// 5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// This file is distributed under the University of Illinois Open Source 6b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// License. See LICENSE.TXT for details. 7b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// 8b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang//===----------------------------------------------------------------------===// 9b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// 10b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// This file defines the NestedNameSpecifier class, which represents 11b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// a C++ nested-name-specifier. 12b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// 13b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang//===----------------------------------------------------------------------===// 14b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#ifndef LLVM_CLANG_AST_NESTEDNAMESPECIFIER_H 15b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#define LLVM_CLANG_AST_NESTEDNAMESPECIFIER_H 16b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 17b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "clang/Basic/Diagnostic.h" 18b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "llvm/ADT/FoldingSet.h" 19b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "llvm/ADT/PointerIntPair.h" 20b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "llvm/Support/Compiler.h" 21b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 22b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangnamespace clang { 23b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 24b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangclass ASTContext; 25b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangclass NamespaceAliasDecl; 26b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangclass NamespaceDecl; 27b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangclass IdentifierInfo; 28b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangstruct PrintingPolicy; 29b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangclass Type; 30b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangclass TypeLoc; 31b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangclass LangOptions; 32b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 33b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// \brief Represents a C++ nested name specifier, such as 34b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// "\::std::vector<int>::". 35b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// 36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// C++ nested name specifiers are the prefixes to qualified 37b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// namespaces. For example, "foo::" in "foo::x" is a nested name 38b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// specifier. Nested name specifiers are made up of a sequence of 39b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// specifiers, each of which can be a namespace, type, identifier 40b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// (for dependent names), decltype specifier, or the global specifier ('::'). 41b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// The last two specifiers can only appear at the start of a 42b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// nested-namespace-specifier. 43b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangclass NestedNameSpecifier : public llvm::FoldingSetNode { 44b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 45b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Enumeration describing 46b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang enum StoredSpecifierKind { 47b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang StoredIdentifier = 0, 48b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang StoredNamespaceOrAlias = 1, 49b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang StoredTypeSpec = 2, 50b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang StoredTypeSpecWithTemplate = 3 51b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang }; 52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 53b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief The nested name specifier that precedes this nested name 54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// specifier. 55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 56b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// The pointer is the nested-name-specifier that precedes this 57b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// one. The integer stores one of the first four values of type 58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// SpecifierKind. 59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang llvm::PointerIntPair<NestedNameSpecifier *, 2, StoredSpecifierKind> Prefix; 60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 61b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief The last component in the nested name specifier, which 62b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// can be an identifier, a declaration, or a type. 63b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 64b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// When the pointer is NULL, this specifier represents the global 65b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// specifier '::'. Otherwise, the pointer is one of 66b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// IdentifierInfo*, Namespace*, or Type*, depending on the kind of 67b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// specifier as encoded within the prefix. 68b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void* Specifier; 69b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpublic: 71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief The kind of specifier that completes this nested name 72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// specifier. 73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang enum SpecifierKind { 74b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief An identifier, stored as an IdentifierInfo*. 75b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Identifier, 76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief A namespace, stored as a NamespaceDecl*. 77b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Namespace, 78b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief A namespace alias, stored as a NamespaceAliasDecl*. 79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NamespaceAlias, 80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief A type, stored as a Type*. 81b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang TypeSpec, 82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief A type that was preceded by the 'template' keyword, 83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// stored as a Type*. 84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang TypeSpecWithTemplate, 85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief The global specifier '::'. There is no stored value. 86b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Global 87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang }; 88b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 89b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangprivate: 90b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Builds the global specifier. 91b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifier() 92b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang : Prefix(nullptr, StoredIdentifier), Specifier(nullptr) {} 93b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 94b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Copy constructor used internally to clone nested name 95b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// specifiers. 96b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifier(const NestedNameSpecifier &Other) 97b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang : llvm::FoldingSetNode(Other), Prefix(Other.Prefix), 98b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Specifier(Other.Specifier) { 99b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 100b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 101b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void operator=(const NestedNameSpecifier &) LLVM_DELETED_FUNCTION; 102b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 103b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Either find or insert the given nested name specifier 104b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// mockup in the given context. 105b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang static NestedNameSpecifier *FindOrInsert(const ASTContext &Context, 106b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const NestedNameSpecifier &Mockup); 107b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 108b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpublic: 109b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Builds a specifier combining a prefix and an identifier. 110b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 111b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// The prefix must be dependent, since nested name specifiers 112b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// referencing an identifier are only permitted when the identifier 113b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// cannot be resolved. 114b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang static NestedNameSpecifier *Create(const ASTContext &Context, 115b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifier *Prefix, 116b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang IdentifierInfo *II); 117b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 118b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Builds a nested name specifier that names a namespace. 119b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang static NestedNameSpecifier *Create(const ASTContext &Context, 120b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifier *Prefix, 121b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const NamespaceDecl *NS); 122b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 123b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Builds a nested name specifier that names a namespace alias. 124b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang static NestedNameSpecifier *Create(const ASTContext &Context, 125b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifier *Prefix, 126b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NamespaceAliasDecl *Alias); 127b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 128b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Builds a nested name specifier that names a type. 129b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang static NestedNameSpecifier *Create(const ASTContext &Context, 130b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifier *Prefix, 131b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang bool Template, const Type *T); 132b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 133b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Builds a specifier that consists of just an identifier. 134b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 135b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// The nested-name-specifier is assumed to be dependent, but has no 136b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// prefix because the prefix is implied by something outside of the 137b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested name specifier, e.g., in "x->Base::f", the "x" has a dependent 138b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// type. 139b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang static NestedNameSpecifier *Create(const ASTContext &Context, 140b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang IdentifierInfo *II); 141b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 142b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Returns the nested name specifier representing the global 143b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// scope. 144b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang static NestedNameSpecifier *GlobalSpecifier(const ASTContext &Context); 145b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 146b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Return the prefix of this nested name specifier. 147b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 148b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// The prefix contains all of the parts of the nested name 149b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// specifier that preced this current specifier. For example, for a 150b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested name specifier that represents "foo::bar::", the current 151b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// specifier will contain "bar::" and the prefix will contain 152b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// "foo::". 153b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifier *getPrefix() const { return Prefix.getPointer(); } 154b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 155b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Determine what kind of nested name specifier is stored. 156b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SpecifierKind getKind() const; 157b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 158b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the identifier stored in this nested name 159b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// specifier. 160b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang IdentifierInfo *getAsIdentifier() const { 161b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (Prefix.getInt() == StoredIdentifier) 162b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return (IdentifierInfo *)Specifier; 163b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 164b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return nullptr; 165b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 166b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 167b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the namespace stored in this nested name 168b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// specifier. 169b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NamespaceDecl *getAsNamespace() const; 170b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 171b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the namespace alias stored in this nested name 172b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// specifier. 173b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NamespaceAliasDecl *getAsNamespaceAlias() const; 174b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 175b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the type stored in this nested name specifier. 176b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang const Type *getAsType() const { 177b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (Prefix.getInt() == StoredTypeSpec || 178b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Prefix.getInt() == StoredTypeSpecWithTemplate) 179b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return (const Type *)Specifier; 180b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 181b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return nullptr; 182b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 183b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 184b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Whether this nested name specifier refers to a dependent 185b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// type or not. 186b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang bool isDependent() const; 187b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 188b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Whether this nested name specifier involves a template 189b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// parameter. 190b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang bool isInstantiationDependent() const; 191b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 192b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Whether this nested-name-specifier contains an unexpanded 193b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// parameter pack (for C++11 variadic templates). 194b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang bool containsUnexpandedParameterPack() const; 195b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 196b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Print this nested name specifier to the given output 197b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// stream. 198b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void print(raw_ostream &OS, const PrintingPolicy &Policy) const; 199b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 200b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void Profile(llvm::FoldingSetNodeID &ID) const { 201b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang ID.AddPointer(Prefix.getOpaqueValue()); 202b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang ID.AddPointer(Specifier); 203b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 204b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 205b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Dump the nested name specifier to standard output to aid 206b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// in debugging. 207b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void dump(const LangOptions &LO); 208b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}; 209b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 210b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// \brief A C++ nested-name-specifier augmented with source location 211b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// information. 212b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangclass NestedNameSpecifierLoc { 213b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifier *Qualifier; 214b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void *Data; 215b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 216b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Determines the data length for the last component in the 217b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// given nested-name-specifier. 218b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang static unsigned getLocalDataLength(NestedNameSpecifier *Qualifier); 219b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 220b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Determines the data length for the entire 221b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier. 222b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang static unsigned getDataLength(NestedNameSpecifier *Qualifier); 223b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 224b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpublic: 225b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Construct an empty nested-name-specifier. 226b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifierLoc() : Qualifier(nullptr), Data(nullptr) { } 227b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 228b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Construct a nested-name-specifier with source location information 229b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// from 230b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifierLoc(NestedNameSpecifier *Qualifier, void *Data) 231b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang : Qualifier(Qualifier), Data(Data) { } 232b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 233b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Evalutes true when this nested-name-specifier location is 234b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// non-empty. 235b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang LLVM_EXPLICIT operator bool() const { return Qualifier; } 236b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 237b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Evalutes true when this nested-name-specifier location is 238b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// empty. 239b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang bool hasQualifier() const { return Qualifier; } 240b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 241b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the nested-name-specifier to which this instance 242b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// refers. 243b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifier *getNestedNameSpecifier() const { 244b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return Qualifier; 245b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 246b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 247b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the opaque pointer that refers to source-location data. 248b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void *getOpaqueData() const { return Data; } 249b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 250b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the source range covering the entirety of this 251b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier. 252b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 253b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// For example, if this instance refers to a nested-name-specifier 254b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \c \::std::vector<int>::, the returned source range would cover 255b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// from the initial '::' to the last '::'. 256b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SourceRange getSourceRange() const LLVM_READONLY; 257b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 258b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the source range covering just the last part of 259b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// this nested-name-specifier, not including the prefix. 260b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 261b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// For example, if this instance refers to a nested-name-specifier 262b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \c \::std::vector<int>::, the returned source range would cover 263b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// from "vector" to the last '::'. 264b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SourceRange getLocalSourceRange() const; 265b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 266b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the location of the beginning of this 267b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier. 268b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SourceLocation getBeginLoc() const { 269b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return getSourceRange().getBegin(); 270b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 271b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 272b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the location of the end of this 273b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier. 274b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SourceLocation getEndLoc() const { 275b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return getSourceRange().getEnd(); 276b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 277b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 278b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the location of the beginning of this 279b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// component of the nested-name-specifier. 280b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SourceLocation getLocalBeginLoc() const { 281b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return getLocalSourceRange().getBegin(); 282b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 283b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 284b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the location of the end of this component of the 285b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier. 286b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SourceLocation getLocalEndLoc() const { 287b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return getLocalSourceRange().getEnd(); 288b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 289b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 290b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Return the prefix of this nested-name-specifier. 291b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 292b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// For example, if this instance refers to a nested-name-specifier 293b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \c \::std::vector<int>::, the prefix is \c \::std::. Note that the 294b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// returned prefix may be empty, if this is the first component of 295b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// the nested-name-specifier. 296b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifierLoc getPrefix() const { 297b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (!Qualifier) 298b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return *this; 299b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 300b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return NestedNameSpecifierLoc(Qualifier->getPrefix(), Data); 301b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 302b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 303b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief For a nested-name-specifier that refers to a type, 304b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// retrieve the type with source-location information. 305b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang TypeLoc getTypeLoc() const; 306b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 307b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Determines the data length for the entire 308b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier. 309b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang unsigned getDataLength() const { return getDataLength(Qualifier); } 310b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 311b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang friend bool operator==(NestedNameSpecifierLoc X, 312b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifierLoc Y) { 313b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return X.Qualifier == Y.Qualifier && X.Data == Y.Data; 314b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 315b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 316b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang friend bool operator!=(NestedNameSpecifierLoc X, 317b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifierLoc Y) { 318b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return !(X == Y); 319b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 320b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}; 321b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 322b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// \brief Class that aids in the construction of nested-name-specifiers along 323b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// with source-location information for all of the components of the 324b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// nested-name-specifier. 325b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangclass NestedNameSpecifierLocBuilder { 326b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief The current representation of the nested-name-specifier we're 327b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// building. 328b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifier *Representation; 329b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 330b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Buffer used to store source-location information for the 331b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier. 332b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 333b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// Note that we explicitly manage the buffer (rather than using a 334b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// SmallVector) because \c Declarator expects it to be possible to memcpy() 335b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// a \c CXXScopeSpec, and CXXScopeSpec uses a NestedNameSpecifierLocBuilder. 336b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang char *Buffer; 337b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 338b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief The size of the buffer used to store source-location information 339b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// for the nested-name-specifier. 340b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang unsigned BufferSize; 341b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 342b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief The capacity of the buffer used to store source-location 343b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// information for the nested-name-specifier. 344b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang unsigned BufferCapacity; 345b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 346b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpublic: 347b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifierLocBuilder() 348b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang : Representation(nullptr), Buffer(nullptr), BufferSize(0), 349b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang BufferCapacity(0) {} 350b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 351b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifierLocBuilder(const NestedNameSpecifierLocBuilder &Other); 352b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 353b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifierLocBuilder & 354b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang operator=(const NestedNameSpecifierLocBuilder &Other); 355b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 356b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang ~NestedNameSpecifierLocBuilder() { 357b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (BufferCapacity) 358b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang free(Buffer); 359b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 360b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 361b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the representation of the nested-name-specifier. 362b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifier *getRepresentation() const { return Representation; } 363b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 364b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Extend the current nested-name-specifier by another 365b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier component of the form 'type::'. 366b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 367b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param Context The AST context in which this nested-name-specifier 368b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// resides. 369b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 370b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param TemplateKWLoc The location of the 'template' keyword, if present. 371b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 372b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param TL The TypeLoc that describes the type preceding the '::'. 373b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 374b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param ColonColonLoc The location of the trailing '::'. 375b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void Extend(ASTContext &Context, SourceLocation TemplateKWLoc, TypeLoc TL, 376b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SourceLocation ColonColonLoc); 377b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 378b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Extend the current nested-name-specifier by another 379b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier component of the form 'identifier::'. 380b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 381b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param Context The AST context in which this nested-name-specifier 382b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// resides. 383b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 384b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param Identifier The identifier. 385b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 386b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param IdentifierLoc The location of the identifier. 387b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 388b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param ColonColonLoc The location of the trailing '::'. 389b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void Extend(ASTContext &Context, IdentifierInfo *Identifier, 390b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SourceLocation IdentifierLoc, SourceLocation ColonColonLoc); 391b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 392b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Extend the current nested-name-specifier by another 393b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier component of the form 'namespace::'. 394b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 395b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param Context The AST context in which this nested-name-specifier 396b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// resides. 397b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 398b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param Namespace The namespace. 399b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 400b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param NamespaceLoc The location of the namespace name. 401b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 402b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param ColonColonLoc The location of the trailing '::'. 403b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void Extend(ASTContext &Context, NamespaceDecl *Namespace, 404b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SourceLocation NamespaceLoc, SourceLocation ColonColonLoc); 405b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 406b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Extend the current nested-name-specifier by another 407b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier component of the form 'namespace-alias::'. 408b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 409b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param Context The AST context in which this nested-name-specifier 410b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// resides. 411b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 412b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param Alias The namespace alias. 413b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 414b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param AliasLoc The location of the namespace alias 415b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// name. 416b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 417b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param ColonColonLoc The location of the trailing '::'. 418b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void Extend(ASTContext &Context, NamespaceAliasDecl *Alias, 419b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SourceLocation AliasLoc, SourceLocation ColonColonLoc); 420b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 421b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Turn this (empty) nested-name-specifier into the global 422b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier '::'. 423b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void MakeGlobal(ASTContext &Context, SourceLocation ColonColonLoc); 424b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 425b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Make a new nested-name-specifier from incomplete source-location 426b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// information. 427b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 428b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// This routine should be used very, very rarely, in cases where we 429b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// need to synthesize a nested-name-specifier. Most code should instead use 430b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \c Adopt() with a proper \c NestedNameSpecifierLoc. 431b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void MakeTrivial(ASTContext &Context, NestedNameSpecifier *Qualifier, 432b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SourceRange R); 433b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 434b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Adopt an existing nested-name-specifier (with source-range 435b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// information). 436b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void Adopt(NestedNameSpecifierLoc Other); 437b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 438b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the source range covered by this nested-name-specifier. 439b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang SourceRange getSourceRange() const LLVM_READONLY { 440b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return NestedNameSpecifierLoc(Representation, Buffer).getSourceRange(); 441b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 442b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 443b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve a nested-name-specifier with location information, 444b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// copied into the given AST context. 445b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 446b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \param Context The context into which this nested-name-specifier will be 447b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// copied. 448b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const; 449b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 450b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve a nested-name-specifier with location 451b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// information based on the information in this builder. 452b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 453b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// This loc will contain references to the builder's internal data and may 454b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// be invalidated by any change to the builder. 455b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifierLoc getTemporary() const { 456b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return NestedNameSpecifierLoc(Representation, Buffer); 457b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 458b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 459b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Clear out this builder, and prepare it to build another 460b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// nested-name-specifier with source-location information. 461b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang void Clear() { 462b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Representation = nullptr; 463b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang BufferSize = 0; 464b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 465b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 466b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \brief Retrieve the underlying buffer. 467b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// 468b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// \returns A pair containing a pointer to the buffer of source-location 469b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// data and the size of the source-location data that resides in that 470b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /// buffer. 471b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang std::pair<char *, unsigned> getBuffer() const { 472b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return std::make_pair(Buffer, BufferSize); 473b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 474b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}; 475b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 476b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// Insertion operator for diagnostics. This allows sending 477b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/// NestedNameSpecifiers into a diagnostic with <<. 478b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wanginline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 479b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang NestedNameSpecifier *NNS) { 480b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang DB.AddTaggedVal(reinterpret_cast<intptr_t>(NNS), 481b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang DiagnosticsEngine::ak_nestednamespec); 482b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return DB; 483b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 484b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 485b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 486b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 487b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#endif 488b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang