summaryrefslogtreecommitdiff
path: root/test/pending/jvm/cf-attributes.scala
blob: 2d08f22d8b04654a5caca38624f2884331a66c45 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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()
    }
  }
*/