@@ -150,6 +150,59 @@ 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+ if (var->getName () == ctx.Id_id ) {
170+ distributedActorId = var;
171+ } else if (var->getName () == ctx.Id_actorSystem ) {
172+ distributedActorSystem = var;
173+ }
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+ // Skip any properties that we already emitted explicitly
191+ if (var == distributedActorId)
192+ continue ;
193+ if (var == distributedActorSystem)
194+ continue ;
195+
196+ addStoredProperty (var);
197+ }
198+ }
199+
200+ if (auto missing = dyn_cast<MissingMemberDecl>(member))
201+ if (missing->getNumberOfFieldOffsetVectorEntries () > 0 )
202+ addMissing (missing);
203+ }
204+ }
205+
153206ArrayRef<VarDecl *>
154207StoredPropertiesRequest::evaluate (Evaluator &evaluator,
155208 NominalTypeDecl *decl) const {
@@ -163,12 +216,11 @@ StoredPropertiesRequest::evaluate(Evaluator &evaluator,
163216 if (isa<SourceFile>(decl->getModuleScopeContext ()))
164217 computeLoweredStoredProperties (decl);
165218
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- }
219+ enumerateStoredPropertiesAndMissing (decl,
220+ [&](VarDecl *var) {
221+ results.push_back (var);
222+ },
223+ [](MissingMemberDecl *missing) { });
172224
173225 return decl->getASTContext ().AllocateCopy (results);
174226}
@@ -186,15 +238,13 @@ StoredPropertiesAndMissingMembersRequest::evaluate(Evaluator &evaluator,
186238 if (isa<SourceFile>(decl->getModuleScopeContext ()))
187239 computeLoweredStoredProperties (decl);
188240
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- }
241+ enumerateStoredPropertiesAndMissing (decl,
242+ [&](VarDecl *var) {
243+ results.push_back (var);
244+ },
245+ [&](MissingMemberDecl *missing) {
246+ results.push_back (missing);
247+ });
198248
199249 return decl->getASTContext ().AllocateCopy (results);
200250}
0 commit comments