@@ -157,21 +157,30 @@ static void computeLoweredProperties(NominalTypeDecl *decl,
157
157
if (classDecl->isActor ()) {
158
158
ASTContext &ctx = decl->getASTContext ();
159
159
160
- if (auto actorProto = ctx.getProtocol (KnownProtocolKind::Actor)) {
161
- SmallVector<ProtocolConformance *, 1 > conformances;
162
- classDecl->lookupConformance (actorProto, conformances);
163
- for (auto conformance : conformances)
164
- TypeChecker::checkConformance (conformance->getRootNormalConformance ());
165
- }
166
-
167
- // If this is a distributed actor, synthesize its special stored properties.
168
- if (classDecl->isDistributedActor ()) {
169
- if (auto actorProto = ctx.getProtocol (KnownProtocolKind::DistributedActor)) {
160
+ auto evaluateConformance = [&](KnownProtocolKind Kind) {
161
+ if (auto actorProto = ctx.getProtocol (Kind)) {
170
162
SmallVector<ProtocolConformance *, 1 > conformances;
171
163
classDecl->lookupConformance (actorProto, conformances);
172
- for (auto conformance : conformances)
173
- TypeChecker::checkConformance (conformance->getRootNormalConformance ());
164
+ for (auto conformance : conformances) {
165
+ // FIXME: This is too much. Instead, we should force the witnesses.
166
+ // that we actually need.
167
+
168
+ auto *normal = conformance->getRootNormalConformance ();
169
+ evaluateOrDefault (ctx.evaluator ,
170
+ ResolveTypeWitnessesRequest{normal},
171
+ evaluator::SideEffect ());
172
+ evaluateOrDefault (ctx.evaluator ,
173
+ ResolveValueWitnessesRequest{normal},
174
+ evaluator::SideEffect ());
175
+ }
174
176
}
177
+ };
178
+
179
+ evaluateConformance (KnownProtocolKind::Actor);
180
+
181
+ // If this is a distributed actor, synthesize its special stored properties.
182
+ if (classDecl->isDistributedActor ()) {
183
+ evaluateConformance (KnownProtocolKind::DistributedActor);
175
184
}
176
185
}
177
186
}
0 commit comments