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