Skip to content

Commit a1464cf

Browse files
committed
Correctly remove properties subsumed by init accessors from memberwise inits
The code to remove these subsumed properties was part of creating the memberwise initializer declaration, which could lead to inconsistencies with the newly-introduced request for gathering the memberwise-initialized properties. Move the code into the computation of the list of memberwise-initialized properties. Also update a few more places that were effectively recomputing the set of memberwise-initialized properties themselves over to the request.
1 parent e89fdd3 commit a1464cf

File tree

4 files changed

+28
-22
lines changed

4 files changed

+28
-22
lines changed

lib/Index/Index.cpp

+1-8
Original file line numberDiff line numberDiff line change
@@ -706,14 +706,7 @@ class IndexSwiftASTWalker : public SourceEntityWalker {
706706
return;
707707

708708
unsigned CurLabel = 0;
709-
for (auto Member : TypeContext->getMembers()) {
710-
auto Prop = dyn_cast<VarDecl>(Member);
711-
if (!Prop)
712-
continue;
713-
714-
if (!Prop->isMemberwiseInitialized(/*preferDeclaredProperties=*/true))
715-
continue;
716-
709+
for (auto Prop : TypeContext->getMemberwiseInitProperties()) {
717710
if (CurLabel == Args.size())
718711
break;
719712

lib/Refactoring/Refactoring.cpp

-4
Original file line numberDiff line numberDiff line change
@@ -3428,10 +3428,6 @@ collectMembersForInit(ResolvedCursorInfoPtr CursorInfo,
34283428
continue;
34293429
}
34303430

3431-
if (!varDecl->isMemberwiseInitialized(/*preferDeclaredProperties=*/true)) {
3432-
continue;
3433-
}
3434-
34353431
auto patternBinding = varDecl->getParentPatternBinding();
34363432
if (!patternBinding)
34373433
continue;

lib/Sema/CodeSynthesis.cpp

+1-8
Original file line numberDiff line numberDiff line change
@@ -294,13 +294,7 @@ static ConstructorDecl *createImplicitConstructor(NominalTypeDecl *decl,
294294
if (ICK == ImplicitConstructorKind::Memberwise) {
295295
assert(isa<StructDecl>(decl) && "Only struct have memberwise constructor");
296296

297-
std::multimap<VarDecl *, VarDecl *> initializedViaAccessor;
298-
decl->collectPropertiesInitializableByInitAccessors(initializedViaAccessor);
299-
300297
for (auto var : decl->getMemberwiseInitProperties()) {
301-
if (initializedViaAccessor.count(var))
302-
continue;
303-
304298
accessLevel = std::min(accessLevel, var->getFormalAccess());
305299
params.push_back(createMemberwiseInitParameter(decl, Loc, var));
306300
}
@@ -1401,8 +1395,7 @@ ResolveEffectiveMemberwiseInitRequest::evaluate(Evaluator &evaluator,
14011395
auto accessLevel = AccessLevel::Public;
14021396
for (auto *member : decl->getMembers()) {
14031397
auto *var = dyn_cast<VarDecl>(member);
1404-
if (!var ||
1405-
!var->isMemberwiseInitialized(/*preferDeclaredProperties*/ true))
1398+
if (!var || !var->isMemberwiseInitialized(/*preferDeclaredProperties=*/true))
14061399
continue;
14071400
accessLevel = std::min(accessLevel, var->getFormalAccess());
14081401
}

lib/Sema/TypeCheckStorage.cpp

+26-2
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,25 @@ MemberwiseInitPropertiesRequest::evaluate(Evaluator &evaluator,
366366
computeLoweredProperties(decl, implDecl, LoweredPropertiesReason::Memberwise);
367367

368368
SmallVector<VarDecl *, 4> results;
369+
SmallPtrSet<VarDecl *, 4> subsumedViaInitAccessor;
370+
369371
auto maybeAddProperty = [&](VarDecl *var) {
370-
if (var->isMemberwiseInitialized(/*preferDeclaredProperties=*/true))
371-
results.push_back(var);
372+
// We only care about properties that are memberwise initialized.
373+
if (!var->isMemberwiseInitialized(/*preferDeclaredProperties=*/true))
374+
return;
375+
376+
// Add this property.
377+
results.push_back(var);
378+
379+
// If this property has an init accessor, it subsumes all of the stored properties
380+
// that the accessor initializes. Mark those stored properties as being subsumed; we'll
381+
// get back to them later.
382+
if (auto initAccessor = var->getAccessor(AccessorKind::Init)) {
383+
if (auto initAttr = initAccessor->getAttrs().getAttribute<InitializesAttr>()) {
384+
for (auto subsumed : initAttr->getPropertyDecls(initAccessor))
385+
subsumedViaInitAccessor.insert(subsumed);
386+
}
387+
}
372388
};
373389

374390
for (auto *member : decl->getCurrentMembers()) {
@@ -381,6 +397,14 @@ MemberwiseInitPropertiesRequest::evaluate(Evaluator &evaluator,
381397
});
382398
}
383399

400+
// If any properties were subsumed via init accessors, drop them from the list.
401+
if (!subsumedViaInitAccessor.empty()) {
402+
results.erase(std::remove_if(results.begin(), results.end(), [&](VarDecl *var) {
403+
return subsumedViaInitAccessor.contains(var);
404+
}),
405+
results.end());
406+
}
407+
384408
return decl->getASTContext().AllocateCopy(results);
385409
}
386410

0 commit comments

Comments
 (0)