Skip to content

Commit e0c1e81

Browse files
committed
Serialization: Redo generic param xrefs to use GenericSignature
This code used GenericParamList::getOuterParameters() and DeclContext::getGenericParamsOfContext(). The meaning of the former is about to change, and the latter is going away.
1 parent 8880038 commit e0c1e81

File tree

1 file changed

+19
-22
lines changed

1 file changed

+19
-22
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,8 +1615,8 @@ ModuleFile::resolveCrossReference(ModuleDecl *baseModule, uint32_t pathLen) {
16151615
pathTrace.addGenericParam(paramIndex);
16161616

16171617
ValueDecl *base = values.front();
1618-
GenericParamList *paramList = nullptr;
16191618

1619+
GenericSignature *currentSig = nullptr;
16201620
if (auto nominal = dyn_cast<NominalTypeDecl>(base)) {
16211621
if (genericSig) {
16221622
// Find an extension in the requested module that has the
@@ -1625,49 +1625,46 @@ ModuleFile::resolveCrossReference(ModuleDecl *baseModule, uint32_t pathLen) {
16251625
if (ext->getModuleContext() == M &&
16261626
ext->getGenericSignature()->getCanonicalSignature()
16271627
== genericSig) {
1628-
paramList = ext->getGenericParams();
1628+
currentSig = ext->getGenericSignature();
16291629
break;
16301630
}
16311631
}
1632-
assert(paramList && "Couldn't find constrained extension");
1632+
assert(currentSig && "Couldn't find constrained extension");
16331633
} else {
16341634
// Simple case: use the nominal type's generic parameters.
1635-
paramList = nominal->getGenericParamsOfContext();
1635+
currentSig = nominal->getGenericSignature();
16361636
}
16371637
} else if (auto alias = dyn_cast<TypeAliasDecl>(base)) {
1638-
paramList = alias->getGenericParams();
1638+
currentSig = alias->getGenericSignature();
16391639
} else if (auto fn = dyn_cast<AbstractFunctionDecl>(base)) {
1640-
paramList = fn->getGenericParams();
1640+
currentSig = fn->getGenericSignature();
16411641
} else if (auto subscript = dyn_cast<SubscriptDecl>(base)) {
1642-
paramList = subscript->getGenericParams();
1642+
currentSig = subscript->getGenericSignature();
16431643
}
16441644

1645-
if (!paramList) {
1645+
if (!currentSig) {
16461646
return llvm::make_error<XRefError>(
16471647
"cross-reference to generic param for non-generic type",
16481648
pathTrace, getXRefDeclNameForError());
16491649
}
16501650

1651-
unsigned currentDepth = paramList->getDepth();
1652-
if (currentDepth < depth) {
1653-
return llvm::make_error<XRefError>(
1654-
"a containing type has been made non-generic",
1655-
pathTrace, getXRefDeclNameForError());
1656-
}
1657-
while (currentDepth > depth) {
1658-
paramList = paramList->getOuterParameters();
1659-
--currentDepth;
1651+
bool found = false;
1652+
for (auto paramTy : currentSig->getGenericParams()) {
1653+
if (paramTy->getIndex() == paramIndex &&
1654+
paramTy->getDepth() == depth) {
1655+
values.clear();
1656+
values.push_back(paramTy->getDecl());
1657+
found = true;
1658+
break;
1659+
}
16601660
}
16611661

1662-
if (paramIndex >= paramList->size()) {
1662+
if (!found) {
16631663
return llvm::make_error<XRefError>(
1664-
"generic argument index out of bounds",
1664+
"invalid generic argument index or depth",
16651665
pathTrace, getXRefDeclNameForError());
16661666
}
16671667

1668-
values.clear();
1669-
values.push_back(paramList->getParams()[paramIndex]);
1670-
assert(values.back());
16711668
break;
16721669
}
16731670

0 commit comments

Comments
 (0)