Skip to content

Commit bc1717b

Browse files
committed
GSB: Factor out updateLayout() from addLayoutRequirementDirect()
1 parent cb25f2b commit bc1717b

File tree

2 files changed

+31
-17
lines changed

2 files changed

+31
-17
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,15 @@ class GenericSignatureBuilder {
427427
Type superclass,
428428
FloatingRequirementSource source);
429429

430+
/// Update the layout constraint for the equivalence class of \c T.
431+
///
432+
/// This assumes that the constraint has already been recorded.
433+
///
434+
/// \returns true if anything in the equivalence class changed, false
435+
/// otherwise.
436+
bool updateLayout(ResolvedType type,
437+
LayoutConstraint layout);
438+
430439
private:
431440
/// Add a new superclass requirement specifying that the given
432441
/// potential archetype has the given type as an ancestor.

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4555,23 +4555,11 @@ ConstraintResult GenericSignatureBuilder::addLayoutRequirementDirect(
45554555
resolvedSource, layout));
45564556
}
45574557

4558-
auto equivClass = type.getEquivalenceClass(*this);
4559-
45604558
// Update the layout in the equivalence class, if we didn't have one already.
4561-
bool anyChanges = false;
4562-
if (!equivClass->layout) {
4563-
equivClass->layout = layout;
4564-
anyChanges = true;
4565-
} else {
4566-
// Try to merge layout constraints.
4567-
auto mergedLayout = equivClass->layout.merge(layout);
4568-
if (mergedLayout->isKnownLayout() && mergedLayout != equivClass->layout) {
4569-
equivClass->layout = mergedLayout;
4570-
anyChanges = true;
4571-
}
4572-
}
4559+
bool anyChanges = updateLayout(type, layout);
45734560

45744561
// Record this layout constraint.
4562+
auto equivClass = type.getEquivalenceClass(*this);
45754563
equivClass->layoutConstraints.push_back({type.getUnresolvedType(),
45764564
layout, resolvedSource});
45774565
equivClass->modified(*this);
@@ -4685,6 +4673,25 @@ bool GenericSignatureBuilder::updateSuperclass(
46854673
return false;
46864674
}
46874675

4676+
bool GenericSignatureBuilder::updateLayout(ResolvedType type,
4677+
LayoutConstraint layout) {
4678+
auto equivClass = type.getEquivalenceClass(*this);
4679+
4680+
if (!equivClass->layout) {
4681+
equivClass->layout = layout;
4682+
return true;
4683+
}
4684+
4685+
// Try to merge layout constraints.
4686+
auto mergedLayout = equivClass->layout.merge(layout);
4687+
if (mergedLayout->isKnownLayout() && mergedLayout != equivClass->layout) {
4688+
equivClass->layout = mergedLayout;
4689+
return true;
4690+
}
4691+
4692+
return false;
4693+
}
4694+
46884695
ConstraintResult GenericSignatureBuilder::addSuperclassRequirementDirect(
46894696
ResolvedType type,
46904697
Type superclass,
@@ -5020,9 +5027,7 @@ GenericSignatureBuilder::addSameTypeRequirementBetweenTypeParameters(
50205027
equivClass->layout = equivClass2->layout;
50215028
equivClass->layoutConstraints = std::move(equivClass2->layoutConstraints);
50225029
} else {
5023-
const RequirementSource *source2
5024-
= equivClass2->layoutConstraints.front().source;
5025-
addLayoutRequirementDirect(T1, equivClass2->layout, source2);
5030+
updateLayout(T1, equivClass2->layout);
50265031
equivClass->layoutConstraints.insert(
50275032
equivClass->layoutConstraints.end(),
50285033
equivClass2->layoutConstraints.begin() + 1,

0 commit comments

Comments
 (0)