@@ -65,16 +65,18 @@ void RewriteStep::dump(llvm::raw_ostream &out,
6565 break ;
6666 }
6767 case Relation: {
68- evaluator.applyRelation (*this , system);
68+ auto result = evaluator.applyRelation (*this , system);
6969
70- auto relation = system.getRelation (Arg);
71- out << " Relation(" ;
72- if (Inverse) {
73- out << relation.second << " > " << relation.first ;
74- } else {
75- out << relation.first << " < " << relation.second ;
70+ if (!result.prefix .empty ()) {
71+ out << result.prefix ;
72+ out << " ." ;
73+ }
74+ out << " (" << result.lhs << " =>> " << result.rhs << " )" ;
75+ if (!result.suffix .empty ()) {
76+ out << " ." ;
77+ out << result.suffix ;
7678 }
77- out << " ) " ;
79+
7880 break ;
7981 }
8082 case ConcreteConformance: {
@@ -293,41 +295,6 @@ void RewritePathEvaluator::applyShift(const RewriteStep &step,
293295 }
294296}
295297
296- void RewritePathEvaluator::applyRelation (const RewriteStep &step,
297- const RewriteSystem &system) {
298- assert (step.Kind == RewriteStep::Relation);
299-
300- auto relation = system.getRelation (step.Arg );
301- auto &term = getCurrentTerm ();
302-
303- if (!step.Inverse ) {
304- // Given a term T.[p1].[p2].U where |U| == EndOffset, build the
305- // term T.[p1].U.
306-
307- auto lhsProperty = *(term.end () - step.EndOffset - 2 );
308- auto rhsProperty = *(term.end () - step.EndOffset - 1 );
309- assert (lhsProperty == relation.first );
310- assert (rhsProperty == relation.second );
311-
312- MutableTerm result (term.begin (), term.end () - step.EndOffset - 1 );
313- result.append (term.end () - step.EndOffset , term.end ());
314-
315- term = result;
316- } else {
317- // Given a term T.[p1].U where |U| == EndOffset, build the
318- // term T.[p1].[p2].U.
319-
320- auto lhsProperty = *(term.end () - step.EndOffset - 1 );
321- assert (lhsProperty == relation.first );
322-
323- MutableTerm result (term.begin (), term.end () - step.EndOffset );
324- result.add (relation.second );
325- result.append (term.end () - step.EndOffset , term.end ());
326-
327- term = result;
328- }
329- }
330-
331298void RewritePathEvaluator::applyDecompose (const RewriteStep &step,
332299 const RewriteSystem &system) {
333300 assert (step.Kind == RewriteStep::Decompose);
@@ -404,6 +371,46 @@ void RewritePathEvaluator::applyDecompose(const RewriteStep &step,
404371 }
405372}
406373
374+ AppliedRewriteStep
375+ RewritePathEvaluator::applyRelation (const RewriteStep &step,
376+ const RewriteSystem &system) {
377+ assert (step.Kind == RewriteStep::Relation);
378+
379+ auto relation = system.getRelation (step.Arg );
380+ auto &term = getCurrentTerm ();
381+
382+ auto lhs = (step.Inverse ? relation.second : relation.first );
383+ auto rhs = (step.Inverse ? relation.first : relation.second );
384+
385+ auto bug = [&](StringRef msg) {
386+ llvm::errs () << msg << " \n " ;
387+ llvm::errs () << " - Term: " << term << " \n " ;
388+ llvm::errs () << " - StartOffset: " << step.StartOffset << " \n " ;
389+ llvm::errs () << " - EndOffset: " << step.EndOffset << " \n " ;
390+ llvm::errs () << " - Expected subterm: " << lhs << " \n " ;
391+ abort ();
392+ };
393+
394+ if (term.size () != step.StartOffset + lhs.size () + step.EndOffset ) {
395+ bug (" Invalid whiskering" );
396+ }
397+
398+ if (!std::equal (term.begin () + step.StartOffset ,
399+ term.begin () + step.StartOffset + lhs.size (),
400+ lhs.begin ())) {
401+ bug (" Invalid subterm" );
402+ }
403+
404+ MutableTerm prefix (term.begin (), term.begin () + step.StartOffset );
405+ MutableTerm suffix (term.end () - step.EndOffset , term.end ());
406+
407+ term = prefix;
408+ term.append (rhs);
409+ term.append (suffix);
410+
411+ return {lhs, rhs, prefix, suffix};
412+ }
413+
407414void
408415RewritePathEvaluator::applyConcreteConformance (const RewriteStep &step,
409416 const RewriteSystem &system) {
0 commit comments