@@ -150,6 +150,55 @@ static void computeLoweredStoredProperties(NominalTypeDecl *decl) {
150
150
}
151
151
}
152
152
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
+
153
202
ArrayRef<VarDecl *>
154
203
StoredPropertiesRequest::evaluate (Evaluator &evaluator,
155
204
NominalTypeDecl *decl) const {
@@ -163,12 +212,11 @@ StoredPropertiesRequest::evaluate(Evaluator &evaluator,
163
212
if (isa<SourceFile>(decl->getModuleScopeContext ()))
164
213
computeLoweredStoredProperties (decl);
165
214
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) { });
172
220
173
221
return decl->getASTContext ().AllocateCopy (results);
174
222
}
@@ -186,15 +234,13 @@ StoredPropertiesAndMissingMembersRequest::evaluate(Evaluator &evaluator,
186
234
if (isa<SourceFile>(decl->getModuleScopeContext ()))
187
235
computeLoweredStoredProperties (decl);
188
236
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
+ });
198
244
199
245
return decl->getASTContext ().AllocateCopy (results);
200
246
}
0 commit comments