Skip to content

Commit 44273cb

Browse files
authored
Merge pull request #36196 from slavapestov/gsb-requirement-source-cleanup
GSB: Clean up RequirementSources in preparation for new redundant requirements algorithm
2 parents 748fe46 + 3a93a17 commit 44273cb

File tree

2 files changed

+52
-90
lines changed

2 files changed

+52
-90
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class GenericSignatureBuilder {
9595
llvm::PointerUnion<Type, PotentialArchetype *, LayoutConstraint>;
9696

9797
using RequirementRHS =
98-
llvm::PointerUnion<Type, LayoutConstraint>;
98+
llvm::PointerUnion<Type, ProtocolDecl *, LayoutConstraint>;
9999

100100
/// The location of a requirement as written somewhere in the source.
101101
typedef llvm::PointerUnion<const TypeRepr *, const RequirementRepr *>
@@ -848,12 +848,6 @@ class GenericSignatureBuilder::RequirementSource final
848848
/// This is a root requirement source.
849849
NestedTypeNameMatch,
850850

851-
/// The requirement is the implicit binding of a type to
852-
/// the interface type of the concrete type declaration it represents.
853-
///
854-
/// This is a root requirement source.
855-
ConcreteTypeBinding,
856-
857851
/// The requirement is a protocol requirement.
858852
///
859853
/// This stores the protocol that introduced the requirement as well as the
@@ -886,9 +880,12 @@ class GenericSignatureBuilder::RequirementSource final
886880
/// requirement.
887881
Concrete,
888882

889-
/// A requirement that was resolved based on structural derivation from
890-
/// another requirement.
891-
Derived,
883+
/// A requirement that was resolved based on a layout requirement
884+
/// imposed by a superclass constraint.
885+
///
886+
/// This stores the \c LayoutConstraint used to resolve the
887+
/// requirement.
888+
Layout,
892889

893890
/// A requirement that was provided for another type in the
894891
/// same equivalence class, but which we want to "re-root" on a new
@@ -940,11 +937,10 @@ class GenericSignatureBuilder::RequirementSource final
940937
case Explicit:
941938
case Inferred:
942939
case NestedTypeNameMatch:
943-
case ConcreteTypeBinding:
944940
case Superclass:
945941
case Parent:
946942
case Concrete:
947-
case Derived:
943+
case Layout:
948944
case EquivalentType:
949945
return 0;
950946
}
@@ -981,15 +977,14 @@ class GenericSignatureBuilder::RequirementSource final
981977
case Inferred:
982978
case RequirementSignatureSelf:
983979
case NestedTypeNameMatch:
984-
case ConcreteTypeBinding:
985980
return true;
986981

987982
case ProtocolRequirement:
988983
case InferredProtocolRequirement:
989984
case Superclass:
990985
case Parent:
991986
case Concrete:
992-
case Derived:
987+
case Layout:
993988
case EquivalentType:
994989
return false;
995990
}
@@ -1112,12 +1107,6 @@ class GenericSignatureBuilder::RequirementSource final
11121107
GenericSignatureBuilder &builder,
11131108
Type rootType);
11141109

1115-
/// Retrieve a requirement source describing when a concrete type
1116-
/// declaration is used to define a potential archetype.
1117-
static const RequirementSource *forConcreteTypeBinding(
1118-
GenericSignatureBuilder &builder,
1119-
Type rootType);
1120-
11211110
private:
11221111
/// A requirement source that describes that a requirement comes from a
11231112
/// requirement of the given protocol described by the parent.
@@ -1141,17 +1130,18 @@ class GenericSignatureBuilder::RequirementSource final
11411130
GenericSignatureBuilder &builder,
11421131
ProtocolConformanceRef conformance) const;
11431132

1133+
/// A constraint source that describes a layout constraint that was implied
1134+
/// by a superclass requirement.
1135+
const RequirementSource *viaLayout(GenericSignatureBuilder &builder,
1136+
Type superclass) const;
1137+
11441138
/// A constraint source that describes that a constraint that is resolved
11451139
/// for a nested type via a constraint on its parent.
11461140
///
11471141
/// \param assocType the associated type that
11481142
const RequirementSource *viaParent(GenericSignatureBuilder &builder,
11491143
AssociatedTypeDecl *assocType) const;
11501144

