Giter Site home page Giter Site logo

scalalandio / catnip Goto Github PK

View Code? Open in Web Editor NEW
42.0 42.0 4.0 275 KB

Static annotations for Kittens for people who don't like to write semiautomatic derivations into companion objects themselves.

Home Page: https://scalalandio.github.io/catnip/

License: Apache License 2.0

Scala 98.80% Shell 1.20%
annotations cats kittens scala

catnip's People

Contributors

liff avatar mateuszkubuszok avatar oleg-py avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

catnip's Issues

Add support for `cats.kernel.Hash`

So far I was unable to make

import cats.instances._

final case class Test[A](a: A)

cats.derived.semi.emptyK[Test]

compile. Since Pure requires EmptyK, it stops both derivations from happening in @Semi.

I guess importing cats.derived.auto._ would help but I hope for some better solution.

Add support for Scala 2.13 and cats 2.0.0

Currently it would require some nasty if-o-logy in build since, e.g. macro-paradise is published up to 2.13.0-M3 while wartremover from 2.13.0-M4, so a lot of settings would have to be worked around if project were to still use these plugins.

Support cases where more type-classes are needed for type-parametrized derivation

E.g.

import cats.implicits._
final case class Test[A](a: A)
def showA[A: cats.Show]: cats.Show[Test[A]] = cats.derived.semi.show[Test[A]]

fails with

could not find implicit value for parameter ev: cats.derived.MkShow[ammonite.$sess.cmd5.Test[A]]
def gen[A: cats.derived.MkShow]: cats.Show[Test[A]] = cats.derived.semi.show[Test[A]]
                                                                            ^

As seem here is can be solved by adding another type-class to the table (here: shapeless.Typeable).

There should be a way of adding these additional type classes to the generated code to make it possible to handle such cases.

Update dependencies (scala-steward?)

I was trying to use this for our project, and noticed that this isn't up to date. The new cats-kittens version renamed their package:

cats.derived.semi.* -> cats.derived.semiauto.*

Would be great if catnip can upgrade cats-kittens to the latest (along all the other dependencies) so we can use this in our projects!

Perhaps integrating with scala-steward would a good idea as well!

Cannot run tests on cloned project

Hello. I cloned the project and tried to run tests on catnipTestsJVM subproject and got this error. Tried on Mac and Windows machines that I have:

