Skip to content

Commit 95451ef

Browse files
committed
Fix Param references equality
1 parent 3666a91 commit 95451ef

File tree

1 file changed

+22
-22
lines changed

1 file changed

+22
-22
lines changed

compiler/src/dotty/tools/dotc/qualified_types/QualifierSolver.scala

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,25 @@ import dotty.tools.dotc.core.Symbols.defn
88
import dotty.tools.dotc.core.Types.{Type, TypeVar, TypeMap}
99
import dotty.tools.dotc.core.Decorators.i
1010
import dotty.tools.dotc.printing.Showable
11+
import dotty.tools.dotc.reporting.trace
1112

1213
class 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

5050
final 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

Comments
 (0)