forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGenericSignatureBuilderImpl.h
107 lines (85 loc) · 3.37 KB
/
GenericSignatureBuilderImpl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//
// GenericSignatureBuilderImpl.h
// Swift
//
// Created by Doug Gregor on 12/17/18.
//
#ifndef SWIFT_AST_GENERIC_SIGNATURE_BUILDER_IMPL_H
#define SWIFT_AST_GENERIC_SIGNATURE_BUILDER_IMPL_H
#include "swift/AST/GenericSignatureBuilder.h"
namespace swift {
class GenericSignatureBuilder::ResolvedType {
llvm::PointerUnion<PotentialArchetype *, Type> type;
EquivalenceClass *equivClass;
/// For a type that could not be resolved further unless the given
/// equivalence class changes.
ResolvedType(EquivalenceClass *equivClass)
: type(), equivClass(equivClass) { }
public:
/// A specific resolved potential archetype.
ResolvedType(PotentialArchetype *pa)
: type(pa), equivClass(pa->getEquivalenceClassIfPresent()) { }
/// A resolved type within the given equivalence class.
ResolvedType(Type type, EquivalenceClass *equivClass)
: type(type), equivClass(equivClass) {
assert(type->isTypeParameter() == static_cast<bool>(equivClass) &&
"type parameters must have equivalence classes");
}
/// Return an unresolved result, which could be resolved when we
/// learn more information about the given equivalence class.
static ResolvedType forUnresolved(EquivalenceClass *equivClass) {
return ResolvedType(equivClass);
}
/// Return a result for a concrete type.
static ResolvedType forConcrete(Type concreteType) {
return ResolvedType(concreteType, nullptr);
}
/// Determine whether this result was resolved.
explicit operator bool() const { return !type.isNull(); }
/// Retrieve the dependent type.
Type getDependentType(GenericSignatureBuilder &builder) const;
/// Retrieve the concrete type, or a null type if this result doesn't store
/// a concrete type.
Type getAsConcreteType() const {
assert(*this && "Doesn't contain any result");
if (equivClass) return Type();
return type.dyn_cast<Type>();
}
/// Realize a potential archetype for this type parameter.
PotentialArchetype *realizePotentialArchetype(
GenericSignatureBuilder &builder);
/// Retrieve the potential archetype, if already known.
PotentialArchetype *getPotentialArchetypeIfKnown() const {
return type.dyn_cast<PotentialArchetype *>();
}
/// Retrieve the equivalence class into which a resolved type refers.
EquivalenceClass *getEquivalenceClass(
GenericSignatureBuilder &builder) const {
assert(*this && "Only for resolved types");
if (equivClass) return equivClass;
// Create the equivalence class now.
return type.get<PotentialArchetype *>()
->getOrCreateEquivalenceClass(builder);
}
/// Retrieve the equivalence class into which a resolved type refers.
EquivalenceClass *getEquivalenceClassIfPresent() const {
assert(*this && "Only for resolved types");
if (equivClass) return equivClass;
// Create the equivalence class now.
return type.get<PotentialArchetype *>()->getEquivalenceClassIfPresent();
}
/// Retrieve the unresolved result.
EquivalenceClass *getUnresolvedEquivClass() const {
assert(!*this);
return equivClass;
}
/// Return an unresolved type.
///
/// This loses equivalence-class information that could be useful, which
/// is unfortunate.
UnresolvedType getUnresolvedType() const {
return type;
}
};
} // end namepsace swift
#endif // SWIFT_AST_GENERIC_SIGNATURE_BUILDER_IMPL_H