1151-
/// A constraint source that describes a constraint that is structurally
1152-
/// derived from another constraint but does not require further information.
1153-
const RequirementSource *viaDerived(GenericSignatureBuilder &builder) const;
1154-
11551145
/// A constraint source that describes a constraint that is structurally
11561146
/// derived from another constraint but does not require further information.
11571147
const RequirementSource *viaEquivalentType(GenericSignatureBuilder &builder,

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 38 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -553,8 +553,8 @@ bool RequirementSource::isAcceptableStorageKind(Kind kind,
553553
case Inferred:
554554
case RequirementSignatureSelf:
555555
case NestedTypeNameMatch:
556-
case ConcreteTypeBinding:
557556
case EquivalentType:
557+
case Layout:
558558
switch (storageKind) {
559559
case StorageKind::StoredType:
560560
return true;
@@ -599,17 +599,6 @@ bool RequirementSource::isAcceptableStorageKind(Kind kind,
599599
case StorageKind::None:
600600
return false;
601601
}
602-
603-
case Derived:
604-
switch (storageKind) {
605-
case StorageKind::None:
606-
return true;
607-
608-
case StorageKind::StoredType:
609-
case StorageKind::ProtocolConformance:
610-
case StorageKind::AssociatedTypeDecl:
611-
return false;
612-
}
613602
}
614603

615604
llvm_unreachable("Unhandled RequirementSourceKind in switch.");
@@ -659,7 +648,6 @@ bool RequirementSource::isInferredRequirement() const {
659648
case NestedTypeNameMatch:
660649
return true;
661650

662-
case ConcreteTypeBinding:
663651
case EquivalentType:
664652
return false;
665653

@@ -669,7 +657,7 @@ bool RequirementSource::isInferredRequirement() const {
669657
case ProtocolRequirement:
670658
case RequirementSignatureSelf:
671659
case Superclass:
672-
case Derived:
660+
case Layout:
673661
break;
674662
}
675663
}
@@ -690,12 +678,11 @@ bool RequirementSource::isDerivedRequirement() const {
690678
return false;
691679

692680
case NestedTypeNameMatch:
693-
case ConcreteTypeBinding:
694681
case Parent:
695682
case Superclass:
696683
case Concrete:
697684
case RequirementSignatureSelf:
698-
case Derived:
685+
case Layout:
699686
case EquivalentType:
700687
return true;
701688

@@ -879,7 +866,7 @@ const RequirementSource *RequirementSource::getMinimalConformanceSource(
879866

880867
case Concrete:
881868
case Superclass:
882-
case Derived:
869+
case Layout:
883870
case EquivalentType:
884871
return false;
885872

@@ -892,7 +879,6 @@ const RequirementSource *RequirementSource::getMinimalConformanceSource(
892879
case Explicit:
893880
case Inferred:
894881
case NestedTypeNameMatch:
895-
case ConcreteTypeBinding:
896882
rootType = parentType;
897883
return false;
898884
}
@@ -1018,17 +1004,6 @@ const RequirementSource *RequirementSource::forNestedTypeNameMatch(
10181004
0, WrittenRequirementLoc());
10191005
}
10201006

1021-
const RequirementSource *RequirementSource::forConcreteTypeBinding(
1022-
GenericSignatureBuilder &builder,
1023-
Type rootType) {
1024-
REQUIREMENT_SOURCE_FACTORY_BODY(
1025-
(nodeID, ConcreteTypeBinding, nullptr,
1026-
rootType.getPointer(), nullptr, nullptr),
1027-
(ConcreteTypeBinding, rootType, nullptr,
1028-
WrittenRequirementLoc()),
1029-
0, WrittenRequirementLoc());
1030-
}
1031-
10321007
const RequirementSource *RequirementSource::viaProtocolRequirement(
10331008
GenericSignatureBuilder &builder, Type dependentType,
10341009
ProtocolDecl *protocol,
@@ -1077,11 +1052,13 @@ const RequirementSource *RequirementSource::viaParent(
10771052
0, WrittenRequirementLoc());
10781053
}
10791054

1080-
const RequirementSource *RequirementSource::viaDerived(
1081-
GenericSignatureBuilder &builder) const {
1055+
const RequirementSource *RequirementSource::viaLayout(
1056+
GenericSignatureBuilder &builder,
1057+
Type superclass) const {
10821058
REQUIREMENT_SOURCE_FACTORY_BODY(
1083-
(nodeID, Derived, this, nullptr, nullptr, nullptr),
1084-
(Derived, this),
1059+
(nodeID, Layout, this, superclass.getPointer(),
1060+
nullptr, nullptr),
1061+
(Layout, this, superclass),
10851062
0, WrittenRequirementLoc());
10861063
}
10871064

@@ -1123,7 +1100,6 @@ const RequirementSource *RequirementSource::withoutRedundantSubpath(
11231100
case Inferred:
11241101
case RequirementSignatureSelf:
11251102
case NestedTypeNameMatch:
1126-
case ConcreteTypeBinding:
11271103
llvm_unreachable("Subpath end doesn't occur within path");
11281104

11291105
case ProtocolRequirement:
@@ -1142,9 +1118,9 @@ const RequirementSource *RequirementSource::withoutRedundantSubpath(
11421118
return parent->withoutRedundantSubpath(builder, start, end)
11431119
->viaConcrete(builder, getProtocolConformance());
11441120

1145-
case Derived:
1121+
case Layout:
11461122
return parent->withoutRedundantSubpath(builder, start, end)
1147-
->viaDerived(builder);
1123+
->viaLayout(builder, getStoredType());
11481124

11491125
case EquivalentType:
11501126
return parent->withoutRedundantSubpath(builder, start, end)
@@ -1199,7 +1175,6 @@ RequirementSource::visitPotentialArchetypesAlongPath(
11991175
}
12001176

12011177
case RequirementSource::NestedTypeNameMatch:
1202-
case RequirementSource::ConcreteTypeBinding:
12031178
case RequirementSource::Explicit:
12041179
case RequirementSource::Inferred:
12051180
case RequirementSource::RequirementSignatureSelf: {
@@ -1211,7 +1186,7 @@ RequirementSource::visitPotentialArchetypesAlongPath(
12111186

12121187
case RequirementSource::Concrete:
12131188
case RequirementSource::Superclass:
1214-
case RequirementSource::Derived:
1189+
case RequirementSource::Layout:
12151190
return parent->visitPotentialArchetypesAlongPath(visitor);
12161191

12171192
case RequirementSource::EquivalentType: {
@@ -1368,10 +1343,6 @@ void RequirementSource::print(llvm::raw_ostream &out,
13681343
out << "Nested type match";
13691344
break;
13701345

1371-
case RequirementSource::ConcreteTypeBinding:
1372-
out << "Concrete type binding";
1373-
break;
1374-
13751346
case Parent:
13761347
out << "Parent";
13771348
break;
@@ -1392,8 +1363,8 @@ void RequirementSource::print(llvm::raw_ostream &out,
13921363
out << "Superclass";
13931364
break;
13941365

1395-
case Derived:
1396-
out << "Derived";
1366+
case Layout:
1367+
out << "Layout";
13971368
break;
13981369

13991370
case EquivalentType:
@@ -1561,12 +1532,11 @@ bool FloatingRequirementSource::isExplicit() const {
15611532
case RequirementSource::Explicit:
15621533
case RequirementSource::Inferred:
15631534
case RequirementSource::NestedTypeNameMatch:
1564-
case RequirementSource::ConcreteTypeBinding:
15651535
case RequirementSource::Parent:
15661536
case RequirementSource::ProtocolRequirement:
15671537
case RequirementSource::InferredProtocolRequirement:
15681538
case RequirementSource::Superclass:
1569-
case RequirementSource::Derived:
1539+
case RequirementSource::Layout:
15701540
case RequirementSource::EquivalentType:
15711541
return false;
15721542
}
@@ -1585,10 +1555,9 @@ bool FloatingRequirementSource::isExplicit() const {
15851555
case RequirementSource::RequirementSignatureSelf:
15861556
case RequirementSource::Concrete:
15871557
case RequirementSource::NestedTypeNameMatch:
1588-
case RequirementSource::ConcreteTypeBinding:
15891558
case RequirementSource::Parent:
15901559
case RequirementSource::Superclass:
1591-
case RequirementSource::Derived:
1560+
case RequirementSource::Layout:
15921561
case RequirementSource::EquivalentType:
15931562
return false;
15941563
}
@@ -4278,14 +4247,15 @@ bool GenericSignatureBuilder::updateSuperclass(
42784247
// Presence of a superclass constraint implies a _Class layout
42794248
// constraint.
42804249
auto layoutReqSource =
4281-
source.getSource(*this, type)->viaDerived(*this);
4282-
addLayoutRequirementDirect(type,
4283-
LayoutConstraint::getLayoutConstraint(
4284-
superclass->getClassOrBoundGenericClass()->isObjC()
4285-
? LayoutConstraintKind::Class
4286-
: LayoutConstraintKind::NativeClass,
4287-
getASTContext()),
4288-
layoutReqSource);
4250+
source.getSource(*this, type)->viaLayout(*this, superclass);
4251+
4252+
auto layout =
4253+
LayoutConstraint::getLayoutConstraint(
4254+
superclass->getClassOrBoundGenericClass()->isObjC()
4255+
? LayoutConstraintKind::Class
4256+
: LayoutConstraintKind::NativeClass,
4257+
getASTContext());
4258+
addLayoutRequirementDirect(type, layout, layoutReqSource);
42894259
return true;
42904260
}
42914261

@@ -6926,26 +6896,29 @@ void GenericSignatureBuilder::enumerateRequirements(
69266896
SmallVectorImpl<Requirement> &requirements) {
69276897
auto recordRequirement = [&](RequirementKind kind,
69286898
Type depTy,
6929-
RequirementRHS type) {
6899+
RequirementRHS rhs) {
69306900
depTy = getSugaredDependentType(depTy, genericParams);
69316901

6932-
if (auto concreteTy = type.dyn_cast<Type>()) {
6933-
if (concreteTy->hasError())
6902+
if (auto type = rhs.dyn_cast<Type>()) {
6903+
if (type->hasError())
69346904
return;
69356905

69366906
// Drop requirements involving concrete types containing
69376907
// unresolved associated types.
6938-
if (concreteTy->findUnresolvedDependentMemberType()) {
6908+
if (type->findUnresolvedDependentMemberType()) {
69396909
assert(Impl->HadAnyError);
69406910
return;
69416911
}
69426912

6943-
if (concreteTy->isTypeParameter())
6944-
concreteTy = getSugaredDependentType(concreteTy, genericParams);
6913+
if (type->isTypeParameter())
6914+
type = getSugaredDependentType(type, genericParams);
69456915

6946-
requirements.push_back(Requirement(kind, depTy, concreteTy));
6916+
requirements.push_back(Requirement(kind, depTy, type));
6917+
} else if (auto *proto = rhs.dyn_cast<ProtocolDecl *>()) {
6918+
auto type = proto->getDeclaredInterfaceType();
6919+
requirements.push_back(Requirement(kind, depTy, type));
69476920
} else {
6948-
auto layoutConstraint = type.get<LayoutConstraint>();
6921+
auto layoutConstraint = rhs.get<LayoutConstraint>();
69496922
requirements.push_back(Requirement(kind, depTy, layoutConstraint));
69506923
return;
69516924
}
@@ -7079,8 +7052,7 @@ void GenericSignatureBuilder::enumerateRequirements(
70797052

70807053
// Enumerate the conformance requirements.
70817054
for (auto proto : protocols) {
7082-
recordRequirement(RequirementKind::Conformance, subjectType,
7083-
proto->getDeclaredInterfaceType());
7055+
recordRequirement(RequirementKind::Conformance, subjectType, proto);
70847056
}
70857057
}
70867058

0 commit comments

Comments
 (0)