Skip to content

Commit b921c8c

Browse files
committed
GSB: Record all explicitly-written requirements as they are added
This will allow us to rebuild the generic signature using the as-written requirements, instead of the previously-minimized signature.
1 parent bed33d8 commit b921c8c

File tree

1 file changed

+35
-1
lines changed

1 file changed

+35
-1
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,12 @@ struct GenericSignatureBuilder::Implementation {
697697
/// Whether there were any errors.
698698
bool HadAnyError = false;
699699

700+
/// All explicit non-same type requirements that were added to the builder.
701+
SmallVector<ExplicitRequirement, 2> ExplicitRequirements;
702+
703+
/// All explicit same-type requirements that were added to the builder.
704+
SmallVector<Requirement, 2> ExplicitSameTypeRequirements;
705+
700706
/// A mapping of redundant explicit requirements to the best root requirement
701707
/// that implies them.
702708
using RedundantRequirementMap =
@@ -4500,6 +4506,11 @@ ConstraintResult GenericSignatureBuilder::addConformanceRequirement(
45004506
FloatingRequirementSource source) {
45014507
auto resolvedSource = source.getSource(*this, type);
45024508

4509+
if (!resolvedSource->isDerivedRequirement()) {
4510+
Impl->ExplicitRequirements.emplace_back(RequirementKind::Conformance,
4511+
resolvedSource, proto);
4512+
}
4513+
45034514
// Add the conformance requirement, bailing out earlier if we've already
45044515
// seen it.
45054516
auto equivClass = type.getEquivalenceClass(*this);
@@ -4515,6 +4526,13 @@ ConstraintResult GenericSignatureBuilder::addLayoutRequirementDirect(
45154526
ResolvedType type,
45164527
LayoutConstraint layout,
45174528
FloatingRequirementSource source) {
4529+
auto resolvedSource = source.getSource(*this, type);
4530+
4531+
if (!resolvedSource->isDerivedRequirement()) {
4532+
Impl->ExplicitRequirements.emplace_back(RequirementKind::Layout,
4533+
resolvedSource, layout);
4534+
}
4535+
45184536
auto equivClass = type.getEquivalenceClass(*this);
45194537

45204538
// Update the layout in the equivalence class, if we didn't have one already.
@@ -4533,7 +4551,7 @@ ConstraintResult GenericSignatureBuilder::addLayoutRequirementDirect(
45334551

45344552
// Record this layout constraint.
45354553
equivClass->layoutConstraints.push_back({type.getUnresolvedType(),
4536-
layout, source.getSource(*this, type)});
4554+
layout, resolvedSource});
45374555
equivClass->modified(*this);
45384556
++NumLayoutConstraints;
45394557
if (!anyChanges) ++NumLayoutConstraintsExtra;
@@ -4651,6 +4669,11 @@ ConstraintResult GenericSignatureBuilder::addSuperclassRequirementDirect(
46514669
FloatingRequirementSource source) {
46524670
auto resolvedSource = source.getSource(*this, type);
46534671

4672+
if (!resolvedSource->isDerivedRequirement()) {
4673+
Impl->ExplicitRequirements.emplace_back(RequirementKind::Superclass,
4674+
resolvedSource, superclass);
4675+
}
4676+
46544677
// Record the constraint.
46554678
auto equivClass = type.getEquivalenceClass(*this);
46564679
equivClass->superclassConstraints.push_back(
@@ -4844,6 +4867,11 @@ GenericSignatureBuilder::addSameTypeRequirementBetweenTypeParameters(
48444867
Type depType1 = type1.getDependentType(*this);
48454868
Type depType2 = type2.getDependentType(*this);
48464869

4870+
if (!source->isDerivedRequirement()) {
4871+
Impl->ExplicitSameTypeRequirements.emplace_back(RequirementKind::SameType,
4872+
depType1, depType2);
4873+
}
4874+
48474875
// Record the same-type constraint, and bail out if it was already known.
48484876
auto equivClass = type1.getEquivalenceClassIfPresent();
48494877
auto equivClass2 = type2.getEquivalenceClassIfPresent();
@@ -5068,6 +5096,12 @@ ConstraintResult GenericSignatureBuilder::addSameTypeRequirementToConcrete(
50685096
ResolvedType type,
50695097
Type concrete,
50705098
const RequirementSource *source) {
5099+
if (!source->isDerivedRequirement()) {
5100+
Impl->ExplicitSameTypeRequirements.emplace_back(RequirementKind::SameType,
5101+
type.getDependentType(*this),
5102+
concrete);
5103+
}
5104+
50715105
auto equivClass = type.getEquivalenceClass(*this);
50725106

50735107
// Record the concrete type and its source.

0 commit comments

Comments
 (0)