Skip to content

Commit b76733b

Browse files
committed
GSB: Simplify ResolvedType implementation
We don't need to store the EquivalenceClass anymore.
1 parent c0d981a commit b76733b

File tree

3 files changed

+23
-70
lines changed

3 files changed

+23
-70
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -743,12 +743,6 @@ class GenericSignatureBuilder {
743743
TypeArrayView<GenericTypeParamType> genericParams,
744744
EquivalenceClass *equivClass);
745745

746-
/// Realize a potential archetype for the given type.
747-
///
748-
/// The resolved archetype will be written back into the unresolved type,
749-
/// to make the next resolution more efficient.
750-
PotentialArchetype *realizePotentialArchetype(UnresolvedType &type);
751-
752746
public:
753747
/// Try to resolve the equivalence class of the given type.
754748
///

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2380,20 +2380,9 @@ const RequirementSource *GenericSignatureBuilder::resolveSuperConformance(
23802380
return superclassSource;
23812381
}
23822382

2383-
/// Realize a potential archetype for this type parameter.
2384-
PotentialArchetype *ResolvedType::realizePotentialArchetype(
2385-
GenericSignatureBuilder &builder) {
2386-
// Realize and cache the potential archetype.
2387-
return builder.realizePotentialArchetype(type);
2388-
}
2389-
23902383
Type ResolvedType::getDependentType(GenericSignatureBuilder &builder) const {
2391-
// Already-resolved potential archetype.
2392-
if (auto pa = type.dyn_cast<PotentialArchetype *>())
2393-
return pa->getDependentType(builder.getGenericParams());
2394-
2395-
Type result = type.get<Type>();
2396-
return result->isTypeParameter() ? result : Type();
2384+
return storage.get<PotentialArchetype *>()
2385+
->getDependentType(builder.getGenericParams());
23972386
}
23982387

23992388
auto PotentialArchetype::getOrCreateEquivalenceClass(
@@ -3550,20 +3539,6 @@ static Type resolveDependentMemberTypes(
35503539
});
35513540
}
35523541

