Skip to content

Commit 1ee14f5

Browse files
committed
[AST] Add a way to retrieve $Storage decl from a type wrapped type
1 parent fe1f150 commit 1ee14f5

File tree

2 files changed

+16
-10
lines changed

2 files changed

+16
-10
lines changed

include/swift/AST/Decl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3775,6 +3775,11 @@ class NominalTypeDecl : public GenericTypeDecl, public IterableDeclContext {
37753775
/// applicable property access routing).
37763776
VarDecl *getTypeWrapperProperty() const;
37773777

3778+
/// If this declaration has a type wrapper, return `$Storage`
3779+
/// declaration that contains all the stored properties managed
3780+
/// by the wrapper.
3781+
NominalTypeDecl *getTypeWrapperStorageDecl() const;
3782+
37783783
/// Get an initializer that could be used to instantiate a
37793784
/// type wrapped type.
37803785
ConstructorDecl *getTypeWrapperInitializer() const;

lib/Sema/TypeCheckTypeWrapper.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ ConstructorDecl *NominalTypeDecl::getTypeWrapperInitializer() const {
158158
nullptr);
159159
}
160160

161+
NominalTypeDecl *NominalTypeDecl::getTypeWrapperStorageDecl() const {
162+
auto *mutableSelf = const_cast<NominalTypeDecl *>(this);
163+
return evaluateOrDefault(getASTContext().evaluator,
164+
GetTypeWrapperStorage{mutableSelf}, nullptr);
165+
}
166+
161167
NominalTypeDecl *
162168
GetTypeWrapperStorage::evaluate(Evaluator &evaluator,
163169
NominalTypeDecl *parent) const {
@@ -190,8 +196,8 @@ GetTypeWrapperProperty::evaluate(Evaluator &evaluator,
190196
if (!typeWrapper)
191197
return nullptr;
192198

193-
auto *storage =
194-
evaluateOrDefault(ctx.evaluator, GetTypeWrapperStorage{parent}, nullptr);
199+
auto *storage = parent->getTypeWrapperStorageDecl();
200+
assert(storage);
195201

196202
auto *typeWrapperType =
197203
evaluateOrDefault(ctx.evaluator, GetTypeWrapperType{parent}, Type())
@@ -217,10 +223,7 @@ VarDecl *GetTypeWrapperStorageForProperty::evaluate(Evaluator &evaluator,
217223
if (!property->isAccessedViaTypeWrapper())
218224
return nullptr;
219225

220-
auto &ctx = wrappedType->getASTContext();
221-
222-
auto *storage = evaluateOrDefault(
223-
ctx.evaluator, GetTypeWrapperStorage{wrappedType}, nullptr);
226+
auto *storage = wrappedType->getTypeWrapperStorageDecl();
224227
assert(storage);
225228

226229
return injectProperty(storage, property->getName(),
@@ -394,8 +397,7 @@ SynthesizeTypeWrapperInitializerBody::evaluate(Evaluator &evaluator,
394397
auto *parent = ctor->getDeclContext()->getSelfNominalTypeDecl();
395398

396399
// self.$_storage = .init(memberwise: $Storage(...))
397-
auto *storageType =
398-
evaluateOrDefault(ctx.evaluator, GetTypeWrapperStorage{parent}, nullptr);
400+
auto *storageType = parent->getTypeWrapperStorageDecl();
399401
assert(storageType);
400402

401403
auto *typeWrapperVar = parent->getTypeWrapperProperty();
@@ -493,8 +495,7 @@ VarDecl *SynthesizeLocalVariableForTypeWrapperStorage::evaluate(
493495
if (!(DC && DC->hasTypeWrapper()))
494496
return nullptr;
495497

496-
auto *storageDecl =
497-
evaluateOrDefault(evaluator, GetTypeWrapperStorage{DC}, nullptr);
498+
auto *storageDecl = DC->getTypeWrapperStorageDecl();
498499
assert(storageDecl);
499500

500501
SmallVector<TupleTypeElt, 4> members;

0 commit comments

Comments
 (0)