14 #ifndef LLVM_CLANG_AST_REDECLARABLE_H
15 #define LLVM_CLANG_AST_REDECLARABLE_H
18 #include "llvm/ADT/PointerIntPair.h"
19 #include "llvm/Support/Casting.h"
25 template<
typename decl_type>
41 typedef llvm::PointerUnion<Previous, UninitializedLatest> NotKnownLatest;
43 mutable llvm::PointerUnion<NotKnownLatest, KnownLatest> Next;
50 : Next(NotKnownLatest(&Ctx)) {}
52 : Next(NotKnownLatest(
Previous(D))) {}
55 return Next.is<NotKnownLatest>() &&
58 Next.get<NotKnownLatest>().template is<Previous>();
63 decl_type *
getNext(
const decl_type *D)
const {
64 if (Next.is<NotKnownLatest>()) {
65 NotKnownLatest NKL = Next.get<NotKnownLatest>();
67 return static_cast<decl_type*>(NKL.get<
Previous>());
71 const_cast<decl_type *>(D));
74 return static_cast<decl_type*
>(Next.get<
KnownLatest>().
get(D));
78 assert(
NextIsPrevious() &&
"decl became non-canonical unexpectedly");
83 assert(
NextIsLatest() &&
"decl became canonical unexpectedly");
84 if (Next.is<NotKnownLatest>()) {
85 NotKnownLatest NKL = Next.get<NotKnownLatest>();
98 if (Next.is<NotKnownLatest>())
142 return const_cast<decl_type *
>(
187 : Current(C), Starter(C), PassedFirst(
false) { }
193 assert(Current &&
"Advancing while iterator has reached end");
195 if (Current->isFirstDecl()) {
197 assert(0 &&
"Passed first decl twice, invalid redecl chain!");
205 decl_type *
Next = Current->getNextRedeclaration();
206 Current = (Next != Starter) ? Next :
nullptr;
217 return x.Current == y.Current;
220 return x.Current != y.Current;
229 return redecl_range(redecl_iterator(const_cast<decl_type *>(
230 static_cast<const decl_type *>(
this))),
248 template<
typename decl_type>
256 decl_type *D =
static_cast<decl_type*
>(
this);
257 if (!D->isFromASTFile())
265 const decl_type *D =
static_cast<const decl_type*
>(
this);
266 if (!D->isFromASTFile())
const decl_type * getPreviousDecl() const
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration. If PrevDecl is NULL, set this as the first and only declaration...
decl_type * getNext(const decl_type *D) const
void setPrevious(decl_type *D)
virtual void CompleteRedeclChain(const Decl *D)
Gives the external AST source an opportunity to complete the redeclaration chain for a declaration...
bool isFirstDecl() const
Returns true if this is the first declaration.
static DeclLink LatestDeclLink(const ASTContext &Ctx)
DeclLink(LatestTag, const ASTContext &Ctx)
Provides common interface for the Decls that can be redeclared.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
bool NextIsPrevious() const
redecl_iterator redecls_begin() const
friend bool operator==(redecl_iterator x, redecl_iterator y)
const decl_type * getFirstDecl() const
Return the first declaration of this declaration or itself if this is the only declaration.
DeclLink(PreviousTag, decl_type *D)
decl_type * getNextRedeclaration() const
DeclLink RedeclLink
Points to the next redeclaration in the chain.
reference operator*() const
pointer operator->() const
bool NextIsLatest() const
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
llvm::iterator_range< redecl_iterator > redecl_range
redecl_iterator operator++(int)
Iterates through all the redeclarations of the same decl.
const decl_type * getFirstDecl() const
Return the first declaration of this declaration or itself if this is the only declaration.
static DeclLink PreviousDeclLink(decl_type *D)
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
Decl * getPrimaryMergedDecl(Decl *D)
Get the primary declaration for a declaration from an AST file. That will be the first-loaded declara...
std::ptrdiff_t difference_type
redecl_iterator & operator++()
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl. It will iterate at least once ...
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Redeclarable(const ASTContext &Ctx)
std::forward_iterator_tag iterator_category
redecl_iterator redecls_end() const
const decl_type * getMostRecentDecl() const
Returns the most recent (re)declaration of this declaration.
void set(T NewValue)
Set the value of this pointer, in the current generation.
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
friend bool operator!=(redecl_iterator x, redecl_iterator y)
void setLatest(decl_type *D)
static __inline__ uint32_t uint32_t y
__PTRDIFF_TYPE__ ptrdiff_t
redecl_iterator(decl_type *C)
Decl * getLatestNotUpdated() const
decl_type * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
A lazy value (of type T) that is within an AST node of type Owner, where the value might change in la...