diff --git a/src/core/interface.scala b/src/core/interface.scala index 5c1c32a2..2f6093f5 100644 --- a/src/core/interface.scala +++ b/src/core/interface.scala @@ -35,6 +35,7 @@ abstract class CaseClass[Typeclass[_], Type] (val typeInfo: TypeInfo, val isObject: Boolean, val isValueClass: Boolean, + val isOpaqueType: Boolean, val params: IArray[CaseClass.Param[Typeclass, Type]], val annotations: IArray[Any], val typeAnnotations: IArray[Any]) extends Serializable: diff --git a/src/core/macro.scala b/src/core/macro.scala index 4abc76c3..44d74afc 100644 --- a/src/core/macro.scala +++ b/src/core/macro.scala @@ -5,6 +5,7 @@ import scala.quoted.* object Macro: inline def isObject[T]: Boolean = ${isObject[T]} inline def isEnum[T]: Boolean = ${isEnum[T]} + inline def isOpaqueType[T]: Boolean = ${isOpaqueType[T]} inline def anns[T]: List[Any] = ${anns[T]} inline def typeAnns[T]: List[Any] = ${typeAnns[T]} inline def paramAnns[T]: List[(String, List[Any])] = ${paramAnns[T]} @@ -30,6 +31,11 @@ object Macro: Expr(TypeRepr.of[T].typeSymbol.flags.is(Flags.Enum)) + def isOpaqueType[T: Type](using Quotes): Expr[Boolean] = + import quotes.reflect.* + + Expr(TypeRepr.of[T].typeSymbol.flags.is(Flags.Opaque)) + def paramAnns[T: Type](using Quotes): Expr[List[(String, List[Any])]] = import quotes.reflect.* diff --git a/src/core/magnolia.scala b/src/core/magnolia.scala index 4d68bb64..319df33e 100644 --- a/src/core/magnolia.scala +++ b/src/core/magnolia.scala @@ -13,7 +13,7 @@ trait CommonDerivation[TypeClass[_]]: val parameters = IArray(getParams[A, product.MirroredElemLabels, product.MirroredElemTypes]( paramAnns[A].to(Map), paramTypeAnns[A].to(Map), repeated[A].to(Map))*) - val caseClass = new CaseClass[Typeclass, A](typeInfo[A], isObject[A], isValueClass[A], parameters, + val caseClass = new CaseClass[Typeclass, A](typeInfo[A], isObject[A], isValueClass[A], isOpaqueType[A], parameters, IArray(anns[A]*), IArray[Any](typeAnns[A]*)): def construct[PType](makeParam: Param => PType)(using ClassTag[PType]): A =