Skip to content

Commit d1554f2

Browse files
committed
[AST] InitAccessors: Requestify a "has init accessor" check
1 parent 8b1c9c9 commit d1554f2

File tree

5 files changed

+36
-3
lines changed

5 files changed

+36
-3
lines changed

include/swift/AST/Decl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5317,6 +5317,10 @@ class AbstractStorageDecl : public ValueDecl {
53175317
/// it.
53185318
bool hasStorage() const;
53195319

5320+
/// Return true if this is a VarDecl that has init accessor associated
5321+
/// with it.
5322+
bool hasInitAccessor() const;
5323+
53205324
/// Return true if this storage has the basic accessors/capability
53215325
/// to be mutated. This is generally constant after the accessors are
53225326
/// installed by the parser/importer/whatever.

include/swift/AST/TypeCheckRequests.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4312,6 +4312,22 @@ class IsNonUserModuleRequest
43124312
bool isCached() const { return true; }
43134313
};
43144314

4315+
class HasInitAccessorRequest
4316+
: public SimpleRequest<HasInitAccessorRequest, bool(AbstractStorageDecl *),
4317+
RequestFlags::Cached> {
4318+
public:
4319+
using SimpleRequest::SimpleRequest;
4320+
4321+
private:
4322+
friend SimpleRequest;
4323+
4324+
// Evaluation.
4325+
bool evaluate(Evaluator &evaluator, AbstractStorageDecl *decl) const;
4326+
4327+
public:
4328+
bool isCached() const { return true; }
4329+
};
4330+
43154331
class InitAccessorReferencedVariablesRequest
43164332
: public SimpleRequest<InitAccessorReferencedVariablesRequest,
43174333
ArrayRef<VarDecl *>(DeclAttribute *, AccessorDecl *,

include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,9 @@ SWIFT_REQUEST(TypeChecker, IsNonUserModuleRequest,
487487
SWIFT_REQUEST(TypeChecker, TypeCheckObjCImplementationRequest,
488488
unsigned(ExtensionDecl *),
489489
Cached, NoLocationInfo)
490+
SWIFT_REQUEST(TypeChecker, HasInitAccessorRequest,
491+
bool(AbstractStorageDecl *), Cached,
492+
NoLocationInfo)
490493
SWIFT_REQUEST(TypeChecker, InitAccessorReferencedVariablesRequest,
491494
ArrayRef<VarDecl *>(DeclAttribute *, AccessorDecl *,
492495
ArrayRef<Identifier>),

lib/AST/Decl.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6720,6 +6720,12 @@ Type AbstractStorageDecl::getValueInterfaceType() const {
67206720
return cast<SubscriptDecl>(this)->getElementInterfaceType();
67216721
}
67226722

6723+
bool AbstractStorageDecl::hasInitAccessor() const {
6724+
return evaluateOrDefault(
6725+
getASTContext().evaluator,
6726+
HasInitAccessorRequest{const_cast<AbstractStorageDecl *>(this)}, false);
6727+
}
6728+
67236729
VarDecl::VarDecl(DeclKind kind, bool isStatic, VarDecl::Introducer introducer,
67246730
SourceLoc nameLoc, Identifier name,
67256731
DeclContext *dc, StorageIsMutable_t supportsMutation)

lib/Sema/TypeCheckStorage.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,12 @@ StoredPropertiesAndMissingMembersRequest::evaluate(Evaluator &evaluator,
301301
return decl->getASTContext().AllocateCopy(results);
302302
}
303303

304-
/// Determine whether the given variable has an init accessor.
305-
static bool hasInitAccessor(VarDecl *var) {
304+
bool HasInitAccessorRequest::evaluate(Evaluator &evaluator,
305+
AbstractStorageDecl *decl) const {
306+
auto *var = dyn_cast<VarDecl>(decl);
307+
if (!var)
308+
return false;
309+
306310
if (var->getAccessor(AccessorKind::Init))
307311
return true;
308312

@@ -340,7 +344,7 @@ InitAccessorPropertiesRequest::evaluate(Evaluator &evaluator,
340344
SmallVector<VarDecl *, 4> results;
341345
for (auto *member : decl->getMembers()) {
342346
auto *var = dyn_cast<VarDecl>(member);
343-
if (!var || var->isStatic() || !hasInitAccessor(var)) {
347+
if (!var || var->isStatic() || !var->hasInitAccessor()) {
344348
continue;
345349
}
346350

0 commit comments

Comments
 (0)