package scala.tools.nsc
package backend.jvm
package opt
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.junit.Test
import scala.tools.asm.Opcodes._
import org.junit.Assert._
import CodeGenTools._
import scala.tools.nsc.backend.jvm.BTypes.{MethodInlineInfo, InlineInfo}
import scala.tools.partest.ASMConverters
import ASMConverters._
import scala.collection.convert.decorateAsScala._
object ScalaInlineInfoTest {
var compiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:l:none")
def clear(): Unit = { compiler = null }
}
@RunWith(classOf[JUnit4])
class ScalaInlineInfoTest {
val compiler = newCompiler()
@Test
def traitMembersInlineInfo(): Unit = {
val code =
"""trait T {
| def f1 = 1 // concrete method
| private def f2 = 1 // implOnly method (does not end up in the interface)
| def f3 = {
| def nest = 0 // nested method (does not end up in the interface)
| nest
| }
|
| @inline
| def f4 = super.toString // super accessor
|
| object O // module accessor (method is generated)
| def f5 = {
| object L { val x = 0 } // nested module (just flattened out)
| L.x
| }
|
| @noinline
| def f6: Int // abstract method (not in impl class)
|
| // fields
|
| val x1 = 0
| var y2 = 0
| var x3: Int
| lazy val x4 = 0
|
| final val x5 = 0
|}
""".stripMargin
val cs @ List(t, tl, to, tCls) = compileClasses(compiler)(code)
val List(info) = t.attrs.asScala.collect({ case a: InlineInfoAttribute => a.inlineInfo }).toList
val expect = InlineInfo(
None, // self type
false, // final class
Map(
("O()LT$O$;", MethodInlineInfo(true, false,false,false)),
("T$$super$toString()Ljava/lang/String;",MethodInlineInfo(false,false,false,false)),
("T$_setter_$x1_$eq(I)V", MethodInlineInfo(false,false,false,false)),
("f1()I", MethodInlineInfo(false,true, false,false)),
("f3()I", MethodInlineInfo(false,true, false,false)),
("f4()Ljava/lang/String;", MethodInlineInfo(false,true, true, false)),
("f5()I", MethodInlineInfo(false,true, false,false)),
("f6()I", MethodInlineInfo(false,false,false,true )),
("x1()I", MethodInlineInfo(false,false,false,false)),
("x3()I", MethodInlineInfo(false,false,false,false)),
("x3_$eq(I)V", MethodInlineInfo(false,false,false,false)),
("x4()I", MethodInlineInfo(false,false,false,false)),
("x5()I", MethodInlineInfo(true, false,false,false)),
("y2()I", MethodInlineInfo(false,false,false,false)),
("y2_$eq(I)V", MethodInlineInfo(false,false,false,false))),
None // warning
)
assert(info == expect, info)
}
}