Skip to content

Commit f7e459a

Browse files
committed
[AST] Factor out GenericSignature::forInvalid
Factor out the common logic from `getPlaceholderGenericSignature`.
1 parent 2d9b88f commit f7e459a

File tree

4 files changed

+25
-31
lines changed

4 files changed

+25
-31
lines changed

include/swift/AST/GenericSignature.h

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

123+
/// Create a new placeholder generic signature from a set of generic
124+
/// parameters. This is necessary for recovery in invalid cases.
125+
static GenericSignature forInvalid(ArrayRef<GenericTypeParamType *> params);
126+
123127
/// Produce a new generic signature which drops all of the marker
124128
/// protocol conformance requirements associated with this one.
125129
GenericSignature withoutMarkerProtocols() const;

lib/AST/ASTContext.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6007,6 +6007,25 @@ GenericSignature::get(ArrayRef<GenericTypeParamType *> params,
60076007
return newSig;
60086008
}
60096009

6010+
GenericSignature
6011+
GenericSignature::forInvalid(ArrayRef<GenericTypeParamType *> params) {
6012+
ASSERT(!params.empty());
6013+
auto &ctx = params.front()->getASTContext();
6014+
6015+
SmallVector<Requirement, 2> requirements;
6016+
for (auto *param : params) {
6017+
if (param->isValue())
6018+
continue;
6019+
6020+
for (auto ip : InvertibleProtocolSet::allKnown()) {
6021+
auto *proto = ctx.getProtocol(getKnownProtocolKind(ip));
6022+
requirements.emplace_back(RequirementKind::Conformance, param,
6023+
proto->getDeclaredInterfaceType());
6024+
}
6025+
}
6026+
return GenericSignature::get(params, requirements);
6027+
}
6028+
60106029
GenericEnvironment *GenericEnvironment::forPrimary(GenericSignature signature) {
60116030
auto &ctx = signature->getASTContext();
60126031

lib/AST/Decl.cpp

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1660,22 +1660,13 @@ static GenericSignature getPlaceholderGenericSignature(
16601660
gpLists[i]->setDepth(i);
16611661

16621662
SmallVector<GenericTypeParamType *, 2> genericParams;
1663-
SmallVector<Requirement, 2> requirements;
1664-
16651663
for (auto *gpList : gpLists) {
16661664
for (auto *genericParam : *gpList) {
16671665
auto type = genericParam->getDeclaredInterfaceType();
16681666
genericParams.push_back(type->castTo<GenericTypeParamType>());
1669-
1670-
for (auto ip : InvertibleProtocolSet::allKnown()) {
1671-
auto proto = ctx.getProtocol(getKnownProtocolKind(ip));
1672-
requirements.emplace_back(RequirementKind::Conformance, type,
1673-
proto->getDeclaredInterfaceType());
1674-
}
16751667
}
16761668
}
1677-
1678-
return GenericSignature::get(genericParams, requirements);
1669+
return GenericSignature::forInvalid(genericParams);
16791670
}
16801671

16811672
GenericSignature GenericContext::getGenericSignature() const {

lib/AST/RequirementMachine/RequirementMachineRequests.cpp

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -750,26 +750,6 @@ AbstractGenericSignatureRequest::evaluate(
750750
}
751751
}
752752

753-
/// If completion fails, build a dummy generic signature where everything is
754-
/// Copyable and Escapable, to avoid spurious downstream diagnostics
755-
/// concerning move-only types.
756-
static GenericSignature getPlaceholderGenericSignature(
757-
ASTContext &ctx, ArrayRef<GenericTypeParamType *> genericParams) {
758-
SmallVector<Requirement, 2> requirements;
759-
for (auto param : genericParams) {
760-
if (param->isValue())
761-
continue;
762-
763-
for (auto ip : InvertibleProtocolSet::allKnown()) {
764-
auto proto = ctx.getProtocol(getKnownProtocolKind(ip));
765-
requirements.emplace_back(RequirementKind::Conformance, param,
766-
proto->getDeclaredInterfaceType());
767-
}
768-
}
769-
770-
return GenericSignature::get(genericParams, requirements);
771-
}
772-
773753
GenericSignatureWithError
774754
InferredGenericSignatureRequest::evaluate(
775755
Evaluator &evaluator,
@@ -996,7 +976,7 @@ InferredGenericSignatureRequest::evaluate(
996976
diag::requirement_machine_completion_rule,
997977
rule);
998978

999-
auto result = getPlaceholderGenericSignature(ctx, genericParams);
979+
auto result = GenericSignature::forInvalid(genericParams);
1000980

1001981
if (rewriteCtx.getDebugOptions().contains(DebugFlags::Timers)) {
1002982
rewriteCtx.endTimer("InferredGenericSignatureRequest");

0 commit comments

Comments
 (0)