Skip to content

Commit 45dabb1

Browse files
committed
GSB: RequirementSources can just store a SourceLoc instead of a pointer union of TypeRepr/RequirementRepr
1 parent 082b49a commit 45dabb1

File tree

3 files changed

+92
-117
lines changed

3 files changed

+92
-117
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 29 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,6 @@ class GenericSignatureBuilder {
9898
using RequirementRHS =
9999
llvm::PointerUnion<Type, ProtocolDecl *, LayoutConstraint>;
100100

101-
/// The location of a requirement as written somewhere in the source.
102-
typedef llvm::PointerUnion<const TypeRepr *, const RequirementRepr *>
103-
WrittenRequirementLoc;
104-
105101
class RequirementSource;
106102

107103
class FloatingRequirementSource;
@@ -843,7 +839,7 @@ class GenericSignatureBuilder {
843839
class GenericSignatureBuilder::RequirementSource final
844840
: public llvm::FoldingSetNode,
845841
private llvm::TrailingObjects<RequirementSource, ProtocolDecl *,
846-
WrittenRequirementLoc> {
842+
SourceLoc> {
847843

848844
friend class FloatingRequirementSource;
849845
friend class GenericSignature;
@@ -945,7 +941,7 @@ class GenericSignatureBuilder::RequirementSource final
945941
const StorageKind storageKind;
946942

947943
/// Whether there is a trailing written requirement location.
948-
const bool hasTrailingWrittenRequirementLoc;
944+
const bool hasTrailingSourceLoc;
949945

950946
private:
951947
/// The actual storage, described by \c storageKind.
@@ -985,8 +981,8 @@ class GenericSignatureBuilder::RequirementSource final
985981
}
986982

987983
/// The trailing written requirement location, if there is one.
988-
size_t numTrailingObjects(OverloadToken<WrittenRequirementLoc>) const {
989-
return hasTrailingWrittenRequirementLoc ? 1 : 0;
984+
size_t numTrailingObjects(OverloadToken<SourceLoc>) const {
985+
return hasTrailingSourceLoc ? 1 : 0;
990986
}
991987

992988
#ifndef NDEBUG
@@ -1037,25 +1033,25 @@ class GenericSignatureBuilder::RequirementSource final
10371033

10381034
RequirementSource(Kind kind, Type rootType,
10391035
ProtocolDecl *protocol,
1040-
WrittenRequirementLoc writtenReqLoc)
1036+
SourceLoc writtenReqLoc)
10411037
: kind(kind), storageKind(StorageKind::StoredType),
1042-
hasTrailingWrittenRequirementLoc(!writtenReqLoc.isNull()),
1038+
hasTrailingSourceLoc(writtenReqLoc.isValid()),
10431039
parent(nullptr) {
10441040
assert(isAcceptableStorageKind(kind, storageKind) &&
10451041
"RequirementSource kind/storageKind mismatch");
10461042

10471043
storage.type = rootType.getPointer();
10481044
if (kind == RequirementSignatureSelf)
10491045
getTrailingObjects<ProtocolDecl *>()[0] = protocol;
1050-
if (hasTrailingWrittenRequirementLoc)
1051-
getTrailingObjects<WrittenRequirementLoc>()[0] = writtenReqLoc;
1046+
if (hasTrailingSourceLoc)
1047+
getTrailingObjects<SourceLoc>()[0] = writtenReqLoc;
10521048
}
10531049

10541050
RequirementSource(Kind kind, const RequirementSource *parent,
10551051
Type type, ProtocolDecl *protocol,
1056-
WrittenRequirementLoc writtenReqLoc)
1052+
SourceLoc writtenReqLoc)
10571053
: kind(kind), storageKind(StorageKind::StoredType),
1058-
hasTrailingWrittenRequirementLoc(!writtenReqLoc.isNull()),
1054+
hasTrailingSourceLoc(writtenReqLoc.isValid()),
10591055
parent(parent) {
10601056
assert((static_cast<bool>(parent) != isRootKind(kind)) &&
10611057
"Root RequirementSource should not have parent (or vice versa)");
@@ -1065,14 +1061,14 @@ class GenericSignatureBuilder::RequirementSource final
10651061
storage.type = type.getPointer();
10661062
if (isProtocolRequirement())
10671063
getTrailingObjects<ProtocolDecl *>()[0] = protocol;
1068-
if (hasTrailingWrittenRequirementLoc)
1069-
getTrailingObjects<WrittenRequirementLoc>()[0] = writtenReqLoc;
1064+
if (hasTrailingSourceLoc)
1065+
getTrailingObjects<SourceLoc>()[0] = writtenReqLoc;
10701066
}
10711067

10721068
RequirementSource(Kind kind, const RequirementSource *parent,
10731069
ProtocolConformanceRef conformance)
10741070
: kind(kind), storageKind(StorageKind::ProtocolConformance),
1075-
hasTrailingWrittenRequirementLoc(false), parent(parent) {
1071+
hasTrailingSourceLoc(false), parent(parent) {
10761072
assert((static_cast<bool>(parent) != isRootKind(kind)) &&
10771073
"Root RequirementSource should not have parent (or vice versa)");
10781074
assert(isAcceptableStorageKind(kind, storageKind) &&
@@ -1084,7 +1080,7 @@ class GenericSignatureBuilder::RequirementSource final
10841080
RequirementSource(Kind kind, const RequirementSource *parent,
10851081
AssociatedTypeDecl *assocType)
10861082
: kind(kind), storageKind(StorageKind::AssociatedTypeDecl),
1087-
hasTrailingWrittenRequirementLoc(false), parent(parent) {
1083+
hasTrailingSourceLoc(false), parent(parent) {
10881084
assert((static_cast<bool>(parent) != isRootKind(kind)) &&
10891085
"Root RequirementSource should not have parent (or vice versa)");
10901086
assert(isAcceptableStorageKind(kind, storageKind) &&
@@ -1095,7 +1091,7 @@ class GenericSignatureBuilder::RequirementSource final
10951091

10961092
RequirementSource(Kind kind, const RequirementSource *parent)
10971093
: kind(kind), storageKind(StorageKind::None),
1098-
hasTrailingWrittenRequirementLoc(false), parent(parent) {
1094+
hasTrailingSourceLoc(false), parent(parent) {
10991095
assert((static_cast<bool>(parent) != isRootKind(kind)) &&
11001096
"Root RequirementSource should not have parent (or vice versa)");
11011097
assert(isAcceptableStorageKind(kind, storageKind) &&
@@ -1105,7 +1101,7 @@ class GenericSignatureBuilder::RequirementSource final
11051101
RequirementSource(Kind kind, const RequirementSource *parent,
11061102
Type newType)
11071103
: kind(kind), storageKind(StorageKind::StoredType),
1108-
hasTrailingWrittenRequirementLoc(false), parent(parent) {
1104+
hasTrailingSourceLoc(false), parent(parent) {
11091105
assert((static_cast<bool>(parent) != isRootKind(kind)) &&
11101106
"Root RequirementSource should not have parent (or vice versa)");
11111107
assert(isAcceptableStorageKind(kind, storageKind) &&
@@ -1122,14 +1118,14 @@ class GenericSignatureBuilder::RequirementSource final
11221118
/// stated in an 'inheritance' or 'where' clause.
11231119
static const RequirementSource *forExplicit(GenericSignatureBuilder &builder,
11241120
Type rootType,
1125-
WrittenRequirementLoc writtenLoc);
1121+
SourceLoc writtenLoc);
11261122

11271123
/// Retrieve a requirement source representing a requirement that is
11281124
/// inferred from some part of a generic declaration's signature, e.g., the
11291125
/// parameter or result type of a generic function.
11301126
static const RequirementSource *forInferred(GenericSignatureBuilder &builder,
11311127
Type rootType,
1132-
WrittenRequirementLoc writtenLoc);
1128+
SourceLoc writtenLoc);
11331129

11341130
/// Retrieve a requirement source representing the requirement signature
11351131
/// computation for a protocol.
@@ -1151,8 +1147,8 @@ class GenericSignatureBuilder::RequirementSource final
11511147
Type dependentType,
11521148
ProtocolDecl *protocol,
11531149
bool inferred,
1154-
WrittenRequirementLoc writtenLoc =
1155-
WrittenRequirementLoc()) const;
1150+
SourceLoc writtenLoc =
1151+
SourceLoc()) const;
11561152
public:
11571153
/// A requirement source that describes a conformance requirement resolved
11581154
/// via a superclass requirement.
@@ -1285,20 +1281,9 @@ class GenericSignatureBuilder::RequirementSource final
12851281
int compare(const RequirementSource *other) const;
12861282

12871283
/// Retrieve the written requirement location, if there is one.
1288-
WrittenRequirementLoc getWrittenRequirementLoc() const {
1289-
if (!hasTrailingWrittenRequirementLoc) return WrittenRequirementLoc();
1290-
return getTrailingObjects<WrittenRequirementLoc>()[0];
1291-
}
1292-
1293-
/// Retrieve the type representation for this requirement, if there is one.
1294-
const TypeRepr *getTypeRepr() const {
1295-
return getWrittenRequirementLoc().dyn_cast<const TypeRepr *>();
1296-
}
1297-
1298-
/// Retrieve the requirement representation for this requirement, if there is
1299-
/// one.
1300-
const RequirementRepr *getRequirementRepr() const {
1301-
return getWrittenRequirementLoc().dyn_cast<const RequirementRepr *>();
1284+
SourceLoc getSourceLoc() const {
1285+
if (!hasTrailingSourceLoc) return SourceLoc();
1286+
return getTrailingObjects<SourceLoc>()[0];
13021287
}
13031288

13041289
/// Retrieve the type stored in this requirement.
@@ -1371,7 +1356,7 @@ class GenericSignatureBuilder::FloatingRequirementSource {
13711356
} kind;
13721357

13731358
const RequirementSource *source;
1374-
WrittenRequirementLoc loc;
1359+
SourceLoc loc;
13751360

13761361
// Additional storage for an abstract protocol requirement.
13771362
union {
@@ -1391,22 +1376,15 @@ class GenericSignatureBuilder::FloatingRequirementSource {
13911376
return { Explicit, nullptr };
13921377
}
13931378

1394-
static FloatingRequirementSource forExplicit(const TypeRepr *typeRepr) {
1395-
FloatingRequirementSource result{ Explicit, nullptr };
1396-
result.loc = typeRepr;
1397-
return result;
1398-
}
1399-
1400-
static FloatingRequirementSource forExplicit(
1401-
const RequirementRepr *requirementRepr) {
1379+
static FloatingRequirementSource forExplicit(SourceLoc loc) {
14021380
FloatingRequirementSource result{ Explicit, nullptr };
1403-
result.loc = requirementRepr;
1381+
result.loc = loc;
14041382
return result;
14051383
}
14061384

1407-
static FloatingRequirementSource forInferred(const TypeRepr *typeRepr) {
1385+
static FloatingRequirementSource forInferred(SourceLoc loc) {
14081386
FloatingRequirementSource result{ Inferred, nullptr };
1409-
result.loc = typeRepr;
1387+
result.loc = loc;
14101388
return result;
14111389
}
14121390

@@ -1423,7 +1401,7 @@ class GenericSignatureBuilder::FloatingRequirementSource {
14231401
static FloatingRequirementSource viaProtocolRequirement(
14241402
const RequirementSource *base,
14251403
ProtocolDecl *inProtocol,
1426-
WrittenRequirementLoc written,
1404+
SourceLoc written,
14271405
bool inferred) {
14281406
auto kind = (inferred ? InferredProtocolRequirement : ProtocolRequirement);
14291407
FloatingRequirementSource result{ kind, base };

0 commit comments

Comments
 (0)