[error] java.lang.NoClassDefFoundError: Could not initialize class io.scalaland.catnip.internals.DerivedImpl$
[error]         at io.scalaland.catnip.Semi$.impl(Semi.scala:17)
[error]         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error]         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error]         at java.lang.reflect.Method.invoke(Method.java:498)
[error]         at scala.reflect.macros.runtime.JavaReflectionRuntimes$JavaReflectionResolvers.$anonfun$resolveJavaReflectionRuntime$4(JavaReflectionRuntimes.scala:34)
[error]         at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime(Macros.scala:803)
[error]         at scala.tools.nsc.typechecker.Macros.macroExpandWithRuntime$(Macros.scala:779)
[error]         at scala.tools.nsc.Global$$anon$1.macroExpandWithRuntime(Global.scala:448)
[error]         at scala.tools.nsc.typechecker.Macros$MacroExpander.$anonfun$expand$1(Macros.scala:620)
[error]         at scala.tools.nsc.Global.withInfoLevel(Global.scala:219)
[error]         at scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:613)
[error]         at scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:600)
[error]         at org.scalamacros.paradise.typechecker.Expanders$Expander.expand$1(Expanders.scala:64)
[error]         at org.scalamacros.paradise.typechecker.Expanders$Expander.$anonfun$expandAnnotationMacro$2(Expanders.scala:121)
[error]         at org.scalamacros.paradise.typechecker.Expanders$Expander.onlyIfExpansionAllowed$1(Expanders.scala:58)
[error]         at org.scalamacros.paradise.typechecker.Expanders$Expander.expandAnnotationMacro(Expanders.scala:121)
[error]         at org.scalamacros.paradise.typechecker.Expanders$Expander.expandAnnotationMacro$(Expanders.scala:32)
[error]         at org.scalamacros.paradise.typechecker.Namers$$anon$3.expandAnnotationMacro(Namers.scala:13)
[error]         at org.scalamacros.paradise.typechecker.Namers$Namer$$anon$2.maybeExpand$1(Namers.scala:371)
[error]         at org.scalamacros.paradise.typechecker.Namers$Namer$$anon$2.$anonfun$maybeExpand$2(Namers.scala:383)
[error]         at scala.collection.immutable.Stream.flatMap(Stream.scala:486)
[error]         at org.scalamacros.paradise.typechecker.Namers$Namer$$anon$2.maybeExpand(Namers.scala:383)
[error]         at org.scalamacros.paradise.typechecker.Namers$Namer$MaybeExpandeeCompleter.completeImpl(Namers.scala:333)
[error]         at org.scalamacros.paradise.typechecker.Namers$Namer$MaybeExpandeeCompleter.complete(Namers.scala:323)
[error]         at org.scalamacros.paradise.typechecker.Namers$Namer$RichType.completeOnlyExpansions(Namers.scala:351)
[error]         at org.scalamacros.paradise.typechecker.Expanders$Expander.$anonfun$expandMacroAnnotations$2(Expanders.scala:148)
[error]         at scala.collection.immutable.List.flatMap(List.scala:335)
[error]         at org.scalamacros.paradise.typechecker.Expanders$Expander.expandMacroAnnotations(Expanders.scala:141)
[error]         at org.scalamacros.paradise.typechecker.Expanders$Expander.expandMacroAnnotations$(Expanders.scala:128)
[error]         at org.scalamacros.paradise.typechecker.Expanders$$anon$1.expandMacroAnnotations(Expanders.scala:14)
[error]         at org.scalamacros.paradise.typechecker.AnalyzerPlugins$MacroPlugin$.pluginsEnterStats(AnalyzerPlugins.scala:33)
[error]         at scala.tools.nsc.typechecker.AnalyzerPlugins.$anonfun$pluginsEnterStats$1(AnalyzerPlugins.scala:482)
[error]         at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsEnterStats(AnalyzerPlugins.scala:481)
[error]         at scala.tools.nsc.typechecker.AnalyzerPlugins.pluginsEnterStats$(AnalyzerPlugins.scala:478)
[error]         at scala.tools.nsc.Global$$anon$1.pluginsEnterStats(Global.scala:448)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:2422)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typed1$97(Typers.scala:5561)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedOutsidePatternMode$1(Typers.scala:486)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5596)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedArg$1(Typers.scala:3290)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedArg(Typers.scala:477)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedArg0$1(Typers.scala:3433)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$doTypedApply$14(Typers.scala:3453)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$doTypedApply$13(Typers.scala:3423)
[error]         at scala.tools.nsc.typechecker.Contexts$Context.$anonfun$savingUndeterminedTypeParams$1(Contexts.scala:328)
[error]         at scala.tools.nsc.typechecker.Contexts$Context.savingUndeterminedTypeParams(Contexts.scala:392)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.handleOverloaded$1(Typers.scala:3420)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.doTypedApply(Typers.scala:3464)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typed1$25(Typers.scala:4687)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$silent$2(Typers.scala:714)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.silent(Typers.scala:714)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.tryTypedApply$1(Typers.scala:4687)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:4771)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4801)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5586)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5703)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:3129)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3274)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3274)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:2475)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typed1$97(Typers.scala:5561)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedOutsidePatternMode$1(Typers.scala:486)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5596)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedArg$1(Typers.scala:3290)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedArg(Typers.scala:477)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedArg0$1(Typers.scala:3433)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$doTypedApply$14(Typers.scala:3453)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$doTypedApply$13(Typers.scala:3423)
[error]         at scala.tools.nsc.typechecker.Contexts$Context.$anonfun$savingUndeterminedTypeParams$1(Contexts.scala:328)
[error]         at scala.tools.nsc.typechecker.Contexts$Context.savingUndeterminedTypeParams(Contexts.scala:392)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.handleOverloaded$1(Typers.scala:3420)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.doTypedApply(Typers.scala:3464)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typed1$25(Typers.scala:4687)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.silent(Typers.scala:700)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.tryTypedApply$1(Typers.scala:4687)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:4771)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4801)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5586)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5603)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5703)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:3129)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3274)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3274)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedTemplate(Typers.scala:2006)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedClassDef(Typers.scala:1829)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedMemberDef$1(Typers.scala:5552)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5602)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5703)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:3129)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3274)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3274)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedPackageDef$1(Typers.scala:5262)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedMemberDef$1(Typers.scala:5555)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5602)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5640)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5672)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5613)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5618)
[error]         at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5699)
[error]         at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.apply(Analyzer.scala:104)
[error]         at scala.tools.nsc.Global$GlobalPhase.$anonfun$applyPhase$1(Global.scala:426)
[error]         at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:419)
[error]         at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.$anonfun$run$1(Analyzer.scala:94)
[error]         at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.$anonfun$run$1$adapted(Analyzer.scala:93)
[error]         at scala.collection.Iterator.foreach(Iterator.scala:944)
[error]         at scala.collection.Iterator.foreach$(Iterator.scala:944)
[error]         at scala.collection.AbstractIterator.foreach(Iterator.scala:1432)
[error]         at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.run(Analyzer.scala:93)
[error]         at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1446)
[error]         at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1430)
[error]         at scala.tools.nsc.Global$Run.compileSources(Global.scala:1423)
[error]         at scala.tools.nsc.Global$Run.compile(Global.scala:1539)
[error]         at xsbt.CachedCompiler0.run(CompilerInterface.scala:130)
[error]         at xsbt.CachedCompiler0.run(CompilerInterface.scala:105)
[error]         at xsbt.CompilerInterface.run(CompilerInterface.scala:31)
[error]         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error]         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error]         at java.lang.reflect.Method.invoke(Method.java:498)
[error]         at sbt.internal.inc.AnalyzingCompiler.call(AnalyzingCompiler.scala:237)
[error]         at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:111)
[error]         at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:90)
[error]         at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$3(MixedAnalyzingCompiler.scala:82)
[error]         at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error]         at sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:133)
[error]         at sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:73)
[error]         at sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:116)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:307)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:307)
[error]         at sbt.internal.inc.Incremental$.doCompile(Incremental.scala:106)
[error]         at sbt.internal.inc.Incremental$.$anonfun$compile$4(Incremental.scala:87)
[error]         at sbt.internal.inc.IncrementalCommon.recompileClasses(IncrementalCommon.scala:116)
[error]         at sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:63)
[error]         at sbt.internal.inc.Incremental$.$anonfun$compile$3(Incremental.scala:89)
[error]         at sbt.internal.inc.Incremental$.manageClassfiles(Incremental.scala:134)
[error]         at sbt.internal.inc.Incremental$.compile(Incremental.scala:80)
[error]         at sbt.internal.inc.IncrementalCompile$.apply(Compile.scala:67)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:311)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:269)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:159)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:238)
[error]         at sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:69)
[error]         at sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:1533)
[error]         at sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:1507)
[error]         at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error]         at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:40)
[error]         at sbt.std.Transform$$anon$4.work(System.scala:67)
[error]         at sbt.Execute.$anonfun$submit$2(Execute.scala:269)
[error]         at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error]         at sbt.Execute.work(Execute.scala:278)
[error]         at sbt.Execute.$anonfun$submit$1(Execute.scala:269)
[error]         at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[error]         at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[error]         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error]         at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error]         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error]         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[error]         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[error]         at java.lang.Thread.run(Thread.java:748)

