Allow name lookup into generic types.

Swift SVN r2305
This commit is contained in:
Eli Friedman
2012-07-04 02:36:45 +00:00
parent a54c5493da
commit a65b737730

View File

@@ -229,23 +229,28 @@ void MemberLookup::lookupMembers(Type BaseType, Module &M,
assert(Results.empty() &&
"This expects that the input list is empty, could be generalized");
TypeDecl *D;
NominalTypeDecl *D;
ArrayRef<ValueDecl*> BaseMembers;
SmallVector<ValueDecl*, 2> BaseMembersStorage;
if (NominalType *NT = BaseType->getAs<NominalType>()) {
if (BoundGenericType *BGT = BaseType->getAs<BoundGenericType>()) {
D = BGT->getDecl();
} else if (UnboundGenericType *UGT = BaseType->getAs<UnboundGenericType>()) {
D = UGT->getDecl();
} else if (NominalType *NT = BaseType->getAs<NominalType>()) {
D = NT->getDecl();
for (Decl* Member : NT->getDecl()->getMembers()) {
if (ValueDecl *VD = dyn_cast<ValueDecl>(Member))
BaseMembersStorage.push_back(VD);
}
if (NT->getDecl()->getGenericParams())
for (auto param : *NT->getDecl()->getGenericParams())
BaseMembersStorage.push_back(param.getDecl());
BaseMembers = BaseMembersStorage;
} else {
return;
}
for (Decl* Member : D->getMembers()) {
if (ValueDecl *VD = dyn_cast<ValueDecl>(Member))
BaseMembersStorage.push_back(VD);
}
if (D->getGenericParams())
for (auto param : *D->getGenericParams())
BaseMembersStorage.push_back(param.getDecl());
BaseMembers = BaseMembersStorage;
DeclContext *DC = D->getDeclContext();
while (!DC->isModuleContext())
DC = DC->getParent();