Skip to content

Commit 6a2b6c2

Browse files
committed
[AST] Add TypeBase::findUnresolvedDependentMemberType() and use it 3x.
NFC: Eliminate some duplicated "search for an unresolved dependent member type" code scattered around.
1 parent b44f24d commit 6a2b6c2

File tree

5 files changed

+30
-33
lines changed

5 files changed

+30
-33
lines changed

include/swift/AST/Types.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ namespace swift {
4545
class AssociatedTypeDecl;
4646
class ASTContext;
4747
class ClassDecl;
48+
class DependentMemberType;
4849
class GenericTypeParamDecl;
4950
class GenericTypeParamType;
5051
class GenericParamList;
@@ -534,6 +535,12 @@ class alignas(1 << TypeAlignInBits) TypeBase {
534535
return getRecursiveProperties().hasTypeParameter();
535536
}
536537

538+
/// Find any unresolved dependent member type within this type.
539+
///
540+
/// "Unresolved" dependent member types have no known associated type,
541+
/// and are only used transiently in the type checker.
542+
const DependentMemberType *findUnresolvedDependentMemberType();
543+
537544
/// Return the root generic parameter of this type parameter type.
538545
GenericTypeParamType *getRootGenericParam();
539546

lib/AST/ASTVerifier.cpp

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2575,18 +2575,8 @@ class Verifier : public ASTWalker {
25752575
// dependent member types.
25762576
// FIXME: This is a general property of the type system.
25772577
auto interfaceTy = AFD->getInterfaceType();
2578-
Type unresolvedDependentTy;
2579-
interfaceTy.findIf([&](Type type) -> bool {
2580-
if (auto dependent = type->getAs<DependentMemberType>()) {
2581-
if (dependent->getAssocType() == nullptr) {
2582-
unresolvedDependentTy = dependent;
2583-
return true;
2584-
}
2585-
}
2586-
return false;
2587-
});
2588-
2589-
if (unresolvedDependentTy) {
2578+
if (auto unresolvedDependentTy
2579+
= interfaceTy->findUnresolvedDependentMemberType()) {
25902580
Out << "Unresolved dependent member type ";
25912581
unresolvedDependentTy->print(Out);
25922582
abort();

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5266,14 +5266,8 @@ static void collectRequirements(GenericSignatureBuilder &builder,
52665266

52675267
// Drop requirements involving concrete types containing
52685268
// unresolved associated types.
5269-
if (repTy.findIf([](Type t) -> bool {
5270-
if (auto *depTy = dyn_cast<DependentMemberType>(t.getPointer()))
5271-
if (depTy->getAssocType() == nullptr)
5272-
return true;
5273-
return false;
5274-
})) {
5269+
if (repTy->findUnresolvedDependentMemberType())
52755270
return;
5276-
}
52775271
} else if (auto layoutConstraint = type.dyn_cast<LayoutConstraint>()) {
52785272
requirements.push_back(Requirement(kind, depTy, layoutConstraint));
52795273
return;

lib/AST/Type.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3156,6 +3156,24 @@ Type Type::substDependentTypesWithErrorTypes() const {
31563156
SubstFlags::UseErrorType));
31573157
}
31583158

3159+
const DependentMemberType *TypeBase::findUnresolvedDependentMemberType() {
3160+
if (!hasTypeParameter()) return nullptr;
3161+
3162+
const DependentMemberType *unresolvedDepMemTy = nullptr;
3163+
Type(this).findIf([&](Type type) -> bool {
3164+
if (auto depMemTy = type->getAs<DependentMemberType>()) {
3165+
if (depMemTy->getAssocType() == nullptr) {
3166+
unresolvedDepMemTy = depMemTy;
3167+
return true;
3168+
}
3169+
}
3170+
return false;
3171+
});
3172+
3173+
return unresolvedDepMemTy;
3174+
}
3175+
3176+
31593177
Type TypeBase::getSuperclassForDecl(const ClassDecl *baseClass) {
31603178
Type t(this);
31613179
while (t) {

lib/Sema/TypeCheckDecl.cpp

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6954,18 +6954,6 @@ bool swift::checkOverrides(TypeChecker &TC, ValueDecl *decl) {
69546954
return DeclChecker::checkOverrides(TC, decl);
69556955
}
69566956

6957-
/// Determine whether the given type contains an unresolved dependent member
6958-
/// type.
6959-
static bool hasUnresolvedDependentMemberType(Type type) {
6960-
return type.findIf([](Type type) {
6961-
if (auto depMemTy = type->getAs<DependentMemberType>()) {
6962-
if (!depMemTy->getAssocType()) return true;
6963-
}
6964-
6965-
return false;
6966-
});
6967-
}
6968-
69696957
bool TypeChecker::isAvailabilitySafeForOverride(ValueDecl *override,
69706958
ValueDecl *base) {
69716959
// API availability ranges are contravariant: make sure the version range
@@ -7270,8 +7258,8 @@ void TypeChecker::validateDecl(ValueDecl *D) {
72707258
// FIXME: We never should have recorded such a type in the first
72717259
// place.
72727260
if (!aliasDecl->getUnderlyingTypeLoc().getType() ||
7273-
hasUnresolvedDependentMemberType(
7274-
aliasDecl->getUnderlyingTypeLoc().getType())) {
7261+
aliasDecl->getUnderlyingTypeLoc().getType()
7262+
->findUnresolvedDependentMemberType()) {
72757263
aliasDecl->getUnderlyingTypeLoc().setType(Type(),
72767264
/*validated=*/false);
72777265
validateAccessibility(aliasDecl);

0 commit comments

Comments
 (0)