Skip to content

Commit 2b6379d

Browse files
committed
[AST] GenericSignature: Add a way to drop marker protocol requirements
1 parent c9a0295 commit 2b6379d

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

include/swift/AST/GenericSignature.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ class GenericSignature {
122122
ArrayRef<Requirement> requirements,
123123
bool isKnownCanonical = false);
124124

125+
/// Produce a new generic signature which drops all of the marker
126+
/// protocol conformance requirements associated with this one.
127+
GenericSignature withoutMarkerProtocols() const;
128+
125129
public:
126130
static ASTContext &getASTContext(TypeArrayView<GenericTypeParamType> params,
127131
ArrayRef<Requirement> requirements);

lib/AST/GenericSignature.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,3 +1163,24 @@ swift::buildGenericSignature(ASTContext &ctx,
11631163
addedRequirements},
11641164
GenericSignatureWithError()).getPointer();
11651165
}
1166+
1167+
GenericSignature GenericSignature::withoutMarkerProtocols() const {
1168+
auto requirements = getRequirements();
1169+
SmallVector<Requirement, 4> reducedRequirements;
1170+
1171+
// Drop all conformance requirements to marker protocols (if any).
1172+
llvm::copy_if(requirements, std::back_inserter(reducedRequirements),
1173+
[](const Requirement &requirement) {
1174+
if (requirement.getKind() == RequirementKind::Conformance) {
1175+
auto *protocol = requirement.getProtocolDecl();
1176+
return !protocol->isMarkerProtocol();
1177+
}
1178+
return true;
1179+
});
1180+
1181+
// If nothing changed, let's return this signature back.
1182+
if (requirements.size() == reducedRequirements.size())
1183+
return *this;
1184+
1185+
return GenericSignature::get(getGenericParams(), reducedRequirements);
1186+
}

0 commit comments

Comments
 (0)