blob: 2d08f22d8b04654a5caca38624f2884331a66c45 (
plain) (
tree)
|
|
object Test extends Application {
InnerClassTest1
InnerClassTest2
}
object InnerClassTest1 extends Test1 {
printClass(anonymousFunctions.getClass)
printClass(anonymousFunctions.bar.getClass)
println(anonymousClasses.x) // see run/t1167.scala
printClass(anonymousClasses.getClass)
}
object InnerClassTest2 extends Test2 {
printClass(anonymousFunctions.getClass)
printClass(anonymousFunctions.bar.getClass)
printClass(anonymousClasses.getClass)
// not accessible via the Java reflection API
printClass("anonymousFunctions$$anonfun$3")
printClass("anonymousFunctions$$anonfun$foo$1")
printClass("anonymousFunctions$bar$$anonfun$4")
printClass("anonymousClasses$$anon$1")
}
object anonymousFunctions {
//InnerClass:
// public final #_ of #_; //class anonymousFunctions$$anonfun$1 of class InnerClass$
val twice = (x: Int) => 2*x
//InnerClass:
// public final #_ of #_; //class anonymousFunctions$$anonfun$2
List(0).map(x => x+1)
def foo {
//InnerClass:
// public final #_ of #_; class anonymousFunctions$$anonfun$3
val square = (x: Int) => x*x
//InnerClass:
// public final #_ of #_; class anonymousFunctions$$anonfun$foo$1
Array(1).filter(_ % 2 == 0)
}
object bar {
//InnerClass:
// public final #_ of #_; class anonymousFunctions$bar$$anonfun$4 of class anonymousFunctions$bar$
val cube = (x: Int) => x*x*x
//InnerClass:
// public final #_ of #_; class anonymousFunctions$bar$$anonfun$5
Set(1, 2, 3).exists(_ == 2)
}
}
object anonymousClasses {
//InnerClass:
// public abstract #_= #_ of #_; //Foo=class anonymousClasses$Foo of class anonymousClasses$
// public abstract #_= #_ of #_; //Foo$class=class anonymousClasses$Foo$class of class anonymousClasses$
trait Foo {
def foo() { println("foo"); }
override def toString = getClass.getName
}
//InnerClass:
// public final #_; //class anonymousClasses$$anon$1 of class anonymousClasses$
val x = new Foo() {
override def foo() { println("foo (overridden)"); }
def dummy = 0
}
}
// Auxiliary functions
trait Test1 {
private var kind: String = _
private var mods: String = _
def printInnerClasses(cls: Class[_]) {
for (c <- cls.getDeclaredClasses) {
mods = AccessFlags.asString(c.getModifiers)
kind = if (c.isInterface) "interface" else "class"
println(" "+mods+kind+" "+c.getName+
" of class "+c.getEnclosingClass.getName)
}
}
def printClass(cls: Class[_]) {
println("\n{{ "+cls.getName+" }}")
printInnerClasses(cls)
}
}
trait Test2 {
@throws(classOf[Exception])
// def printInnerClasses(cls: Class[_]) {
// import java.io._, ch.epfl.lamp.fjbg._
// val fjbgContext = new FJBGContext(49, 0)
// val outDir = System.getProperty("partest.output", "cf-attributes.obj")
// val fileName = outDir+File.separator+cls.getName+".class"
// val in = new DataInputStream(new FileInputStream(fileName))
// val jclass = fjbgContext.JClass(in)
// println(jclass.getInnerClasses)
// in.close()
// }
def printClass(name: String) {
try { printClass(Class.forName(name)) }
catch { case e: Exception => println(e) }
}
def printClass(cls: Class[_]) {
println("\n[[ "+cls.getName+" ]]");
try { printInnerClasses(cls) }
catch { case e: Exception => println(e) }
}
}
object AccessFlags {
val ACC_PUBLIC = 0x0001
val ACC_PRIVATE = 0x0002
val ACC_PROTECTED = 0x0004
val ACC_STATIC = 0x0008
val ACC_FINAL = 0x0010
val ACC_ABSTRACT = 0x0400
def asString(accessFlags: Int): String = {
val buf = new StringBuilder()
if ((accessFlags & ACC_PUBLIC) != 0) buf.append("public ")
else if ((accessFlags & ACC_PROTECTED) != 0) buf.append("protected ")
else if ((accessFlags & ACC_PRIVATE) != 0) buf.append("private ")
if ((accessFlags & ACC_ABSTRACT) != 0) buf.append("abstract ")
else if ((accessFlags & ACC_FINAL) != 0) buf.append("final ")
buf.toString
}
}
/*
implicit def stringToLines(s: String) = new {
def lines(n: Int): String = {
val buf = new StringBuilder();
var i = 0
var from = 0
while (i < n && 0 <= from && from < s.length) {
val pos = s.indexOf('\n', from)
if (pos >= 0) { i += 1; buf.append(s.substring(from, pos + 1)); }
from = pos + 1
}
buf.toString()
}
}
*/
|