simulacrum icon indicating copy to clipboard operation
simulacrum copied to clipboard

Document how to create a custom subclass of @typeclass annotation that specifies project specific settings

Open mpilquist opened this issue 10 years ago • 1 comments

Note: implementation of annotation filtering needs to be modified so that we can remove subtypes of simulacrum annotations.

mpilquist avatar Feb 05 '15 19:02 mpilquist

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]    ^

mpilquist avatar Feb 11 '15 13:02 mpilquist