Skip to content

Commit 6f938c3

Browse files
committed
Sema: Prefer lookupDirect() over getMembers() for iterating over constructors
1 parent 07f889f commit 6f938c3

File tree

1 file changed

+44
-25
lines changed

1 file changed

+44
-25
lines changed

lib/Sema/CodeSynthesis.cpp

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -990,10 +990,16 @@ HasUserDefinedDesignatedInitRequest::evaluate(Evaluator &evaluator,
990990
NominalTypeDecl *decl) const {
991991
assert(!decl->hasClangNode());
992992

993-
for (auto *member : decl->getMembers())
994-
if (auto *ctor = dyn_cast<ConstructorDecl>(member))
995-
if (ctor->isDesignatedInit() && !ctor->isSynthesized())
996-
return true;
993+
auto results = decl->lookupDirect(DeclBaseName::createConstructor());
994+
for (auto *member : results) {
995+
if (isa<ExtensionDecl>(member->getDeclContext()))
996+
continue;
997+
998+
auto *ctor = cast<ConstructorDecl>(member);
999+
if (ctor->isDesignatedInit() && !ctor->isSynthesized())
1000+
return true;
1001+
}
1002+
9971003
return false;
9981004
}
9991005

@@ -1024,11 +1030,17 @@ static void collectNonOveriddenSuperclassInits(
10241030
// overrides, which we don't want to consider as viable delegates for
10251031
// convenience inits.
10261032
llvm::SmallPtrSet<ConstructorDecl *, 4> overriddenInits;
1027-
for (auto member : subclass->getMembers())
1028-
if (auto ctor = dyn_cast<ConstructorDecl>(member))
1029-
if (!ctor->hasStubImplementation())
1030-
if (auto overridden = ctor->getOverriddenDecl())
1031-
overriddenInits.insert(overridden);
1033+
1034+
auto ctors = subclass->lookupDirect(DeclBaseName::createConstructor());
1035+
for (auto *member : ctors) {
1036+
if (isa<ExtensionDecl>(member->getDeclContext()))
1037+
continue;
1038+
1039+
auto *ctor = cast<ConstructorDecl>(member);
1040+
if (!ctor->hasStubImplementation())
1041+
if (auto overridden = ctor->getOverriddenDecl())
1042+
overriddenInits.insert(overridden);
1043+
}
10321044

10331045
superclassDecl->synthesizeSemanticMembersIfNeeded(
10341046
DeclBaseName::createConstructor());
@@ -1060,11 +1072,13 @@ static void collectNonOveriddenSuperclassInits(
10601072
static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
10611073
// Bail out if we're validating one of our constructors already;
10621074
// we'll revisit the issue later.
1063-
for (auto member : decl->getMembers()) {
1064-
if (auto ctor = dyn_cast<ConstructorDecl>(member)) {
1065-
if (ctor->isRecursiveValidation())
1066-
return;
1067-
}
1075+
auto results = decl->lookupDirect(DeclBaseName::createConstructor());
1076+
for (auto *member : results) {
1077+
if (isa<ExtensionDecl>(member->getDeclContext()))
1078+
continue;
1079+
1080+
if (member->isRecursiveValidation())
1081+
return;
10681082
}
10691083

10701084
decl->setAddedImplicitInitializers();
@@ -1119,17 +1133,22 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
11191133
// A designated or required initializer has not been overridden.
11201134

11211135
bool alreadyDeclared = false;
1122-
for (auto *member : decl->getMembers()) {
1123-
if (auto ctor = dyn_cast<ConstructorDecl>(member)) {
1124-
// Skip any invalid constructors.
1125-
if (ctor->isInvalid())
1126-
continue;
1127-
1128-
auto type = swift::getMemberTypeForComparison(ctor, nullptr);
1129-
if (isOverrideBasedOnType(ctor, type, superclassCtor)) {
1130-
alreadyDeclared = true;
1131-
break;
1132-
}
1136+
1137+
auto results = decl->lookupDirect(DeclBaseName::createConstructor());
1138+
for (auto *member : results) {
1139+
if (isa<ExtensionDecl>(member->getDeclContext()))
1140+
continue;
1141+
1142+
auto *ctor = cast<ConstructorDecl>(member);
1143+
1144+
// Skip any invalid constructors.
1145+
if (ctor->isInvalid())
1146+
continue;
1147+
1148+
auto type = swift::getMemberTypeForComparison(ctor, nullptr);
1149+
if (isOverrideBasedOnType(ctor, type, superclassCtor)) {
1150+
alreadyDeclared = true;
1151+
break;
11331152
}
11341153
}
11351154

0 commit comments

Comments
 (0)