@@ -150,6 +150,59 @@ 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
+ 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
+
153
206
ArrayRef<VarDecl *>
154
207
StoredPropertiesRequest::evaluate (Evaluator &evaluator,
155
208
NominalTypeDecl *decl) const {
@@ -163,12 +216,11 @@ StoredPropertiesRequest::evaluate(Evaluator &evaluator,
163
216
if (isa<SourceFile>(decl->getModuleScopeContext ()))
164
217
computeLoweredStoredProperties (decl);
165
218
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) { });
172
224
173
225
return decl->getASTContext ().AllocateCopy (results);
174
226
}
@@ -186,15 +238,13 @@ StoredPropertiesAndMissingMembersRequest::evaluate(Evaluator &evaluator,
186
238
if (isa<SourceFile>(decl->getModuleScopeContext ()))
187
239
computeLoweredStoredProperties (decl);
188
240
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
+ });
198
248
199
249
return decl->getASTContext ().AllocateCopy (results);
200
250
}
0 commit comments