/* sbt -- Simple Build Tool
 * Copyright 2008 David MacIver, Mark Harrah
 */
package sbt;

import scala.collection._

object object sbt.ReflectUtilitiesReflectUtilities
{
	def (String,Char)StringtransformCamelCase(Stringname: StringString, Charseparator: CharChar) =
	{
		val StringBuilderbuffer = ()StringBuildernew StringBuilderStringBuilder
		for(((Char) => Unit)Unitchar <- implicit scala.Predef.stringWrapper : (String)scala.runtime.RichStringname)
		{
			import java.lang.Character._
			Unitif((Char)BooleanisUpperCase(Charchar))
			{
				implicit scala.Predef.stringBuilderWrapper : (StringBuilder)scala.runtime.RichStringBuilderbuffer (Char)Unit+= Charseparator
				implicit scala.Predef.stringBuilderWrapper : (StringBuilder)scala.runtime.RichStringBuilderbuffer (Char)Unit+= (Char)ChartoLowerCase(Charchar)
			}
			else
				implicit scala.Predef.stringBuilderWrapper : (StringBuilder)scala.runtime.RichStringBuilderbuffer (Char)Unit+= Charchar
		}
		StringBuilderbuffer.()StringtoString
	}

	def (Class[_])List[Class[_]]ancestry(Class[_]clazz : Class[_]Class[_]) : List[Class[_]]List[Class[_]] = 
		List[Class[_]]if (Class[_]clazz (AnyRef)Boolean== java.lang.Class[AnyRef]classOf[AnyRef] (Boolean)Boolean|| => Boolean!java.lang.Class[AnyRef]classOf[AnyRef].(java.lang.Class[_])BooleanisAssignableFrom(Class[_]clazz)) (Class[_$1]*)List[Class[_$1]]List(Class[_]clazz)
		else Class[_]clazz (Class[_])List[Class[_]]:: (Class[_])List[Class[_]]ancestry(Class[_]clazz.(()java.lang.Class[_ >: _$1]) forSome { type _$1; type _$1 }getSuperclass);

	def (Class[_])scala.collection.mutable.OpenHashMap[java.lang.String,java.lang.reflect.Field]fields(Class[_]clazz : Class[_]Class[_]) = 
		mutable.((java.lang.String, java.lang.reflect.Field)*)scala.collection.mutable.OpenHashMap[java.lang.String,java.lang.reflect.Field]OpenHashMap((Class[_])List[Class[_]]ancestry(Class[_]clazz).
			((Class[_]) => Iterable[java.lang.reflect.Field])List[java.lang.reflect.Field]flatMap(Class[_]_.()Array[java.lang.reflect.Field]getDeclaredFields).
			((java.lang.reflect.Field) => (java.lang.String, java.lang.reflect.Field))List[(java.lang.String, java.lang.reflect.Field)]map(java.lang.reflect.Fieldf => (java.lang.String,java.lang.reflect.Field)(java.lang.String, java.lang.reflect.Field)(java.lang.reflect.Fieldf.()java.lang.StringgetName, java.lang.reflect.Fieldf)):_*)
	
	def [T](AnyRef,Class[T])scala.collection.Map[String,T]allValsC[>: Nothing <: AnyT](AnyRefself: AnyRefAnyRef, Class[T]clazz: Class[T]Class[T]): scala.collection.Map[String,T]Map[String, T] =
	{
		val scala.collection.mutable.OpenHashMap[String,T]mappings = ()scala.collection.mutable.OpenHashMap[String,T]new mutable.scala.collection.mutable.OpenHashMap[String,T]OpenHashMap[String, T]
		val scala.collection.mutable.OpenHashMap[java.lang.String,java.lang.reflect.Field]correspondingFields = (Class[_])scala.collection.mutable.OpenHashMap[java.lang.String,java.lang.reflect.Field]fields(AnyRefself.()java.lang.Class[_ <: java.lang.Object]getClass)
		for(((java.lang.reflect.Method) => Unit)Unitmethod <- AnyRefself.()java.lang.Class[_ <: java.lang.Object]getClass.()Array[java.lang.reflect.Method]getMethods)
		{
			Unitif(java.lang.reflect.Methodmethod.()Array[java.lang.Class[_]]getParameterTypes.=> Intlength (Int)Boolean== Int(0)0 (Boolean)Boolean&& Class[T]clazz.(java.lang.Class[_])BooleanisAssignableFrom(java.lang.reflect.Methodmethod.()java.lang.Class[_]getReturnType))
			{
				for(((java.lang.reflect.Field) => Unit)Unitfield <- scala.collection.mutable.OpenHashMap[java.lang.String,java.lang.reflect.Field]correspondingFields.(java.lang.String)Option[java.lang.reflect.Field]get(java.lang.reflect.Methodmethod.()java.lang.StringgetName) if java.lang.reflect.Fieldfield.()java.lang.Class[_]getType (AnyRef)Boolean== java.lang.reflect.Methodmethod.()java.lang.Class[_]getReturnType)
					scala.collection.mutable.OpenHashMap[String,T]mappings(java.lang.reflect.Methodmethod.()java.lang.StringgetName) = java.lang.reflect.Methodmethod.(Any,java.lang.Object*)java.lang.Objectinvoke(AnyRefself).TasInstanceOf[TT]
			}
		}
		scala.collection.mutable.OpenHashMap[String,T]mappings
	}
	def [T](AnyRef)(implicit scala.reflect.Manifest[T])scala.collection.Map[String,T]allVals[>: Nothing <: AnyT](AnyRefself: AnyRefAnyRef)(implicit scala.reflect.Manifest[T]mt: scala.reflect.scala.reflect.Manifest[T]Manifest[T]): scala.collection.Map[String,T]Map[String, T] =
		(AnyRef,Class[U])scala.collection.Map[String,U]allValsC(AnyRefself, scala.reflect.Manifest[T]mt.=> Class[_]erasure).scala.collection.Map[String,T]asInstanceOf[scala.collection.Map[String,T]Map[String,T]]
}