"knownDirectSubclasses observed before subclass" when deriving for sealed trait

Deriving for a case class works great:

@Semi(Show) case class Foo(a: Int) 

Derivation for ADT's is a bit brittle though:

@Semi(Show) sealed trait Tree
case class Node(nodes: List[Tree]) extends Tree
case class Leaf(label: String) extends Tree
// ๐Ÿ‘ŽCould not derive an instance of Show[Tree]
//implicit val _derived_cats_Show: cats.Show[Tree] = cats.derived.semi.show[Tree]
//knownDirectSubclasses of Tree observed before subclass Node registered
//knownDirectSubclasses of Tree observed before subclass Leaf registered

That's a pityโ€”it's the first thing people will try (at least that's what I went for).

Naturally, the same error occurs with direct use of Kittens:

sealed trait Tree
object Tree {
  implicit val showTree: Show[Tree] = cats.derived.semi.show
}
case class Node(nodes: List[Tree]) extends Tree
case class Leaf(label: String) extends Tree
// ๐Ÿ‘ŽCould not derive an instance of Show[A]
//knownDirectSubclasses of Tree observed before subclass Node registered
//knownDirectSubclasses of Tree observed before subclass Leaf registered

Placing the companion object below the subclasses solves the problem:

sealed trait Tree
case class Node(nodes: List[Tree]) extends Tree
case class Leaf(label: String) extends Tree
object Tree {
  implicit val showTree: Show[Tree] = cats.derived.semi.show
}
// ๐Ÿ‘ 

But the @Semi annotation only works on the case class itself:

sealed trait Tree
case class Node(nodes: List[Tree]) extends Tree
case class Leaf(label: String) extends Tree
@Semi(Show) object Tree
// ๐Ÿ‘Ž@Semi can only annotate class, got: ...

How about allowing @Semi to be placed on the companion?
Adding a bit of docs around this pitfall might also help.


P.s. The first two things I tried failed, but the following alternatives work fine:

case class Node(nodes: List[Tree]) extends Tree
case class Leaf(label: String) extends Tree
@Semi(Show) sealed trait Tree
@Semi(Show) sealed trait Tree
object Tree {
  case class Node(nodes: List[Tree]) extends Tree
  case class Leaf(label: String) extends Tree
}
sealed trait Tree
case class Node(nodes: List[Tree]) extends Tree
case class Leaf(label: String) extends Tree
@Semi(Show) object Tree

Local imports and type aliases

Figure out if issues like:

  • type checker complains if you use type aliases from the same compilation unit
    type X = cats.Eq; val X = cats.Eq
    @Semi(X) final case class Test(a: String)
    // scala.reflect.macros.TypecheckException: not found: type X
  • same if you rename type during import
    import cats.{ Eq => X }
    @Semi(X) final case class Test(a: String)
    // scala.reflect.macros.TypecheckException: not found: type X

can be fixed.

Currently marked as known issues, but I have no idea how to approach it.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.