Skip to content

Commit 6f46026

Browse files
committed
[AST] Pull GenericSignature::ResolvedType definition into a header.
We’re going to need to use this in GenericSignature.cpp. NFC
1 parent 335baef commit 6f46026

File tree

2 files changed

+108
-90
lines changed

2 files changed

+108
-90
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 1 addition & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include "llvm/Support/raw_ostream.h"
4545
#include "llvm/Support/SaveAndRestore.h"
4646
#include <algorithm>
47+
#include "GenericSignatureBuilderImpl.h"
4748

4849
using namespace swift;
4950
using llvm::DenseMap;
@@ -1856,96 +1857,6 @@ void EquivalenceClass::addMember(PotentialArchetype *pa) {
18561857
}
18571858
}
18581859

1859-
class GenericSignatureBuilder::ResolvedType {
1860-
llvm::PointerUnion<PotentialArchetype *, Type> type;
1861-
EquivalenceClass *equivClass;
1862-
1863-
/// For a type that could not be resolved further unless the given
1864-
/// equivalence class changes.
1865-
ResolvedType(EquivalenceClass *equivClass)
1866-
: type(), equivClass(equivClass) { }
1867-
1868-
public:
1869-
/// A specific resolved potential archetype.
1870-
ResolvedType(PotentialArchetype *pa)
1871-
: type(pa), equivClass(pa->getEquivalenceClassIfPresent()) { }
1872-
1873-
/// A resolved type within the given equivalence class.
1874-
ResolvedType(Type type, EquivalenceClass *equivClass)
1875-
: type(type), equivClass(equivClass) {
1876-
assert(type->isTypeParameter() == static_cast<bool>(equivClass) &&
1877-
"type parameters must have equivalence classes");
1878-
}
1879-
1880-
/// Return an unresolved result, which could be resolved when we
1881-
/// learn more information about the given equivalence class.
1882-
static ResolvedType forUnresolved(EquivalenceClass *equivClass) {
1883-
return ResolvedType(equivClass);
1884-
}
1885-
1886-
/// Return a result for a concrete type.
1887-
static ResolvedType forConcrete(Type concreteType) {
1888-
return ResolvedType(concreteType, nullptr);
1889-
}
1890-
1891-
/// Determine whether this result was resolved.
1892-
explicit operator bool() const { return !type.isNull(); }
1893-
1894-
/// Retrieve the dependent type.
1895-
Type getDependentType(GenericSignatureBuilder &builder) const;
1896-
1897-
/// Retrieve the concrete type, or a null type if this result doesn't store
1898-
/// a concrete type.
1899-
Type getAsConcreteType() const {
1900-
assert(*this && "Doesn't contain any result");
1901-
if (equivClass) return Type();
1902-
return type.dyn_cast<Type>();
1903-
}
1904-
1905-
/// Realize a potential archetype for this type parameter.
1906-
PotentialArchetype *realizePotentialArchetype(
1907-
GenericSignatureBuilder &builder);
1908-
1909-
/// Retrieve the potential archetype, if already known.
1910-
PotentialArchetype *getPotentialArchetypeIfKnown() const {
1911-
return type.dyn_cast<PotentialArchetype *>();
1912-
}
1913-
1914-
/// Retrieve the equivalence class into which a resolved type refers.
1915-
EquivalenceClass *getEquivalenceClass(
1916-
GenericSignatureBuilder &builder) const {
1917-
assert(*this && "Only for resolved types");
1918-
if (equivClass) return equivClass;
1919-
1920-
// Create the equivalence class now.
1921-
return type.get<PotentialArchetype *>()
1922-
->getOrCreateEquivalenceClass(builder);
1923-
}
1924-
1925-
/// Retrieve the equivalence class into which a resolved type refers.
1926-
EquivalenceClass *getEquivalenceClassIfPresent() const {
1927-
assert(*this && "Only for resolved types");
1928-
if (equivClass) return equivClass;
1929-
1930-
// Create the equivalence class now.
1931-
return type.get<PotentialArchetype *>()->getEquivalenceClassIfPresent();
1932-
}
1933-
1934-
/// Retrieve the unresolved result.
1935-
EquivalenceClass *getUnresolvedEquivClass() const {
1936-
assert(!*this);
1937-
return equivClass;
1938-
}
1939-
1940-
/// Return an unresolved type.
1941-
///
1942-
/// This loses equivalence-class information that could be useful, which
1943-
/// is unfortunate.
1944-
UnresolvedType getUnresolvedType() const {
1945-
return type;
1946-
}
1947-
};
1948-
19491860
bool EquivalenceClass::recordConformanceConstraint(
19501861
GenericSignatureBuilder &builder,
19511862
ResolvedType type,

lib/AST/GenericSignatureBuilderImpl.h

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

0 commit comments

Comments
 (0)