7mind / izumi

Productivity-oriented collection of lightweight fancy stuff for Scala toolchain

Home Page:https://izumi.7mind.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Parameterization failure with Set of intersection type alias

neko-kai opened this issue · comments

commented

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]]}
commented

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

commented

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