2009-06-26 03:26:06 +02:00
/* sbt -- Simple Build Tool
* Copyright 2008 David MacIver , Mark Harrah
*/
2010-07-05 18:53:37 +02:00
package sbt
2009-06-26 03:26:06 +02:00
import scala.collection._
object ReflectUtilities
{
def transformCamelCase ( name : String , separator : Char ) =
{
val buffer = new StringBuilder
for ( char <- name )
{
import java.lang.Character._
if ( isUpperCase ( char ) )
{
buffer += separator
buffer += toLowerCase ( char )
}
else
buffer += char
}
buffer . toString
}
def ancestry ( clazz : Class [ _ ] ) : List [ Class [ _ ] ] =
if ( clazz == classOf [ AnyRef ] || ! classOf [ AnyRef ] . isAssignableFrom ( clazz ) ) List ( clazz )
else clazz : : ancestry ( clazz . getSuperclass ) ;
def fields ( clazz : Class [ _ ] ) =
mutable . OpenHashMap ( ancestry ( clazz ) .
flatMap ( _ . getDeclaredFields ) .
map ( f => ( f . getName , f ) ) : _ * )
def allValsC [ T ] ( self : AnyRef , clazz : Class [ T ] ) : Map [ String , T ] =
{
val mappings = new mutable . OpenHashMap [ String , T ]
val correspondingFields = fields ( self . getClass )
for ( method <- self . getClass . getMethods )
{
if ( method . getParameterTypes . length == 0 && clazz . isAssignableFrom ( method . getReturnType ) )
{
for ( field <- correspondingFields . get ( method . getName ) if field . getType == method . getReturnType )
2009-08-02 03:12:24 +02:00
{
val value = method . invoke ( self ) . asInstanceOf [ T ]
2009-10-22 01:06:33 +02:00
if ( value == null ) throw new UninitializedVal ( method . getName , method . getDeclaringClass . getName )
2009-08-02 03:12:24 +02:00
mappings ( method . getName ) = value
}
2009-06-26 03:26:06 +02:00
}
}
mappings
}
def allVals [ T ] ( self : AnyRef ) ( implicit mt : scala.reflect.Manifest [ T ] ) : Map [ String , T ] =
allValsC ( self , mt . erasure ) . asInstanceOf [ Map [ String ,T ] ]
}
2009-10-22 01:06:33 +02:00
final class UninitializedVal ( val valName : String , val className : String ) extends RuntimeException ( "val " + valName + " in class " + className + " was null.\nThis is probably an initialization problem and a 'lazy val' should be used." )