src/Pure/General/untyped.scala
author wenzelm
Tue, 02 Dec 2014 16:40:11 +0100
changeset 59079 12a689755c3d
parent 58682 542fa5093ebf
child 59080 611914621edb
permissions -rw-r--r--
tuned signature -- more explicit types;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56905
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/untyped.scala
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     2
    Module:     PIDE
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     4
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     5
Untyped, unscoped, unchecked access to JVM objects.
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     6
*/
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     7
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     8
package isabelle
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
     9
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    10
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    11
object Untyped
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    12
{
58682
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    13
  def classes(obj: AnyRef): Iterator[Class[_ <: AnyRef]] = new Iterator[Class[_ <: AnyRef]] {
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    14
    private var next_elem: Class[_ <: AnyRef] = obj.getClass
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    15
    def hasNext(): Boolean = next_elem != null
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    16
    def next(): Class[_ <: AnyRef] = {
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    17
      val c = next_elem
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    18
      next_elem = c.getSuperclass.asInstanceOf[Class[_ <: AnyRef]]
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    19
      c
56905
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    20
    }
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    21
  }
58682
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    22
59079
12a689755c3d tuned signature -- more explicit types;
wenzelm
parents: 58682
diff changeset
    23
  def get[A](obj: AnyRef, x: String): A =
12a689755c3d tuned signature -- more explicit types;
wenzelm
parents: 58682
diff changeset
    24
    if (obj == null) null.asInstanceOf[A]
58682
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    25
    else {
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    26
      val iterator =
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    27
        for {
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    28
          c <- classes(obj)
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    29
          field <- c.getDeclaredFields.iterator
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    30
          if field.getName == x
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    31
        } yield {
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    32
          field.setAccessible(true)
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    33
          field.get(obj)
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    34
        }
59079
12a689755c3d tuned signature -- more explicit types;
wenzelm
parents: 58682
diff changeset
    35
      if (iterator.hasNext) iterator.next.asInstanceOf[A]
58682
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    36
      else error("No field " + quote(x) + " for " + obj)
542fa5093ebf access class hierarchy;
wenzelm
parents: 56905
diff changeset
    37
    }
56905
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    38
}
fb38a767a78b untyped, unscoped, unchecked access to JVM objects;
wenzelm
parents:
diff changeset
    39