mirror of https://github.com/sbt/sbt.git
57 lines
1.7 KiB
Scala
57 lines
1.7 KiB
Scala
/* sbt -- Simple Build Tool
|
|
* Copyright 2008 David MacIver, Mark Harrah
|
|
*/
|
|
package sbt
|
|
|
|
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)
|
|
{
|
|
val value = method.invoke(self).asInstanceOf[T]
|
|
if(value == null) throw new UninitializedVal(method.getName, method.getDeclaringClass.getName)
|
|
mappings(method.getName) = value
|
|
}
|
|
}
|
|
}
|
|
mappings
|
|
}
|
|
def allVals[T](self: AnyRef)(implicit mt: scala.reflect.Manifest[T]): Map[String, T] =
|
|
allValsC(self, mt.erasure).asInstanceOf[Map[String,T]]
|
|
}
|
|
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.") |