56905
|
1 |
/* Title: Pure/General/untyped.scala
|
|
2 |
Module: PIDE
|
|
3 |
Author: Makarius
|
|
4 |
|
|
5 |
Untyped, unscoped, unchecked access to JVM objects.
|
|
6 |
*/
|
|
7 |
|
|
8 |
package isabelle
|
|
9 |
|
|
10 |
|
|
11 |
object Untyped
|
|
12 |
{
|
58682
|
13 |
def classes(obj: AnyRef): Iterator[Class[_ <: AnyRef]] = new Iterator[Class[_ <: AnyRef]] {
|
|
14 |
private var next_elem: Class[_ <: AnyRef] = obj.getClass
|
|
15 |
def hasNext(): Boolean = next_elem != null
|
|
16 |
def next(): Class[_ <: AnyRef] = {
|
|
17 |
val c = next_elem
|
|
18 |
next_elem = c.getSuperclass.asInstanceOf[Class[_ <: AnyRef]]
|
|
19 |
c
|
56905
|
20 |
}
|
|
21 |
}
|
58682
|
22 |
|
59079
|
23 |
def get[A](obj: AnyRef, x: String): A =
|
|
24 |
if (obj == null) null.asInstanceOf[A]
|
58682
|
25 |
else {
|
|
26 |
val iterator =
|
|
27 |
for {
|
|
28 |
c <- classes(obj)
|
|
29 |
field <- c.getDeclaredFields.iterator
|
|
30 |
if field.getName == x
|
|
31 |
} yield {
|
|
32 |
field.setAccessible(true)
|
|
33 |
field.get(obj)
|
|
34 |
}
|
59079
|
35 |
if (iterator.hasNext) iterator.next.asInstanceOf[A]
|
58682
|
36 |
else error("No field " + quote(x) + " for " + obj)
|
|
37 |
}
|
56905
|
38 |
}
|
|
39 |
|