@@ -367,30 +367,13 @@ case TypeKind::Id:
367
367
368
368
case TypeKind::OpaqueTypeArchetype: {
369
369
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)
371
373
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
+
394
377
return OpaqueTypeArchetypeType::get (opaque->getDecl (),
395
378
opaque->getInterfaceType (),
396
379
newSubMap);
@@ -999,6 +982,32 @@ case TypeKind::Id:
999
982
1000
983
llvm_unreachable (" Unhandled type in transformation" );
1001
984
}
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
+ }
1002
1011
};
1003
1012
1004
1013
}
0 commit comments