@@ -3947,64 +3947,62 @@ TypeWitnessSystem::compareResolvedTypes(Type ty1, Type ty2) {
39473947 return ResolvedTypeComparisonResult::EquivalentOrWorse;
39483948}
39493949
3950- void ConformanceChecker::resolveTypeWitnesses () {
3951- PrettyStackTraceConformance trace (" performing associated type inference on" ,
3952- Conformance);
3953-
3950+ evaluator::SideEffect
3951+ ResolveTypeWitnessesRequest::evaluate (Evaluator &evaluator,
3952+ NormalProtocolConformance *conformance) const {
39543953 // Attempt to infer associated type witnesses.
3955- AssociatedTypeInference inference (getASTContext (), Conformance);
3954+ auto &ctx = conformance->getDeclContext ()->getASTContext ();
3955+
3956+ AssociatedTypeInference inference (ctx, conformance);
39563957 if (auto inferred = inference.solve ()) {
39573958 for (const auto &inferredWitness : *inferred) {
3958- recordTypeWitness (Conformance ,
3959+ recordTypeWitness (conformance ,
39593960 inferredWitness.first ,
39603961 inferredWitness.second ,
39613962 /* typeDecl=*/ nullptr );
39623963 }
39633964
3964- return ;
3965+ return evaluator::SideEffect () ;
39653966 }
39663967
39673968 // Conformance failed. Record errors for each of the witnesses.
3968- Conformance ->setInvalid ();
3969+ conformance ->setInvalid ();
39693970
39703971 // We're going to produce an error below. Mark each unresolved
39713972 // associated type witness as erroneous.
3972- for (auto assocType : Proto ->getAssociatedTypeMembers ()) {
3973+ for (auto assocType : conformance-> getProtocol () ->getAssociatedTypeMembers ()) {
39733974 // If we already have a type witness, do nothing.
3974- if (Conformance ->hasTypeWitness (assocType))
3975+ if (conformance ->hasTypeWitness (assocType))
39753976 continue ;
39763977
3977- recordTypeWitness (Conformance, assocType,
3978- ErrorType::get (getASTContext ()), nullptr );
3978+ recordTypeWitness (conformance, assocType, ErrorType::get (ctx), nullptr );
39793979 }
3980+
3981+ return evaluator::SideEffect ();
39803982}
39813983
3982- void ConformanceChecker::resolveSingleTypeWitness (
3983- AssociatedTypeDecl *assocType) {
3984- switch (resolveTypeWitnessViaLookup (Conformance, assocType)) {
3984+ TypeWitnessAndDecl
3985+ TypeWitnessRequest::evaluate (Evaluator &eval,
3986+ NormalProtocolConformance *conformance,
3987+ AssociatedTypeDecl *requirement) const {
3988+ switch (resolveTypeWitnessViaLookup (conformance, requirement)) {
39853989 case ResolveWitnessResult::Success:
39863990 case ResolveWitnessResult::ExplicitFailed:
39873991 // We resolved this type witness one way or another.
3988- return ;
3992+ break ;
39893993
3990- case ResolveWitnessResult::Missing:
3994+ case ResolveWitnessResult::Missing: {
39913995 // The type witness is still missing. Resolve all of the type witnesses.
3992- resolveTypeWitnesses ();
3993- return ;
3996+ auto &ctx = requirement->getASTContext ();
3997+ evaluateOrDefault (ctx.evaluator ,
3998+ ResolveTypeWitnessesRequest{conformance},
3999+ evaluator::SideEffect ());
4000+ break ;
4001+ }
39944002 }
3995- }
3996-
3997- TypeWitnessAndDecl
3998- TypeWitnessRequest::evaluate (Evaluator &eval,
3999- NormalProtocolConformance *conformance,
4000- AssociatedTypeDecl *requirement) const {
4001- auto &ctx = requirement->getASTContext ();
4002- ConformanceChecker checker (ctx, conformance);
4003- checker.resolveSingleTypeWitness (requirement);
40044003
4005- // FIXME: ConformanceChecker and the other associated WitnessCheckers have
4006- // an extremely convoluted caching scheme that doesn't fit nicely into the
4007- // evaluator's model. All of this should be refactored away.
4004+ // FIXME: resolveTypeWitnessViaLookup() and ResolveTypeWitnessesRequest
4005+ // pre-populate the type witnesses in this manner. This should be cleaned up.
40084006 const auto known = conformance->TypeWitnesses .find (requirement);
40094007 assert (known != conformance->TypeWitnesses .end () &&
40104008 " Didn't resolve witness?" );
0 commit comments