miniboxing / value-plugin

Value class plugin using LDL.
Other
5 stars 1 forks source link

Extension methods don't play well with separate compilation #37

Open VladUreche opened 10 years ago

VladUreche commented 10 years ago

It's because in Scalac they're inserted before pickler, and now we're adding them after pickler.

In the meantime, you need to recompile everything from scratch to get the exentsion methods working:

sun@sun-cpu:/mnt/data1/Work/Workspace/dev-2.11/valium/sandbox(master)$ cat C.scala 
@value
class C (val c: Int) {
  def foo(): Unit = 
    println(s"We're in ${(new Exception).getStackTrace.toList.head}...")
}
sun@sun-cpu:/mnt/data1/Work/Workspace/dev-2.11/valium/sandbox(master)$ cat Test.scala 
object Test extends App {
  val c = new C(3)
  c.foo()
}
sun@sun-cpu:/mnt/data1/Work/Workspace/dev-2.11/valium/sandbox(master)$ ../va-scalac C.scala Test.scala 
sun@sun-cpu:/mnt/data1/Work/Workspace/dev-2.11/valium/sandbox(master)$ ../va-scala Test
We're in C$.foo$xtension(C.scala:4)...
sun@sun-cpu:/mnt/data1/Work/Workspace/dev-2.11/valium/sandbox(master)$ ../va-scalac Test.scala 
error: java.lang.AssertionError: assertion failed:
  no extension method found for:

  method foo:()Unit

 Candidates:

 Candidates (signatures normalized):

 Eligible Names: foo$xtension"
     while compiling: Test.scala
        during phase: globalPhase=valium-coerce, enteringPhase=valium-inject
     library version: version 2.11.1-20140519-130118-1e1defd99c
    compiler version: version 2.11.1-20140519-130118-1e1defd99c
  reconstructed args: -bootclasspath /mnt/data1/Work/Workspace/dev-2.11/valium/components/runtime/target/scala-2.11/valium-runtime_2.11-0.1-SNAPSHOT.jar:/mnt/data1/Work/Workspace/dev-2.11/valium/components/plugin/target/scala-2.11/valium-plugin_2.11-0.1-SNAPSHOT.jar -Xplugin:/mnt/data1/Work/Workspace/dev-2.11/valium/components/plugin/target/scala-2.11/valium-plugin_2.11-0.1-SNAPSHOT.jar

  last tree to typer: term c
       tree position: line 2 of Test.scala
            tree tpe: <notype>
              symbol: value c in object Test
   symbol definition: val c(): C (a MethodSymbol)
      symbol package: <empty>
       symbol owners: value c -> object Test
           call site: object Test in package <empty>

== Source file context for tree position ==

     0 object Test extends App {
     1   val c = new C(3)
     2   c.foo()
     3 }
    at valium.plugin.transform.addext.ValiumAddExtTreeTransformer$$anonfun$extensionMethod$1.apply(ValiumAddExtTreeTransformer.scala:81)
    at valium.plugin.transform.addext.ValiumAddExtTreeTransformer$$anonfun$extensionMethod$1.apply(ValiumAddExtTreeTransformer.scala:77)
    at scala.reflect.internal.SymbolTable.enteringPhase(SymbolTable.scala:242)
    at scala.reflect.internal.SymbolTable.exitingPhase(SymbolTable.scala:263)
    at valium.plugin.transform.ValiumAddExtPhase$class.afterAddExt(package.scala:70)
    at valium.plugin.Valium$ValiumAddExtPhaseObj$.afterAddExt(Valium.scala:68)
    at valium.plugin.transform.addext.ValiumAddExtTreeTransformer$class.extensionMethod(ValiumAddExtTreeTransformer.scala:77)
    at valium.plugin.Valium$ValiumAddExtPhaseObj$.extensionMethod(Valium.scala:68)
    at valium.plugin.transform.coerce.ValiumCoerceTreeTransformer$TreeAdapters$TreeAdapter.typed(ValiumCoerceTreeTransformer.scala:110)
    at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5361)
    at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedStat$1(Typers.scala:3000)
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$62.apply(Typers.scala:3104)
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$62.apply(Typers.scala:3104)
    at scala.collection.immutable.List.loop$1(List.scala:172)
    at scala.collection.immutable.List.mapConserve(List.scala:188)
    at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3104)
    at scala.tools.nsc.typechecker.Typers$Typer.typedTemplate(Typers.scala:1907)
    at scala.tools.nsc.typechecker.Typers$Typer.typedClassDef(Typers.scala:1753)
    at scala.tools.nsc.typechecker.Typers$Typer.typedMemberDef$1(Typers.scala:5218)
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5268)
    at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5305)
    at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5332)
    at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5279)
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5283)
    at valium.plugin.transform.coerce.ValiumCoerceTreeTransformer$TreeAdapters$TreeAdapter.retypecheck$1(ValiumCoerceTreeTransformer.scala:78)
    at valium.plugin.transform.coerce.ValiumCoerceTreeTransformer$TreeAdapters$TreeAdapter.typed(ValiumCoerceTreeTransformer.scala:131)
    at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5361)
    at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedStat$1(Typers.scala:3000)
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$62.apply(Typers.scala:3104)
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$62.apply(Typers.scala:3104)
    at scala.collection.immutable.List.loop$1(List.scala:172)
    at scala.collection.immutable.List.mapConserve(List.scala:188)
    at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3104)
    at scala.tools.nsc.typechecker.Typers$Typer.typedPackageDef$1(Typers.scala:4928)
    at scala.tools.nsc.typechecker.Typers$Typer.typedMemberDef$1(Typers.scala:5221)
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5268)
    at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5305)
    at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5332)
    at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5279)
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5283)
    at valium.plugin.transform.coerce.ValiumCoerceTreeTransformer$TreeAdapters$TreeAdapter.retypecheck$1(ValiumCoerceTreeTransformer.scala:78)
    at valium.plugin.transform.coerce.ValiumCoerceTreeTransformer$TreeAdapters$TreeAdapter.typed(ValiumCoerceTreeTransformer.scala:131)
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5357)
    at valium.plugin.transform.coerce.ValiumCoerceTreeTransformer$TreeAdapters.adapt(ValiumCoerceTreeTransformer.scala:44)
    at valium.plugin.transform.coerce.ValiumCoerceTreeTransformer$CoercePhase$$anonfun$1.apply(ValiumCoerceTreeTransformer.scala:23)
    at valium.plugin.transform.coerce.ValiumCoerceTreeTransformer$CoercePhase$$anonfun$1.apply(ValiumCoerceTreeTransformer.scala:23)
    at scala.reflect.internal.SymbolTable.enteringPhase(SymbolTable.scala:242)
    at scala.reflect.internal.SymbolTable.exitingPhase(SymbolTable.scala:263)
    at valium.plugin.transform.ValiumCoercePhase$class.afterCoerce(package.scala:102)
    at valium.plugin.Valium$ValiumCoercePhaseObj$.afterCoerce(Valium.scala:100)
    at valium.plugin.transform.coerce.ValiumCoerceTreeTransformer$CoercePhase.apply(ValiumCoerceTreeTransformer.scala:23)
    at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:430)
    at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:397)
    at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:397)
    at scala.collection.Iterator$class.foreach(Iterator.scala:743)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1174)
    at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:397)
    at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1625)
    at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1610)
    at scala.tools.nsc.Global$Run.compileSources(Global.scala:1605)
    at scala.tools.nsc.Global$Run.compile(Global.scala:1703)
    at scala.tools.nsc.Driver.doCompile(Driver.scala:34)
    at scala.tools.nsc.MainClass.doCompile(Main.scala:23)
    at scala.tools.nsc.Driver.process(Driver.scala:55)
    at scala.tools.nsc.Driver.main(Driver.scala:68)
    at scala.tools.nsc.Main.main(Main.scala)

sun@sun-cpu:/mnt/data1/Work/Workspace/dev-2.11/valium/sandbox(master)$ ../va-scalac C.scala Test.scala 
sun@sun-cpu:/mnt/data1/Work/Workspace/dev-2.11/valium/sandbox(master)$