Record depth/index of generic parameters.

Another baby step toward a proper canonical form for polymorphic
function types: generic parameters will eventually be uniquable by
their depth and index.


Swift SVN r7380
This commit is contained in:
Doug Gregor
2013-08-20 22:44:00 +00:00
parent 3a8c63eec9
commit e4eaf3fb56
11 changed files with 100 additions and 25 deletions

View File

@@ -1022,18 +1022,8 @@ bool Serializer::writeCrossReference(const Decl *D) {
kind = XRefKind::SwiftValue;
if (auto genericParam = dyn_cast<GenericTypeParamDecl>(D)) {
DeclContext *DC = genericParam->getDeclContext();
auto params = DC->getGenericParamsOfContext()->getParams();
auto iter = std::find_if(params.begin(), params.end(),
[=](const GenericParam &param) {
return param.getAsTypeParam() == genericParam;
});
assert(iter != params.end() && "generic param not in list");
// FIXME: Record the index in the GenericTypeParamDecl.
kind = XRefKind::SwiftGenericParameter;
typeID = std::distance(params.begin(), iter);
typeID = genericParam->getIndex();
}
if (kind == XRefKind::SwiftValue) {
@@ -1232,6 +1222,8 @@ bool Serializer::writeDecl(const Decl *D) {
GenericTypeParamDeclLayout::emitRecord(Out, ScratchRecord, abbrCode,
addIdentifierRef(genericParam->getName()),
addDeclRef(DC),
genericParam->getDepth(),
genericParam->getIndex(),
addTypeRef(genericParam->getSuperclass()),
addTypeRef(genericParam->getArchetype()));