@@ -8,26 +8,25 @@ import dotty.tools.dotc.core.Symbols.defn
88import dotty .tools .dotc .core .Types .{Type , TypeVar , TypeMap }
99import dotty .tools .dotc .core .Decorators .i
1010import dotty .tools .dotc .printing .Showable
11+ import dotty .tools .dotc .reporting .trace
1112
1213class QualifierSolver (using Context ):
1314
14- def implies (node1 : ENode .Lambda , node2 : ENode .Lambda ) =
15- require(node1.paramTps.length == 1 )
16- require(node2.paramTps.length == 1 )
17- val node1Inst = node1.normalizeTypes().asInstanceOf [ENode .Lambda ]
18- val node2Inst = node2.normalizeTypes().asInstanceOf [ENode .Lambda ]
19- val paramTp1 = node1Inst.paramTps.head
20- val paramTp2 = node2Inst.paramTps.head
21- if paramTp1 frozen_<:< paramTp2 then
22- impliesRec(subsParamRefTps(node1Inst.body, node2Inst), node2Inst.body)
23- else if paramTp2 frozen_<:< paramTp1 then
24- impliesRec(node1Inst.body, subsParamRefTps(node2Inst.body, node1Inst))
25- else
26- false
27-
28- private def subsParamRefTps (node1Body : ENode , node2 : ENode .Lambda ): ENode =
29- val paramRefs = node2.paramTps.zipWithIndex.map((tp, i) => ENodeParamRef (i, tp))
30- node1Body.substEParamRefs(0 , paramRefs)
15+ def implies (node1 : ENode .Lambda , node2 : ENode .Lambda ): Boolean =
16+ trace(i " implie ${node1.showNoBreak} --> ${node2.showNoBreak}" , Printers .qualifiedTypes):
17+ require(node1.paramTps.length == 1 )
18+ require(node2.paramTps.length == 1 )
19+ val node1Inst = node1.normalizeTypes().asInstanceOf [ENode .Lambda ]
20+ val node2Inst = node2.normalizeTypes().asInstanceOf [ENode .Lambda ]
21+ val paramTp1 = node1Inst.paramTps.head
22+ val paramTp2 = node2Inst.paramTps.head
23+ if paramTp1 frozen_<:< paramTp2 then impliesCommonParams(node1Inst, node2Inst, node1Inst)
24+ else if paramTp2 frozen_<:< paramTp1 then impliesCommonParams(node1Inst, node2Inst, node2Inst)
25+ else false
26+
27+ private def impliesCommonParams (node1 : ENode .Lambda , node2 : ENode .Lambda , mostPreciseNode : ENode .Lambda ): Boolean =
28+ val paramRefs = mostPreciseNode.paramTps.zipWithIndex.map((tp, i) => ENodeParamRef (i, tp))
29+ impliesRec(node1.body.substEParamRefs(0 , paramRefs), node2.body.substEParamRefs(0 , paramRefs))
3130
3231 private def impliesRec (node1 : ENode , node2 : ENode ): Boolean =
3332 node1 match
@@ -42,16 +41,17 @@ class QualifierSolver(using Context):
4241 protected def impliesLeaf (egraph : EGraph , enode1 : ENode , enode2 : ENode ): Boolean =
4342 val node1Canonical = egraph.canonicalize(enode1)
4443 val node2Canonical = egraph.canonicalize(enode2)
45- egraph.assertInvariants()
46- egraph.merge(node1Canonical, egraph.trueNode)
47- egraph.repair()
48- egraph.equiv(node2Canonical, egraph.trueNode)
44+ trace(i " impliesLeaf ${node1Canonical.showNoBreak} --> ${node2Canonical.showNoBreak}" , Printers .qualifiedTypes):
45+ egraph.assertInvariants()
46+ egraph.merge(node1Canonical, egraph.trueNode)
47+ egraph.repair()
48+ egraph.equiv(node2Canonical, egraph.trueNode)
4949
5050final class ExplainingQualifierSolver (
5151 traceIndented : [T ] => (String ) => (=> T ) => T )(using Context ) extends QualifierSolver :
5252
5353 override protected def impliesLeaf (egraph : EGraph , enode1 : ENode , enode2 : ENode ): Boolean =
5454 traceIndented(s " ${enode1.showNoBreak} --> ${enode2.showNoBreak}" ):
5555 val res = super .impliesLeaf(egraph, enode1, enode2)
56- if ! res then println(egraph.debugString())
56+ // if !res then println(egraph.debugString())
5757 res
0 commit comments