[GSB] Clean up and audit uses of ArchetypeResolutionKind.

Use ArchetypeResolutionKind::CompleteWellFormed whenever we need to
ask questions about the potential archetype, and
ArchetypeResolutionKind::WellFormed when we need only evaluate whether
there is a legitimate type with that name (and possibly get a handle
to it).
This commit is contained in:
Doug Gregor
2017-06-30 09:47:05 -07:00
parent dbc042261f
commit ae5091b09a
4 changed files with 15 additions and 25 deletions

View File

@@ -488,21 +488,25 @@ bool GenericSignature::requiresClass(Type type, ModuleDecl &mod) {
builder.resolveArchetype(type, ArchetypeResolutionKind::CompleteWellFormed);
if (!pa) return false;
pa = pa->getRepresentative();
if (pa->isConcreteType()) return false;
// If this type was mapped to a concrete type, then there is no
// requirement.
pa = pa->getRepresentative();
if (pa->isConcreteType()) return false;
// If there is a layout constraint, it might be a class.
if (auto layout = pa->getLayout())
if (layout->isClass())
return true;
if (auto layout = pa->getLayout()) {
if (layout->isClass()) return true;
}
// If there is a superclass bound, then obviously it must be a class.
// FIXME: We shouldn't need this?
if (pa->getSuperclass()) return true;
// If any of the protocols are class-bound, then it must be a class.
// FIXME: We shouldn't need this?
for (auto proto : pa->getConformsTo()) {
if (proto->requiresClass()) return true;
}
@@ -519,8 +523,6 @@ Type GenericSignature::getSuperclassBound(Type type, ModuleDecl &mod) {
builder.resolveArchetype(type, ArchetypeResolutionKind::CompleteWellFormed);
if (!pa) return nullptr;
pa = pa->getRepresentative();
// If this type was mapped to a concrete type, then there is no
// requirement.
if (pa->isConcreteType()) return nullptr;
@@ -540,8 +542,6 @@ SmallVector<ProtocolDecl *, 2> GenericSignature::getConformsTo(Type type,
builder.resolveArchetype(type, ArchetypeResolutionKind::CompleteWellFormed);
if (!pa) return { };
pa = pa->getRepresentative();
// If this type was mapped to a concrete type, then there are no
// requirements.
if (pa->isConcreteType()) return { };
@@ -567,8 +567,6 @@ bool GenericSignature::conformsToProtocol(Type type, ProtocolDecl *proto,
builder.resolveArchetype(type, ArchetypeResolutionKind::CompleteWellFormed);
if (!pa) return false;
pa = pa->getRepresentative();
// FIXME: Deal with concrete conformances here?
if (pa->isConcreteType()) return false;
@@ -596,9 +594,6 @@ Type GenericSignature::getConcreteType(Type type, ModuleDecl &mod) {
builder.resolveArchetype(type, ArchetypeResolutionKind::CompleteWellFormed);
if (!pa) return Type();
pa = pa->getRepresentative();
if (!pa->isConcreteType()) return Type();
return pa->getConcreteType();
}
@@ -611,7 +606,6 @@ LayoutConstraint GenericSignature::getLayoutConstraint(Type type,
builder.resolveArchetype(type, ArchetypeResolutionKind::CompleteWellFormed);
if (!pa) return LayoutConstraint();
pa = pa->getRepresentative();
return pa->getLayout();
}
@@ -882,7 +876,7 @@ ConformanceAccessPath GenericSignature::getConformanceAccessPath(
auto pa =
inProtoSigBuilder.resolveArchetype(
storedType,
ArchetypeResolutionKind::WellFormed);
ArchetypeResolutionKind::CompleteWellFormed);
auto equivClass = pa->getOrCreateEquivalenceClass();
// Find the conformance of this potential archetype to the protocol in