in chill-scala/src/main/scala/com/twitter/chill/ClosureCleaner.scala [96:115]
def outerClassesOf(cls: Class[_]): List[Class[_]] =
outerClassHier.getOrElseUpdate(cls, getOuterClassesFn(cls))
/**
* returns the (Class, AnyRef) pair from highest level to lowest level so result.last is the outer of obj.
*/
@tailrec
def getOutersOf(obj: AnyRef, hierarchy: List[(Class[_], AnyRef)] = Nil): List[(Class[_], AnyRef)] =
outerFieldOf(obj.getClass) match {
case None => hierarchy // We have finished
case Some(f) =>
// f is the $outer of obj
f.setAccessible(true)
// myOuter = obj.$outer
val myOuter = f.get(obj)
// This is (Class[T], T) into the hierarchy:
// Note that if you use f.getType you might get an interface. No good
val outerType = myOuter.getClass
getOutersOf(myOuter, (outerType, myOuter) :: hierarchy)
}