Skip to content

Commit 547cdb9

Browse files
committed
AST: Extract TypeTransform::transformSubMap() from TypeTransform::doIt()
1 parent 9315673 commit 547cdb9

File tree

1 file changed

+32
-23
lines changed

1 file changed

+32
-23
lines changed

include/swift/AST/TypeTransform.h

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -367,30 +367,13 @@ case TypeKind::Id:
367367

368368
case TypeKind::OpaqueTypeArchetype: {
369369
auto opaque = cast<OpaqueTypeArchetypeType>(base);
370-
if (opaque->getSubstitutions().empty())
370+
auto subMap = opaque->getSubstitutions();
371+
auto newSubMap = asDerived().transformSubMap(subMap);
372+
if (newSubMap == subMap)
371373
return t;
372-
373-
SmallVector<Type, 4> newSubs;
374-
bool anyChanged = false;
375-
for (auto replacement : opaque->getSubstitutions().getReplacementTypes()) {
376-
Type newReplacement = doIt(replacement, TypePosition::Invariant);
377-
if (!newReplacement)
378-
return Type();
379-
newSubs.push_back(newReplacement);
380-
if (replacement.getPointer() != newReplacement.getPointer())
381-
anyChanged = true;
382-
}
383-
384-
if (!anyChanged)
385-
return t;
386-
387-
// FIXME: This re-looks-up conformances instead of transforming them in
388-
// a systematic way.
389-
auto sig = opaque->getDecl()->getGenericSignature();
390-
auto newSubMap =
391-
SubstitutionMap::get(sig,
392-
QueryReplacementTypeArray{sig, newSubs},
393-
LookUpConformanceInModule());
374+
if (!newSubMap)
375+
return Type();
376+
394377
return OpaqueTypeArchetypeType::get(opaque->getDecl(),
395378
opaque->getInterfaceType(),
396379
newSubMap);
@@ -999,6 +982,32 @@ case TypeKind::Id:
999982

1000983
llvm_unreachable("Unhandled type in transformation");
1001984
}
985+
986+
// If original was non-empty and transformed is empty, we're
987+
// signaling failure, that is, a Type() return from doIt().
988+
SubstitutionMap transformSubMap(SubstitutionMap subs) {
989+
if (subs.empty())
990+
return subs;
991+
992+
SmallVector<Type, 4> newSubs;
993+
bool anyChanged = false;
994+
for (auto replacement : subs.getReplacementTypes()) {
995+
Type newReplacement = doIt(replacement, TypePosition::Invariant);
996+
if (!newReplacement)
997+
return SubstitutionMap();
998+
newSubs.push_back(newReplacement);
999+
if (replacement.getPointer() != newReplacement.getPointer())
1000+
anyChanged = true;
1001+
}
1002+
1003+
if (!anyChanged)
1004+
return subs;
1005+
1006+
auto sig = subs.getGenericSignature();
1007+
return SubstitutionMap::get(sig,
1008+
QueryReplacementTypeArray{sig, newSubs},
1009+
LookUpConformanceInModule());
1010+
}
10021011
};
10031012

10041013
}

0 commit comments

Comments
 (0)