simulacrum
simulacrum copied to clipboard
Document how to create a custom subclass of @typeclass annotation that specifies project specific settings
Note: implementation of annotation filtering needs to be modified so that we can remove subtypes of simulacrum annotations.
I have not been able to get this to work within the confines of macro annotations. Specifically, I access the annotation application by reflecting on c.prefix.tree. When using a custom subclass of @typeclass that defaults some arguments, we need to be able to evaluate the annotation in order to access the defaulted fields. However, evaluating it does not work. For example:
c.eval(c.Expr[TypeclassApi](c.untypecheck(c.prefix.tree.duplicate)))
Results in:
custom.scala:6: exception during macro expansion:
[error] scala.tools.reflect.ToolBoxError: reflective compilation has failed:
[error]
[error] not found: type mytypeclass
[error] at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.throwIfErrors(ToolBoxFactory.scala:316)
[error] at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.wrapInPackageAndCompile(ToolBoxFactory.scala:198)
[error] at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.compile(ToolBoxFactory.scala:252)
[error] at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$$anonfun$compile$2.apply(ToolBoxFactory.scala:429)
[error] at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$$anonfun$compile$2.apply(ToolBoxFactory.scala:422)
[error] at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$withCompilerApi$.liftedTree2$1(ToolBoxFactory.scala:355)
[error] at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$withCompilerApi$.apply(ToolBoxFactory.scala:355)
[error] at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.compile(ToolBoxFactory.scala:422)
[error] at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.eval(ToolBoxFactory.scala:444)
[error] at scala.reflect.macros.contexts.Evals$class.eval(Evals.scala:20)
[error] at scala.reflect.macros.contexts.Context.eval(Context.scala:6)
[error] at simulacrum.TypeClassMacros$.generateTypeClass(typeclass.scala:78)
[error] @mytypeclass trait Semigroup[A] {
[error] ^