PRL-PRG / scalafix-rule-workshop

A framework repository to create and test scalafix rules
2 stars 0 forks source link

Could not find symbol for arg _empty_.o.AnyJsonable#toJson()Ljava/lang/String;. #84

Open fikovnik opened 6 years ago

fikovnik commented 6 years ago

For

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)
    })

All works just fine.