Skip to content

Instantly share code, notes, and snippets.

@ivan-klass
Last active June 9, 2020 03:08
Show Gist options
  • Save ivan-klass/18239911298ea112f5b853c63621752d to your computer and use it in GitHub Desktop.
Save ivan-klass/18239911298ea112f5b853c63621752d to your computer and use it in GitHub Desktop.
Magnolia typename typeArguments bug
import magnolia._
import scala.language.experimental.macros
case class TypeArguments[T](names: Vector[String]) {
override def toString: String = names.mkString("__")
}
object Bug {
type Typeclass[T] = TypeArguments[T]
def collectTypeArgs(t: TypeName): Vector[String] = Vector(t.short) ++ t.typeArguments.flatMap(collectTypeArgs)
def combine[T](ctx: CaseClass[Typeclass, T]): Typeclass[T] = TypeArguments(collectTypeArgs(ctx.typeName))
def dispatch[T](ctx: SealedTrait[Typeclass, T]): Typeclass[T] = TypeArguments(collectTypeArgs(ctx.typeName))
@debug
implicit def gen[T]: Typeclass[T] = macro Magnolia.gen[T]
}
case class Example[T](bug: T)
sealed trait ST
case object A extends ST
case class B[T](v: Example[T]) extends ST
type TheTypeAlias = Example[B[Example[A.type]]]
val plain = Bug.gen[Example[B[Example[A.type]]]]
object Eg {
type InScope[X] = Example[B[Example[X]]]
}
val alias = Bug.gen[TheTypeAlias]
val objTA = Bug.gen[Eg.InScope[A.type]]
if (plain != alias) {
println("Type parameters are lost!")
println(plain)
println("!=")
println(alias)
println(objTA)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment