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

trait trait Described extends java.lang.Object with NotNullDescribed extends NotNullNotNull
{
	def => Option[String]description: Option[String]Option[String]
}
trait trait TaskManager extends java.lang.Object with ScalaObjectTaskManager{
	type >: TaskManager.this.type <: sbt.TaskManagerManagerType >: this.type <: TaskManager
	type >: TaskManager.this.Task <: sbt.TaskManager#Task with sbt.Dag[TaskManager.this.ManagedTask]ManagedTask >: Task <: TaskManager#Task with Dag[ManagedTask]
	/** Creates a task that executes the given action when invoked.*/
	def (=> Option[String])TaskManager.this.Tasktask(=> Option[String]action : => Option[String]) = TaskManager.this.Tasknew TaskManager.this.TaskTask(object NoneNone, object NilNil, Boolean(false)false, => Option[String]action)
	/** An interactive task is one that is not executed across all dependent projects when
	* it is called directly.  The dependencies of the task are still invoked across all dependent
	* projects, however. */
	def (=> Option[String])TaskManager.this.TaskinteractiveTask(=> Option[String]action: => Option[String]) = TaskManager.this.Tasknew TaskManager.this.TaskTask(object NoneNone, object NilNil, Boolean(true)true, => Option[String]action)
	/** Creates a method task that executes the given action when invoked. */
	def ((Array[String]) => TaskManager.this.ManagedTask)TaskManager.this.MethodTasktask((Array[String]) => TaskManager.this.ManagedTaskaction: Array[String] => ManagedTask) = TaskManager.this.MethodTasknew TaskManager.this.MethodTaskMethodTask(object NoneNone, (Array[String]) => TaskManager.this.ManagedTaskaction, object NilNil)
	
	/** A method task is an action that has parameters.  Note that it is not a Task, though,
	* because it requires arguments to perform its work.  It therefore cannot be a dependency of
	* a Task..*/
	final class class MethodTask extends java.lang.Object with sbt.Described with ScalaObjectMethodTask(val Option[String]description: Option[String]Option[String], (Array[String]) => TaskManager.this.ManagedTaskaction: Array[String] => ManagedTask, val List[String]completions: List[String]List[String]) extends sbt.DescribedDescribed
	{
		/** Creates a new method task, identical to this method task, except with thE[String]e given description.*/
		def (String)TaskManager.this.MethodTaskdescribedAs(Stringdescription : StringString) = TaskManager.this.MethodTasknew TaskManager.this.MethodTaskMethodTask((String)Some[String]Some(Stringdescription), (Array[String]) => TaskManager.this.ManagedTaskaction, => List[String]completions)
		/** Invokes this method task with the given arguments.*/
		def (Array[String])TaskManager.this.ManagedTaskapply(Array[String]arguments: Array[String]Array[String]) = (Array[String])TaskManager.this.ManagedTaskaction(Array[String]arguments)
		def => TaskManager.this.ManagerTypemanager: TaskManager.this.ManagerTypeManagerType = TaskManager.this.typeTaskManager.this
		def (Iterable[String])TaskManager.this.MethodTaskcompleteWith(Iterable[String]add: Iterable[String]Iterable[String]) = TaskManager.this.MethodTasknew TaskManager.this.MethodTaskMethodTask(=> Option[String]description, (Array[String]) => TaskManager.this.ManagedTaskaction, (Iterable[String]add (Iterable[String])Collection[String]++ => List[String]completions).=> List[String]toList)
	}
	
	class class Task extends java.lang.Object with sbt.Dag[TaskManager.this.ManagedTask] with sbt.Described with ScalaObjectTask(val Option[String]description : Option[String]Option[String], val List[TaskManager.this.ManagedTask]dependencies : List[TaskManager.this.ManagedTask]List[ManagedTask], val Booleaninteractive: BooleanBoolean,
		=> Option[String]action : => Option[String]) extends sbt.Dag[TaskManager.this.ManagedTask]Dag[ManagedTask] with sbt.DescribedDescribed
	{
		(List[TaskManager.this.ManagedTask])UnitcheckTaskDependencies(=> List[TaskManager.this.ManagedTask]dependencies)
		def => TaskManager.this.ManagerTypemanager: TaskManager.this.ManagerTypeManagerType = TaskManager.this.typeTaskManager.this
		
		/** Creates a new task, identical to this task, except with the additional dependencies specified.*/
		def (TaskManager.this.ManagedTask*)TaskManager.this.TaskdependsOn(TaskManager.this.ManagedTask*tasks : TaskManager.this.ManagedTask*ManagedTask*) = (List[TaskManager.this.ManagedTask])TaskManager.this.TasksetDependencies(TaskManager.this.ManagedTask*tasks.=> List[TaskManager.this.ManagedTask]toList (List[TaskManager.this.ManagedTask])List[TaskManager.this.ManagedTask]::: => List[TaskManager.this.ManagedTask]dependencies)
		private[sbt] def (List[TaskManager.this.ManagedTask])TaskManager.this.TasksetDependencies(List[TaskManager.this.ManagedTask]dependencyList: List[TaskManager.this.ManagedTask]List[ManagedTask]) =
		{
			(List[TaskManager.this.ManagedTask])UnitcheckTaskDependencies(List[TaskManager.this.ManagedTask]dependencyList)
			TaskManager.this.Tasknew TaskManager.this.TaskTask(=> Option[String]description, List[TaskManager.this.ManagedTask]dependencyList, => Booleaninteractive, => Option[String]action)
		}
		/** Creates a new task, identical to this task, except with the given description.*/
		def (String)TaskManager.this.TaskdescribedAs(Stringdescription : StringString) = TaskManager.this.Tasknew TaskManager.this.TaskTask((String)Some[String]Some(Stringdescription), => List[TaskManager.this.ManagedTask]dependencies, => Booleaninteractive, => Option[String]action);
		private[sbt] def => Option[String]invoke = => Option[String]action;
	
		final def => TaskManager.this.TasksetInteractive = TaskManager.this.Tasknew TaskManager.this.TaskTask(=> Option[String]description, => List[TaskManager.this.ManagedTask]dependencies, Boolean(true)true, => Option[String]action)
		final def => Option[String]run = (List[TaskManager.this.ManagedTask])Option[String]runSequentially(=> List[TaskManager.this.ManagedTask]topologicalSort)
		final def => Option[String]runDependenciesOnly = (List[TaskManager.this.ManagedTask])Option[String]runSequentially(=> List[TaskManager.this.ManagedTask]topologicalSort.(Int)List[TaskManager.this.ManagedTask]dropRight(Int(1)1))
		private def (List[TaskManager.this.ManagedTask])Option[String]runSequentially(List[TaskManager.this.ManagedTask]tasks: List[TaskManager.this.ManagedTask]List[ManagedTask]) = object sbt.ControlControl.(List[TaskManager.this.ManagedTask])((TaskManager.this.ManagedTask) => Option[String])Option[String]lazyFold(List[TaskManager.this.ManagedTask]tasks)(TaskManager.this.ManagedTask_.=> Option[String]invoke)
	
		def (TaskManager.this.Task)TaskManager.this.Task&&(TaskManager.this.Taskthat : TaskManager.this.TaskTask) =
			TaskManager.this.Tasknew TaskManager.this.TaskTask(object NoneNone, => List[TaskManager.this.ManagedTask]dependencies (List[TaskManager.this.ManagedTask])List[TaskManager.this.ManagedTask]::: TaskManager.this.Taskthat.=> List[TaskManager.this.ManagedTask]dependencies, => Booleaninteractive (Boolean)Boolean|| TaskManager.this.Taskthat.=> Booleaninteractive, Task.this.typethis.=> Option[String]invoke.(=> Option[String])Option[String]orElse(TaskManager.this.Taskthat.=> Option[String]invoke))
	}
	private def (List[TaskManager.this.ManagedTask])UnitcheckTaskDependencies(List[TaskManager.this.ManagedTask]dependencyList: List[TaskManager.this.ManagedTask]List[ManagedTask])
	{
		val IntnullDependencyIndex = List[TaskManager.this.ManagedTask]dependencyList.((TaskManager.this.ManagedTask) => Boolean)IntfindIndexOf(TaskManager.this.ManagedTask_ (AnyRef)Boolean== Null(null)null)
		(Boolean,=> Any)Unitrequire(IntnullDependencyIndex (Int)Boolean< Int(0)0, java.lang.String("Dependency (at index ")"Dependency (at index " (Any)java.lang.String+ IntnullDependencyIndex (Any)java.lang.String+ java.lang.String(") is null.  This may be an initialization issue or a circular dependency.")") is null.  This may be an initialization issue or a circular dependency.")
		val IntinteractiveDependencyIndex = List[TaskManager.this.ManagedTask]dependencyList.((TaskManager.this.ManagedTask) => Boolean)IntfindIndexOf(TaskManager.this.ManagedTask_.=> Booleaninteractive)
		(Boolean,=> Any)Unitrequire(IntinteractiveDependencyIndex (Int)Boolean< Int(0)0, java.lang.String("Dependency (at index ")"Dependency (at index " (Any)java.lang.String+ IntinteractiveDependencyIndex (Any)java.lang.String+ java.lang.String(") is interactive.  Interactive tasks cannot be dependencies.")") is interactive.  Interactive tasks cannot be dependencies.")
	}
}