3553-
PotentialArchetype *GenericSignatureBuilder::realizePotentialArchetype(
3554-
UnresolvedType &type) {
3555-
if (auto pa = type.dyn_cast<PotentialArchetype *>())
3556-
return pa;
3557-
3558-
auto pa = maybeResolveEquivalenceClass(type.get<Type>(),
3559-
ArchetypeResolutionKind::WellFormed,
3560-
/*wantExactPotentialArchetype=*/true)
3561-
.getPotentialArchetypeIfKnown();
3562-
if (pa) type = pa;
3563-
3564-
return pa;
3565-
}
3566-
35673542
static Type getStructuralType(TypeDecl *typeDecl, bool keepSugar) {
35683543
if (auto typealias = dyn_cast<TypeAliasDecl>(typeDecl)) {
35693544
if (typealias->getUnderlyingTypeRepr() != nullptr) {
@@ -4549,8 +4524,7 @@ GenericSignatureBuilder::addSameTypeRequirementBetweenTypeParameters(
45494524
if (equivClass2) {
45504525
equivClass = equivClass2;
45514526
} else {
4552-
auto pa1 = type1.realizePotentialArchetype(*this);
4553-
equivClass = pa1->getOrCreateEquivalenceClass(*this);
4527+
equivClass = type1.getEquivalenceClass(*this);
45544528
}
45554529
}
45564530

@@ -4562,8 +4536,8 @@ GenericSignatureBuilder::addSameTypeRequirementBetweenTypeParameters(
45624536

45634537
// Both sides are type parameters; equate them.
45644538
// FIXME: Realizes potential archetypes far too early.
4565-
auto OrigT1 = type1.realizePotentialArchetype(*this);
4566-
auto OrigT2 = type2.realizePotentialArchetype(*this);
4539+
auto OrigT1 = type1.getPotentialArchetypeIfKnown();
4540+
auto OrigT2 = type2.getPotentialArchetypeIfKnown();
45674541

45684542
// Operate on the representatives
45694543
auto T1 = OrigT1->getRepresentative();

lib/AST/GenericSignatureBuilderImpl.h

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,20 @@
1313
namespace swift {
1414

1515
class GenericSignatureBuilder::ResolvedType {
16-
llvm::PointerUnion<PotentialArchetype *, Type> type;
17-
EquivalenceClass *equivClass;
16+
llvm::PointerUnion<PotentialArchetype *, Type, EquivalenceClass *> storage;
1817

1918
/// For a type that could not be resolved further unless the given
2019
/// equivalence class changes.
21-
ResolvedType(EquivalenceClass *equivClass)
22-
: type(), equivClass(equivClass) { }
20+
ResolvedType(EquivalenceClass *equivClass) : storage(equivClass) { }
2321

24-
/// A concrete resolved type .
25-
ResolvedType(Type type) : type(type), equivClass(nullptr) {
22+
/// A concrete resolved type.
23+
ResolvedType(Type type) : storage(type) {
2624
assert(!type->isTypeParameter());
2725
}
2826

2927
public:
3028
/// A specific resolved potential archetype.
31-
ResolvedType(PotentialArchetype *pa)
32-
: type(pa), equivClass(nullptr) { }
33-
29+
ResolvedType(PotentialArchetype *pa) : storage(pa) { }
3430

3531
/// Return an unresolved result, which could be resolved when we
3632
/// learn more information about the given equivalence class.
@@ -44,7 +40,9 @@ class GenericSignatureBuilder::ResolvedType {
4440
}
4541

4642
/// Determine whether this result was resolved.
47-
explicit operator bool() const { return !type.isNull(); }
43+
explicit operator bool() const {
44+
return storage.is<PotentialArchetype *>() || storage.is<Type>();
45+
}
4846

4947
/// Retrieve the dependent type.
5048
Type getDependentType(GenericSignatureBuilder &builder) const;
@@ -53,51 +51,38 @@ class GenericSignatureBuilder::ResolvedType {
5351
/// a concrete type.
5452
Type getAsConcreteType() const {
5553
assert(*this && "Doesn't contain any result");
56-
if (equivClass) return Type();
57-
return type.dyn_cast<Type>();
54+
return storage.dyn_cast<Type>();
5855
}
5956

60-
/// Realize a potential archetype for this type parameter.
61-
PotentialArchetype *realizePotentialArchetype(
62-
GenericSignatureBuilder &builder);
63-
6457
/// Retrieve the potential archetype, if already known.
6558
PotentialArchetype *getPotentialArchetypeIfKnown() const {
66-
return type.dyn_cast<PotentialArchetype *>();
59+
return storage.dyn_cast<PotentialArchetype *>();
6760
}
6861

6962
/// Retrieve the equivalence class into which a resolved type refers.
7063
EquivalenceClass *getEquivalenceClass(
7164
GenericSignatureBuilder &builder) const {
72-
assert(*this && "Only for resolved types");
73-
if (equivClass) return equivClass;
74-
75-
// Create the equivalence class now.
76-
return type.get<PotentialArchetype *>()
65+
return storage.get<PotentialArchetype *>()
7766
->getOrCreateEquivalenceClass(builder);
7867
}
7968

8069
/// Retrieve the equivalence class into which a resolved type refers.
8170
EquivalenceClass *getEquivalenceClassIfPresent() const {
82-
assert(*this && "Only for resolved types");
83-
if (equivClass) return equivClass;
84-
85-
// Create the equivalence class now.
86-
return type.get<PotentialArchetype *>()->getEquivalenceClassIfPresent();
71+
return storage.get<PotentialArchetype *>()
72+
->getEquivalenceClassIfPresent();
8773
}
8874

8975
/// Retrieve the unresolved result.
9076
EquivalenceClass *getUnresolvedEquivClass() const {
91-
assert(!*this);
92-
return equivClass;
77+
return storage.dyn_cast<EquivalenceClass *>();
9378
}
9479

9580
/// Return an unresolved type.
96-
///
97-
/// This loses equivalence-class information that could be useful, which
98-
/// is unfortunate.
9981
UnresolvedType getUnresolvedType() const {
100-
return type;
82+
assert(!storage.is<EquivalenceClass *>());
83+
if (storage.is<PotentialArchetype *>())
84+
return storage.get<PotentialArchetype *>();
85+
return storage.get<Type>();
10186
}
10287
};
10388

0 commit comments

Comments
 (0)