Closed
Description
In a file collections.scala
:
package collections
object collections {
type AnyConstr[X] = Any
}
import collections._
trait Iterable[+A] extends IterableOps[A, Iterable, Iterable[A]]
trait IterableOps[+A, +CC[_], +C]
trait Map[K, +V] extends MapOps[K, V, Map, Map[K, V]]
trait MapOps[K, +V, +CC[_, _] <: IterableOps[_, AnyConstr, _], +C]
extends IterableOps[(K, V), Iterable, C] {
def view: MapView[K, V] = ???
}
trait View[+A] extends Iterable[A] with IterableOps[A, View, View[A]]
trait MapView[K, +V]
extends MapOps[K, V, ({ type l[X, Y] = View[(X, Y)] })#l, View[(K, V)]]
with View[(K, V)]
class MapDecorator[C, M <: HasMapOps[C]]
trait HasMapOps[C] {
/** The type of keys */
type K
/** The type of values */
type V
type A = (K, V)
}
object decorators {
def MapDecorator[C](coll: C)(implicit map: HasMapOps[C]): MapDecorator[C, map.type] = ???
implicit def mapHasMapOps[CC[X, +Y] <: MapOps[X, Y, ({ type l[X, +Y] = IterableOps[_, AnyConstr, _] })#l, _], K0, V0]: HasMapOps[CC[K0, V0]] { type K = K0; type V = V0 } = ???
}
In a file Test.scala
package collections
import decorators._
object Test {
def test(map: Map[Int, String]) = {
MapDecorator(map.view)
}
}
> dotc -d out collections.scala
> dotc -d out -classpath out Test.scala
Exception in thread "main" java.lang.NullPointerException
at dotty.tools.dotc.core.Types$HKLambda.iso(Types.scala:2722)
at dotty.tools.dotc.core.Types$Type.equals(Types.scala:1415)
at dotty.tools.dotc.core.Types$HKLambda.equals(Types.scala:2712)
at dotty.tools.dotc.core.Substituters.substParams(Substituters.scala:181)
at dotty.tools.dotc.core.Substituters.substParams$(Substituters.scala:178)
at dotty.tools.dotc.core.Contexts$Context.substParams(Contexts.scala:70)
at dotty.tools.dotc.core.Substituters$SubstParamsMap.apply(Substituters.scala:234)
at dotty.tools.dotc.core.Types$TypeMap.$anonfun$mapOver$6(Types.scala:3965)
at dotty.tools.dotc.core.Types$VariantTraversal.atVariance(Types.scala:3893)
at dotty.tools.dotc.core.Types$TypeMap.mapArgs$1(Types.scala:3965)
at dotty.tools.dotc.core.Types$TypeMap.mapOver(Types.scala:3973)
at dotty.tools.dotc.core.Substituters.substParams(Substituters.scala:189)
at dotty.tools.dotc.core.Substituters.substParams$(Substituters.scala:178)
at dotty.tools.dotc.core.Contexts$Context.substParams(Contexts.scala:70)
at dotty.tools.dotc.core.Substituters$SubstParamsMap.apply(Substituters.scala:234)
at dotty.tools.dotc.core.Types$TypeMap.$anonfun$mapOver$6(Types.scala:3965)
at dotty.tools.dotc.core.Types$VariantTraversal.atVariance(Types.scala:3893)
at dotty.tools.dotc.core.Types$TypeMap.mapArgs$1(Types.scala:3965)
at dotty.tools.dotc.core.Types$TypeMap.mapOver(Types.scala:3973)
at dotty.tools.dotc.core.Substituters.substParams(Substituters.scala:189)
at dotty.tools.dotc.core.Substituters.substParams$(Substituters.scala:178)
at dotty.tools.dotc.core.Contexts$Context.substParams(Contexts.scala:70)
at dotty.tools.dotc.core.Types$Type.substParams(Types.scala:1345)
at dotty.tools.dotc.core.Types$LambdaType.instantiate(Types.scala:2675)
at dotty.tools.dotc.core.Types$LambdaType.instantiate$(Types.scala:2674)
at dotty.tools.dotc.core.Types$HKLambda.instantiate(Types.scala:2704)
at dotty.tools.dotc.core.TypeApplications$.tryReduce$1(TypeApplications.scala:373)
at dotty.tools.dotc.core.TypeApplications$.$anonfun$appliedTo$extension0$1(TypeApplications.scala:390)
...