14

Following Scala mailing lists, different people often say: "compiler rewrites this [scala] code into this [java/scala??] code". For example, from one of the latest threads, if Scala sees

class C(i: Int = 4) { ... }

then the compiler rewrites this as (effectively):

class C(i: Int) { ... }
object C {
  def init$default$1: Int = 4
}

How can I find out, what will be the compiler output for my code? Should I decompile the resulting bytecode for that?

  • 3
    Scala compiler doesn't rewrite the code into Java code but compile Scala code into Java bytecode, which is different. Maybe you can "reverse engineer" this bytecode (with Jad) for example, to get a Java source code. – Benoit Courtine Sep 24 '10 at 07:15
  • 1
    I know that scala compiler [in some cases] rewrites original code. I've corrected now my original question. –  Sep 24 '10 at 07:19

2 Answers2

15

You can use "-print" as compiler option, and scalac will remove all Scala-specific features.

For example, here is the original code:

class Main
{
    def test (x: Any) = x match {
        case "Hello" => println ("Hello World")
        case e: String => println ("String")
        case i: Int => println ("Int")
        case _ => println ("Something else")
    }
}

And if you use "scalac -print" to compile it, you will get the following Scala code.

[[syntax trees at end of cleanup]]// Scala source: Test.scala
package <empty> {
  class Main extends java.lang.Object with ScalaObject {
    def test(x: java.lang.Object): Unit = {
      <synthetic> val temp1: java.lang.Object = x;
      if (temp1.==("Hello"))
        {
          scala.this.Predef.println("Hello World")
        }
      else
        if (temp1.$isInstanceOf[java.lang.String]())
          {
            scala.this.Predef.println("String")
          }
        else
          if (temp1.$isInstanceOf[Int]())
            {
              scala.this.Predef.println("Int")
            }
          else
            {
              scala.this.Predef.println("Something else")
            }
    };
    def this(): Main = {
      Main.super.this();
      ()
    }
  }
}
Brian Hsu
  • 8,781
  • 3
  • 47
  • 59
9

One can look at the generated bytecode with

javap -c -private ClassNameWithoutDotClass
Rex Kerr
  • 166,841
  • 26
  • 322
  • 407