Skip to content

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

@VladUreche

Description

@VladUreche

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions