13
13
namespace swift {
14
14
15
15
class GenericSignatureBuilder ::ResolvedType {
16
- llvm::PointerUnion<PotentialArchetype *, Type> type;
17
- EquivalenceClass *equivClass;
16
+ llvm::PointerUnion<PotentialArchetype *, Type, EquivalenceClass *> storage;
18
17
19
18
// / For a type that could not be resolved further unless the given
20
19
// / equivalence class changes.
21
- ResolvedType (EquivalenceClass *equivClass)
22
- : type(), equivClass(equivClass) { }
20
+ ResolvedType (EquivalenceClass *equivClass) : storage(equivClass) { }
23
21
24
- // / A concrete resolved type .
25
- ResolvedType (Type type) : type (type), equivClass( nullptr ) {
22
+ // / A concrete resolved type.
23
+ ResolvedType (Type type) : storage (type) {
26
24
assert (!type->isTypeParameter ());
27
25
}
28
26
29
27
public:
30
28
// / A specific resolved potential archetype.
31
- ResolvedType (PotentialArchetype *pa)
32
- : type(pa), equivClass(nullptr ) { }
33
-
29
+ ResolvedType (PotentialArchetype *pa) : storage(pa) { }
34
30
35
31
// / Return an unresolved result, which could be resolved when we
36
32
// / learn more information about the given equivalence class.
@@ -44,7 +40,9 @@ class GenericSignatureBuilder::ResolvedType {
44
40
}
45
41
46
42
// / 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
+ }
48
46
49
47
// / Retrieve the dependent type.
50
48
Type getDependentType (GenericSignatureBuilder &builder) const ;
@@ -53,51 +51,38 @@ class GenericSignatureBuilder::ResolvedType {
53
51
// / a concrete type.
54
52
Type getAsConcreteType () const {
55
53
assert (*this && " Doesn't contain any result" );
56
- if (equivClass) return Type ();
57
- return type.dyn_cast <Type>();
54
+ return storage.dyn_cast <Type>();
58
55
}
59
56
60
- // / Realize a potential archetype for this type parameter.
61
- PotentialArchetype *realizePotentialArchetype (
62
- GenericSignatureBuilder &builder);
63
-
64
57
// / Retrieve the potential archetype, if already known.
65
58
PotentialArchetype *getPotentialArchetypeIfKnown () const {
66
- return type .dyn_cast <PotentialArchetype *>();
59
+ return storage .dyn_cast <PotentialArchetype *>();
67
60
}
68
61
69
62
// / Retrieve the equivalence class into which a resolved type refers.
70
63
EquivalenceClass *getEquivalenceClass (
71
64
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 *>()
77
66
->getOrCreateEquivalenceClass (builder);
78
67
}
79
68
80
69
// / Retrieve the equivalence class into which a resolved type refers.
81
70
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 ();
87
73
}
88
74
89
75
// / Retrieve the unresolved result.
90
76
EquivalenceClass *getUnresolvedEquivClass () const {
91
- assert (!*this );
92
- return equivClass;
77
+ return storage.dyn_cast <EquivalenceClass *>();
93
78
}
94
79
95
80
// / Return an unresolved type.
96
- // /
97
- // / This loses equivalence-class information that could be useful, which
98
- // / is unfortunate.
99
81
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>();
101
86
}
102
87
};
103
88
0 commit comments