Skip to content

Commit 99dab70

Browse files
committed
RequirementMachine: Mark associated type introduction rules permanent
1 parent 8fbe93c commit 99dab70

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

lib/AST/RequirementMachine/RequirementMachine.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ struct RewriteSystemBuilder {
3333
bool Dump;
3434

3535
ProtocolGraph Protocols;
36-
std::vector<std::pair<MutableTerm, MutableTerm>> Rules;
36+
std::vector<std::pair<MutableTerm, MutableTerm>> AssociatedTypeRules;
37+
std::vector<std::pair<MutableTerm, MutableTerm>> RequirementRules;
3738

3839
CanType getConcreteSubstitutionSchema(CanType concreteType,
3940
const ProtocolDecl *proto,
@@ -126,7 +127,7 @@ void RewriteSystemBuilder::addAssociatedType(const AssociatedTypeDecl *type,
126127
MutableTerm rhs;
127128
rhs.add(Symbol::forAssociatedType(proto, type->getName(), Context));
128129

129-
Rules.emplace_back(lhs, rhs);
130+
AssociatedTypeRules.emplace_back(lhs, rhs);
130131
}
131132

132133
/// Lowers a generic requirement to a rewrite rule.
@@ -187,7 +188,7 @@ void RewriteSystemBuilder::addRequirement(const Requirement &req,
187188
constraintTerm = subjectTerm;
188189
constraintTerm.add(Symbol::forSuperclass(otherType, substitutions,
189190
Context));
190-
Rules.emplace_back(subjectTerm, constraintTerm);
191+
RequirementRules.emplace_back(subjectTerm, constraintTerm);
191192

192193
constraintTerm = subjectTerm;
193194
auto layout =
@@ -233,7 +234,7 @@ void RewriteSystemBuilder::addRequirement(const Requirement &req,
233234
}
234235
}
235236

236-
Rules.emplace_back(subjectTerm, constraintTerm);
237+
RequirementRules.emplace_back(subjectTerm, constraintTerm);
237238
}
238239

239240
void RequirementMachine::verify(const MutableTerm &term) const {
@@ -366,7 +367,8 @@ void RequirementMachine::addGenericSignature(CanGenericSignature sig) {
366367

367368
// Add the initial set of rewrite rules to the rewrite system, also
368369
// providing the protocol graph to use for the linear order on terms.
369-
System.initialize(std::move(builder.Rules),
370+
System.initialize(std::move(builder.AssociatedTypeRules),
371+
std::move(builder.RequirementRules),
370372
std::move(builder.Protocols));
371373

372374
computeCompletion();

lib/AST/RequirementMachine/RewriteSystem.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,18 @@ RewriteSystem::~RewriteSystem() {
6464
}
6565

6666
void RewriteSystem::initialize(
67-
std::vector<std::pair<MutableTerm, MutableTerm>> &&rules,
67+
std::vector<std::pair<MutableTerm, MutableTerm>> &&associatedTypeRules,
68+
std::vector<std::pair<MutableTerm, MutableTerm>> &&requirementRules,
6869
ProtocolGraph &&graph) {
6970
Protos = graph;
7071

71-
for (const auto &rule : rules)
72+
for (const auto &rule : associatedTypeRules) {
73+
bool added = addRule(rule.first, rule.second);
74+
if (added)
75+
Rules.back().markPermanent();
76+
}
77+
78+
for (const auto &rule : requirementRules)
7279
addRule(rule.first, rule.second);
7380
}
7481

lib/AST/RequirementMachine/RewriteSystem.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,16 @@ class Rule final {
105105
Simplified = true;
106106
}
107107

108+
void markPermanent() {
109+
assert(!Permanent);
110+
Permanent = true;
111+
}
112+
113+
void markRedundant() {
114+
assert(!Redundant);
115+
Redundant = true;
116+
}
117+
108118
/// Returns the length of the left hand side.
109119
unsigned getDepth() const {
110120
return LHS.size();
@@ -329,7 +339,8 @@ class RewriteSystem final {
329339
/// Return the object recording information about known protocols.
330340
const ProtocolGraph &getProtocols() const { return Protos; }
331341

332-
void initialize(std::vector<std::pair<MutableTerm, MutableTerm>> &&rules,
342+
void initialize(std::vector<std::pair<MutableTerm, MutableTerm>> &&assocaitedTypeRules,
343+
std::vector<std::pair<MutableTerm, MutableTerm>> &&requirementRules,
333344
ProtocolGraph &&protos);
334345

335346
Symbol simplifySubstitutionsInSuperclassOrConcreteSymbol(Symbol symbol) const;

0 commit comments

Comments
 (0)