@@ -150,6 +150,55 @@ static void computeLoweredStoredProperties(NominalTypeDecl *decl) {
150150 }
151151}
152152
153+ // / Enumerate both the stored properties and missing members,
154+ // / in a deterministic order.
155+ static void enumerateStoredPropertiesAndMissing (
156+ NominalTypeDecl *decl,
157+ llvm::function_ref<void (VarDecl *)> addStoredProperty,
158+ llvm::function_ref<void(MissingMemberDecl *)> addMissing) {
159+ // If we have a distributed actor, find the id and actorSystem
160+ // properties. We always want them first, and in a specific
161+ // order.
162+ VarDecl *distributedActorId = nullptr ;
163+ VarDecl *distributedActorSystem = nullptr ;
164+ if (decl->isDistributedActor ()) {
165+ ASTContext &ctx = decl->getASTContext ();
166+ for (auto *member : decl->getMembers ()) {
167+ if (auto *var = dyn_cast<VarDecl>(member)) {
168+ if (!var->isStatic () && var->hasStorage () &&
169+ var->isSynthesized ()) {
170+ if (var->getName () == ctx.Id_id )
171+ distributedActorId = var;
172+ else if (var->getName () == ctx.Id_actorSystem )
173+ distributedActorSystem = var;
174+ }
175+
176+ if (distributedActorId && distributedActorSystem)
177+ break ;
178+ }
179+ }
180+
181+ if (distributedActorId)
182+ addStoredProperty (distributedActorId);
183+ if (distributedActorSystem)
184+ addStoredProperty (distributedActorSystem);
185+ }
186+
187+ for (auto *member : decl->getMembers ()) {
188+ if (auto *var = dyn_cast<VarDecl>(member)) {
189+ if (!var->isStatic () && var->hasStorage () &&
190+ var != distributedActorId &&
191+ var != distributedActorSystem) {
192+ addStoredProperty (var);
193+ }
194+ }
195+
196+ if (auto missing = dyn_cast<MissingMemberDecl>(member))
197+ if (missing->getNumberOfFieldOffsetVectorEntries () > 0 )
198+ addMissing (missing);
199+ }
200+ }
201+
153202ArrayRef<VarDecl *>
154203StoredPropertiesRequest::evaluate (Evaluator &evaluator,
155204 NominalTypeDecl *decl) const {
@@ -163,12 +212,11 @@ StoredPropertiesRequest::evaluate(Evaluator &evaluator,
163212 if (isa<SourceFile>(decl->getModuleScopeContext ()))
164213 computeLoweredStoredProperties (decl);
165214
166- for (auto *member : decl->getMembers ()) {
167- if (auto *var = dyn_cast<VarDecl>(member))
168- if (!var->isStatic () && var->hasStorage ()) {
169- results.push_back (var);
170- }
171- }
215+ enumerateStoredPropertiesAndMissing (decl,
216+ [&](VarDecl *var) {
217+ results.push_back (var);
218+ },
219+ [](MissingMemberDecl *missing) { });
172220
173221 return decl->getASTContext ().AllocateCopy (results);
174222}
@@ -186,15 +234,13 @@ StoredPropertiesAndMissingMembersRequest::evaluate(Evaluator &evaluator,
186234 if (isa<SourceFile>(decl->getModuleScopeContext ()))
187235 computeLoweredStoredProperties (decl);
188236
189- for (auto *member : decl->getMembers ()) {
190- if (auto *var = dyn_cast<VarDecl>(member))
191- if (!var->isStatic () && var->hasStorage ())
192- results.push_back (var);
193-
194- if (auto missing = dyn_cast<MissingMemberDecl>(member))
195- if (missing->getNumberOfFieldOffsetVectorEntries () > 0 )
196- results.push_back (missing);
197- }
237+ enumerateStoredPropertiesAndMissing (decl,
238+ [&](VarDecl *var) {
239+ results.push_back (var);
240+ },
241+ [&](MissingMemberDecl *missing) {
242+ results.push_back (missing);
243+ });
198244
199245 return decl->getASTContext ().AllocateCopy (results);
200246}
0 commit comments