mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 15:41:46 +00:00
Add NamedDecl::getUnderlyingDecl that can see through UsingDecl and ObjCCompatibleAliasDecl.
llvm-svn: 74279
This commit is contained in:
parent
1eda63715f
commit
6915bf6158
@ -106,6 +106,13 @@ public:
|
||||
/// \brief Determine whether this declaration has linkage.
|
||||
bool hasLinkage() const;
|
||||
|
||||
/// \brief Looks through UsingDecls and ObjCCompatibleAliasDecls for
|
||||
/// the underlying named decl.
|
||||
NamedDecl *getUnderlyingDecl();
|
||||
const NamedDecl *getUnderlyingDecl() const {
|
||||
return const_cast<NamedDecl*>(this)->getUnderlyingDecl();
|
||||
}
|
||||
|
||||
static bool classof(const Decl *D) {
|
||||
return D->getKind() >= NamedFirst && D->getKind() <= NamedLast;
|
||||
}
|
||||
|
@ -297,6 +297,19 @@ bool NamedDecl::hasLinkage() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
NamedDecl *NamedDecl::getUnderlyingDecl() {
|
||||
NamedDecl *ND = this;
|
||||
while (true) {
|
||||
if (UsingDecl *UD = dyn_cast<UsingDecl>(ND))
|
||||
ND = UD->getTargetDecl();
|
||||
else if (ObjCCompatibleAliasDecl *AD
|
||||
= dyn_cast<ObjCCompatibleAliasDecl>(ND))
|
||||
return AD->getClassInterface();
|
||||
else
|
||||
return ND;
|
||||
}
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// VarDecl Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -139,20 +139,14 @@ MaybeConstructOverloadSet(ASTContext &Context,
|
||||
// nothing to leak.
|
||||
Ovl = OverloadedFunctionDecl::Create(Context, (*I)->getDeclContext(),
|
||||
(*I)->getDeclName());
|
||||
NamedDecl *ND = (*I);
|
||||
if (UsingDecl *UD = dyn_cast<UsingDecl>(ND))
|
||||
ND = UD->getTargetDecl();
|
||||
|
||||
NamedDecl *ND = (*I)->getUnderlyingDecl();
|
||||
if (isa<FunctionDecl>(ND))
|
||||
Ovl->addOverload(cast<FunctionDecl>(ND));
|
||||
else
|
||||
Ovl->addOverload(cast<FunctionTemplateDecl>(ND));
|
||||
}
|
||||
|
||||
NamedDecl *ND = (*Last);
|
||||
if (UsingDecl *UD = dyn_cast<UsingDecl>(ND))
|
||||
ND = UD->getTargetDecl();
|
||||
|
||||
NamedDecl *ND = (*Last)->getUnderlyingDecl();
|
||||
if (isa<FunctionDecl>(ND))
|
||||
Ovl->addOverload(cast<FunctionDecl>(ND));
|
||||
else
|
||||
@ -219,9 +213,7 @@ MergeLookupResults(ASTContext &Context, LookupResultsTy &Results) {
|
||||
break;
|
||||
|
||||
case LResult::Found: {
|
||||
NamedDecl *ND = I->getAsDecl();
|
||||
if (UsingDecl *UD = dyn_cast<UsingDecl>(ND))
|
||||
ND = UD->getTargetDecl();
|
||||
NamedDecl *ND = I->getAsDecl()->getUnderlyingDecl();
|
||||
|
||||
if (TagDecl *TD = dyn_cast<TagDecl>(ND)) {
|
||||
TagFound = Context.getCanonicalDecl(TD);
|
||||
@ -333,11 +325,8 @@ getIdentifierNamespacesFromLookupNameKind(Sema::LookupNameKind NameKind,
|
||||
|
||||
Sema::LookupResult
|
||||
Sema::LookupResult::CreateLookupResult(ASTContext &Context, NamedDecl *D) {
|
||||
if (ObjCCompatibleAliasDecl *Alias
|
||||
= dyn_cast_or_null<ObjCCompatibleAliasDecl>(D))
|
||||
D = Alias->getClassInterface();
|
||||
if (UsingDecl *UD = dyn_cast_or_null<UsingDecl>(D))
|
||||
D = UD->getTargetDecl();
|
||||
if (D)
|
||||
D = D->getUnderlyingDecl();
|
||||
|
||||
LookupResult Result;
|
||||
Result.StoredKind = (D && isa<OverloadedFunctionDecl>(D))?
|
||||
@ -367,12 +356,9 @@ Sema::LookupResult::CreateLookupResult(ASTContext &Context,
|
||||
}
|
||||
}
|
||||
|
||||
Decl *D = *F;
|
||||
if (ObjCCompatibleAliasDecl *Alias
|
||||
= dyn_cast_or_null<ObjCCompatibleAliasDecl>(D))
|
||||
D = Alias->getClassInterface();
|
||||
if (UsingDecl *UD = dyn_cast_or_null<UsingDecl>(D))
|
||||
D = UD->getTargetDecl();
|
||||
NamedDecl *D = *F;
|
||||
if (D)
|
||||
D = D->getUnderlyingDecl();
|
||||
|
||||
Result.StoredKind = SingleDecl;
|
||||
Result.First = reinterpret_cast<uintptr_t>(D);
|
||||
@ -398,13 +384,10 @@ Sema::LookupResult::CreateLookupResult(ASTContext &Context,
|
||||
}
|
||||
}
|
||||
|
||||
Decl *D = *F;
|
||||
if (ObjCCompatibleAliasDecl *Alias
|
||||
= dyn_cast_or_null<ObjCCompatibleAliasDecl>(D))
|
||||
D = Alias->getClassInterface();
|
||||
if (UsingDecl *UD = dyn_cast_or_null<UsingDecl>(D))
|
||||
D = UD->getTargetDecl();
|
||||
|
||||
NamedDecl *D = *F;
|
||||
if (D)
|
||||
D = D->getUnderlyingDecl();
|
||||
|
||||
Result.StoredKind = SingleDecl;
|
||||
Result.First = reinterpret_cast<uintptr_t>(D);
|
||||
Result.Last = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user