Skip to content

Commit 70b553b

Browse files
committed
AST: Allow ModuleDecl::lookupConformance() to construct PackConformances for PackTypes
1 parent 1edb9a4 commit 70b553b

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

lib/AST/Module.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "swift/AST/ModuleLoader.h"
3333
#include "swift/AST/NameLookup.h"
3434
#include "swift/AST/NameLookupRequests.h"
35+
#include "swift/AST/PackConformance.h"
3536
#include "swift/AST/ParseRequests.h"
3637
#include "swift/AST/PrettyStackTrace.h"
3738
#include "swift/AST/PrintOptions.h"
@@ -1259,6 +1260,33 @@ static ProtocolConformanceRef getBuiltinBuiltinTypeConformance(
12591260
return ProtocolConformanceRef::forMissingOrInvalid(type, protocol);
12601261
}
12611262

1263+
static ProtocolConformanceRef getPackTypeConformance(
1264+
PackType *type, ProtocolDecl *protocol, ModuleDecl *mod) {
1265+
SmallVector<ProtocolConformanceRef, 2> patternConformances;
1266+
1267+
for (auto packElement : type->getElementTypes()) {
1268+
if (auto *packExpansion = packElement->getAs<PackExpansionType>()) {
1269+
auto patternType = packExpansion->getPatternType();
1270+
1271+
auto patternConformance =
1272+
(patternType->isTypeParameter()
1273+
? ProtocolConformanceRef(protocol)
1274+
: mod->lookupConformance(patternType, protocol));
1275+
patternConformances.push_back(patternConformance);
1276+
continue;
1277+
}
1278+
1279+
auto patternConformance =
1280+
(packElement->isTypeParameter()
1281+
? ProtocolConformanceRef(protocol)
1282+
: mod->lookupConformance(packElement, protocol));
1283+
patternConformances.push_back(patternConformance);
1284+
}
1285+
1286+
return ProtocolConformanceRef(
1287+
PackConformance::get(type, protocol, patternConformances));
1288+
}
1289+
12621290
ProtocolConformanceRef
12631291
LookupConformanceInModuleRequest::evaluate(
12641292
Evaluator &evaluator, LookupConformanceDescriptor desc) const {
@@ -1322,6 +1350,11 @@ LookupConformanceInModuleRequest::evaluate(
13221350
if (type->is<UnresolvedType>() || type->is<PlaceholderType>())
13231351
return ProtocolConformanceRef(protocol);
13241352

1353+
// Pack types can conform to protocols.
1354+
if (auto packType = type->getAs<PackType>()) {
1355+
return getPackTypeConformance(packType, protocol, mod);
1356+
}
1357+
13251358
// Tuple types can conform to protocols.
13261359
if (auto tupleType = type->getAs<TupleType>()) {
13271360
return getBuiltinTupleTypeConformance(type, tupleType, protocol, mod);

0 commit comments

Comments
 (0)