Parameterization failure with Set of intersection type alias
neko-kai opened this issue · comments
Reported in https://t.me/izumi_ru/4842
The following code (https://scastie.scala-lang.org/7swFcEZ5QYqBrkkm5A6Kjw):
import distage._
import cats.effect.IO
object x {
type SrcContextProcessor[F[_]] = SrcProcessor with ContextProcessor[F]
}
import x._
trait SrcProcessor
trait ContextProcessor[F[_]]
class FilesProcessor[F[_]] extends SrcProcessor with ContextProcessor[F]
class ConversionProcessor[F[_]] extends SrcProcessor with ContextProcessor[F]
class FilesResultProcessor[F[_]] extends SrcProcessor with ContextProcessor[F]
class ProcessorsModule[F[_]: TagK] extends ModuleDef {
make[FilesProcessor[F]]
make[ConversionProcessor[F]]
make[FilesResultProcessor[F]]
many[SrcContextProcessor[F]]
.ref[FilesProcessor[F]]
.ref[ConversionProcessor[F]]
.ref[FilesResultProcessor[F]]
}
class ServiceModule[F[_]: TagK] extends ModuleDef {
include(new ProcessorsModule[F])
make[SrcQueueConversionService[F]]
}
class SrcQueueConversionService[F[_]](
val processors: Set[SrcContextProcessor[F]]
)
object App extends App {
Injector().produceRun(new ServiceModule[IO]) {
(s: SrcQueueConversionService[IO]) => IO(println(s.processors))
}
}
Results in an error:
izumi.distage.model.exceptions.ProvisioningException: Provisioner failed on 1 of 2 required operations, just 1 succeeded:
- Unsatisfied preconditions:
[!] Instance is not available in the object graph: {type.scala.collection.immutable.Set[={SrcProcessor & ContextProcessor[=λ %2:0 → F[=2:0]]}]}.
Required by refs:
* {type.SrcQueueConversionService[=λ %0 → IO[+0]]}
There is also a similar error when parameterizing without a wrapper Set:
def tag[F[_]: TagK] = Tag[SrcContextProcessor[F]]
assert(tag1.tag == Tag[SrcContextProcessor[IO]].tag)
{SrcProcessor & ContextProcessor[=λ %0 → IO[+0]]} did not equal {SrcProcessor & ContextProcessor[=λ %1:0 → IO[+1:0]]}
However, this error is caused by a bug in Set equality in Scala collections (scala/bug#8851), the parameterization succeeds – there's IO on both sides, while above, when parameterizing in Set[_], left-hand side has unresolved F
instead of IO
Has associated progression test "progression test: reported in https://github.com/zio/izumi-reflect/issues/189, parameterized type alias with intersection produces incorrect output"
https://github.com/zio/izumi-reflect/blob/c0afe1b837acae5a72b10e0e0fe571edac69b2ed/izumi-reflect/izumi-reflect/src/test/scala/izumi/reflect/test/SharedTagProgressionTest.scala#L29