Make DynamicSelf into its own special type node.

Making DynamicSelf its own special type node makes it easier to opt-in
to the behavior we want rather than opting out of the behavior we
don't want. Some things already work better with this representation,
such as mangling and overriding; others are more broken, such as the
handling of DynamicSelf within generic classes and the lookup of the
DynamicSelf type.


Swift SVN r13141
This commit is contained in:
Doug Gregor
2014-01-30 05:36:20 +00:00
parent 68290c72e3
commit 030770a8c2
26 changed files with 247 additions and 107 deletions

View File

@@ -918,6 +918,18 @@ ConstraintSystem::getTypeOfMemberReference(Type baseTy, ValueDecl *value,
}
}
// If this is a method whose result type is DynamicSelf, replace
// DynamicSelf with the actual object type.
if (auto func = dyn_cast<FuncDecl>(value)) {
if (func->hasDynamicSelf()) {
openedType = openedType.transform([&](Type type) {
if (type->is<DynamicSelfType>())
return baseObjTy;
return type;
});
}
}
// Constrain the 'self' object type.
auto openedFnType = openedType->castTo<FunctionType>();
Type selfObjTy = openedFnType->getInput()->getRValueInstanceType();