checkReflContext(
"my implicit call",
"""
| object o {
| trait Jsonable[A] {
| def toJson(x: A): String
| }
|
| case class X(x: Int)
|
| implicit val XJsonable = new Jsonable[X] {
| def toJson(x: X) = s"{x: ${x.x}}"
| }
|
| implicit class AnyJsonable[A: Jsonable](that: A) {
| def toJson: String = implicitly[Jsonable[A]].toJson(that)
| }
|
| X(1).toJson
|}
""".stripMargin,
{ ctx =>
val res: ImplicitAnalysisResult = FailFastReflectExtract(ctx)
})
I get:
Could not find symbol for arg _empty_.o.AnyJsonable#toJson()Ljava/lang/String;.
java.lang.RuntimeException: Could not find symbol for arg _empty_.o.AnyJsonable#toJson()Ljava/lang/String;.
at cz.cvut.fit.prl.scalaimplicit.core.extractor.contexts.ReflectiveCtx$Finders$.logAndThrow(ReflectiveCtx.scala:79)
at cz.cvut.fit.prl.scalaimplicit.core.extractor.contexts.ReflectiveCtx$Finders$.findDefnSymbol(ReflectiveCtx.scala:121)
at cz.cvut.fit.prl.scalaimplicit.core.extractor.contexts.ReflectiveCtx.reflectOnDefn(ReflectiveCtx.scala:73)
at cz.cvut.fit.prl.scalaimplicit.core.extractor.decomposers.DefnDecomposer$$anonfun$apply$1$$anonfun$1.apply(DefnDecomposer.scala:49)
at cz.cvut.fit.prl.scalaimplicit.core.extractor.decomposers.DefnDecomposer$$anonfun$apply$1$$anonfun$1.apply(DefnDecomposer.scala:49)
at scala.util.Try$.apply(Try.scala:192)
at cz.cvut.fit.prl.scalaimplicit.core.extractor.decomposers.DefnDecomposer$$anonfun$apply$1.apply(DefnDecomposer.scala:49)
at cz.cvut.fit.prl.scalaimplicit.core.extractor.decomposers.DefnDecomposer$$anonfun$apply$1.apply(DefnDecomposer.scala:47)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.immutable.List.foreach(List.scala:392)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.immutable.List.map(List.scala:296)
at cz.cvut.fit.prl.scalaimplicit.core.extractor.decomposers.DefnDecomposer$.apply(DefnDecomposer.scala:47)
at cz.cvut.fit.prl.scalaimplicit.core.extractor.DefnExtractionUtils$.getDefn(ReflectExtract.scala:149)
at cz.cvut.fit.prl.scalaimplicit.core.extractor.FailFastReflectExtract$$anonfun$failFastExtractDeclarations$1.apply(ReflectExtract.scala:236)
at cz.cvut.fit.prl.scalaimplicit.core.extractor.FailFastReflectExtract$$anonfun$failFastExtractDeclarations$1.apply(ReflectExtract.scala:236)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.immutable.List.foreach(List.scala:392)
at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
at scala.collection.immutable.List.flatMap(List.scala:355)
at cz.cvut.fit.prl.scalaimplicit.core.extractor.FailFastReflectExtract$.failFastExtractDeclarations(ReflectExtract.scala:236)
at cz.cvut.fit.prl.scalaimplicit.core.extractor.FailFastReflectExtract$.apply(ReflectExtract.scala:244)
at cz.cvut.fit.prl.scalaimplicit.query.QueriesTest$$anonfun$1.apply(QueriesTest.scala:156)
at cz.cvut.fit.prl.scalaimplicit.query.QueriesTest$$anonfun$1.apply(QueriesTest.scala:155)
at cz.cvut.fit.prl.scalaimplicit.core.framework.SemanticdbTest$$anonfun$checkReflContext$1.apply$mcV$sp(SemanticdbTest.scala:175)
at cz.cvut.fit.prl.scalaimplicit.core.framework.SemanticdbTest$$anonfun$checkReflContext$1.apply(SemanticdbTest.scala:167)
at cz.cvut.fit.prl.scalaimplicit.core.framework.SemanticdbTest$$anonfun$checkReflContext$1.apply(SemanticdbTest.scala:167)
at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
at org.scalatest.Transformer.apply(Transformer.scala:22)
at org.scalatest.Transformer.apply(Transformer.scala:20)
at org.scalatest.FunSuiteLike$$anon$1.apply(FunSuiteLike.scala:186)
at org.scalatest.TestSuite$class.withFixture(TestSuite.scala:196)
at org.scalatest.FunSuite.withFixture(FunSuite.scala:1560)
at org.scalatest.FunSuiteLike$class.invokeWithFixture$1(FunSuiteLike.scala:183)
at org.scalatest.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:196)
at org.scalatest.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:196)
at org.scalatest.SuperEngine.runTestImpl(Engine.scala:289)
at org.scalatest.FunSuiteLike$class.runTest(FunSuiteLike.scala:196)
at org.scalatest.FunSuite.runTest(FunSuite.scala:1560)
at org.scalatest.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:229)
at org.scalatest.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:229)
at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:396)
at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:384)
at scala.collection.immutable.List.foreach(List.scala:392)
at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:384)
at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:379)
at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:461)
at org.scalatest.FunSuiteLike$class.runTests(FunSuiteLike.scala:229)
at org.scalatest.FunSuite.runTests(FunSuite.scala:1560)
at org.scalatest.Suite$class.run(Suite.scala:1147)
at org.scalatest.FunSuite.org$scalatest$FunSuiteLike$$super$run(FunSuite.scala:1560)
at org.scalatest.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:233)
at org.scalatest.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:233)
at org.scalatest.SuperEngine.runImpl(Engine.scala:521)
at org.scalatest.FunSuiteLike$class.run(FunSuiteLike.scala:233)
at org.scalatest.FunSuite.run(FunSuite.scala:1560)
at org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:45)
at org.scalatest.tools.Runner$$anonfun$doRunRunRunDaDoRunRun$1.apply(Runner.scala:1340)
at org.scalatest.tools.Runner$$anonfun$doRunRunRunDaDoRunRun$1.apply(Runner.scala:1334)
at scala.collection.immutable.List.foreach(List.scala:392)
at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1334)
at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1011)
at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1010)
at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1500)
at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1010)
at org.scalatest.tools.Runner$.run(Runner.scala:850)
at org.scalatest.tools.Runner.run(Runner.scala)
at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:131)
at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:28)
However, as @blorente found, if we swap the definition of implicit val and implicit class like:
checkReflContext(
"my implicit call",
"""
| object o {
| trait Jsonable[A] {
| def toJson(x: A): String
| }
|
| case class X(x: Int)
|
| implicit val XJsonable = new Jsonable[X] {
| def toJson(x: X) = s"{x: ${x.x}}"
| }
|
| implicit class AnyJsonable[A: Jsonable](that: A) {
| def toJson: String = implicitly[Jsonable[A]].toJson(that)
| }
|
| X(1).toJson
|}
""".stripMargin,
{ ctx =>
val res: ImplicitAnalysisResult = FailFastReflectExtract(ctx)
})
For
I get:
However, as @blorente found, if we swap the definition of implicit val and implicit class like:
All works just fine.