2424#include < vector>
2525#include " PropertyMap.h"
2626#include " RequirementLowering.h"
27+ #include " RuleBuilder.h"
2728
2829using namespace swift ;
2930using namespace rewriting ;
@@ -200,7 +201,9 @@ void PropertyMap::concretizeTypeWitnessInConformance(
200201 AssociatedTypeDecl *assocType) const {
201202 auto concreteType = concreteConformanceSymbol.getConcreteType ();
202203 auto substitutions = concreteConformanceSymbol.getSubstitutions ();
203- auto *proto = concreteConformanceSymbol.getProtocol ();
204+
205+ auto *proto = assocType->getProtocol ();
206+ assert (proto == concreteConformanceSymbol.getProtocol ());
204207
205208 if (Debug.contains (DebugFlags::ConcretizeNestedTypes)) {
206209 llvm::dbgs () << " ^^ " << " Looking up type witness for "
@@ -529,8 +532,8 @@ void PropertyMap::inferConditionalRequirements(
529532 return ;
530533
531534 SmallVector<Requirement, 2 > desugaredRequirements;
532- // FIXME: Store errors in the rewrite system to be diagnosed
533- // from the top-level generic signature requests.
535+
536+ // FIXME: Do we need to diagnose these errors?
534537 SmallVector<RequirementError, 2 > errors;
535538
536539 // First, desugar all conditional requirements.
@@ -545,47 +548,17 @@ void PropertyMap::inferConditionalRequirements(
545548 }
546549
547550 // Now, convert desugared conditional requirements to rules.
548- for (auto req : desugaredRequirements) {
549- if (Debug.contains (DebugFlags::ConditionalRequirements)) {
550- llvm::dbgs () << " @@@ Desugared requirement: " ;
551- req.dump (llvm::dbgs ());
552- llvm::dbgs () << " \n " ;
553- }
554-
555- if (req.getKind () == RequirementKind::Conformance) {
556- auto *proto = req.getProtocolDecl ();
557-
558- // If we haven't seen this protocol before, add rules for its
559- // requirements.
560- if (!System.isKnownProtocol (proto)) {
561- if (Debug.contains (DebugFlags::ConditionalRequirements)) {
562- llvm::dbgs () << " @@@ Unknown protocol: " << proto->getName () << " \n " ;
563- }
564551
565- RuleBuilder builder (Context, System.getReferencedProtocols ());
566- builder.addReferencedProtocol (proto);
567- builder.collectRulesFromReferencedProtocols ();
552+ // This will update System.getReferencedProtocols() with any new
553+ // protocols that were imported.
554+ RuleBuilder builder (Context, System.getReferencedProtocols ());
555+ builder.initWithConditionalRequirements (desugaredRequirements,
556+ substitutions);
568557
569- for ( const auto &rule : builder.PermanentRules )
570- System. addPermanentRule (rule. first , rule. second );
558+ assert ( builder.PermanentRules . empty ());
559+ assert (builder. WrittenRequirements . empty () );
571560
572- for (const auto &rule : builder.RequirementRules ) {
573- auto lhs = std::get<0 >(rule);
574- auto rhs = std::get<1 >(rule);
575- System.addExplicitRule (lhs, rhs, /* requirementID=*/ None);
576- }
577- }
578- }
579-
580- auto pair = getRuleForRequirement (req.getCanonical (), /* proto=*/ nullptr ,
581- substitutions, Context);
582-
583- if (Debug.contains (DebugFlags::ConditionalRequirements)) {
584- llvm::dbgs () << " @@@ Induced rule from conditional requirement: "
585- << pair.first << " => " << pair.second << " \n " ;
586- }
587-
588- // FIXME: Do we need a rewrite path here?
589- (void ) System.addRule (pair.first , pair.second );
590- }
561+ System.addRules (std::move (builder.ImportedRules ),
562+ std::move (builder.PermanentRules ),
563+ std::move (builder.RequirementRules ));
591564}
0 commit comments