tab complete main classes, trigger auto-detection tasks on compilation

This commit is contained in:
Mark Harrah 2011-04-23 13:17:21 -04:00
parent f24af2a05b
commit 30e454af0a
4 changed files with 14 additions and 7 deletions

View File

@ -128,7 +128,7 @@ object Defaults
compileInputs <<= compileInputsTask,
console <<= consoleTask,
consoleQuick <<= consoleQuickTask,
discoveredMainClasses <<= compile map discoverMainClasses,
discoveredMainClasses <<= TaskData.write(compile map discoverMainClasses) triggeredBy compile,
definedSbtPlugins <<= discoverPlugins,
inTask(run)(runnerSetting :: Nil).head,
selectMainClass <<= discoveredMainClasses map selectRunMain,
@ -190,7 +190,7 @@ object Defaults
loadedTestFrameworks <<= (testFrameworks, streams, testLoader) map { (frameworks, s, loader) =>
frameworks.flatMap(f => f.create(loader, s.log).map( x => (f,x)).toIterable).toMap
},
definedTests <<= TaskData.write(detectTests, _.map(_.name).distinct),
definedTests <<= TaskData.writeRelated(detectTests)(_.map(_.name).distinct) triggeredBy compile,
testListeners :== Nil,
testOptions :== Nil,
executeTests <<= (streams in test, loadedTestFrameworks, testOptions in test, testLoader, definedTests) flatMap {
@ -293,8 +293,7 @@ object Defaults
def runMainTask(classpath: ScopedTask[Classpath], scalaRun: ScopedSetting[ScalaRun]): Initialize[InputTask[Unit]] =
{
import DefaultParsers._
val mainParser = (Space ~> token(NotSpace, "<main-class>")) ~ complete.Parsers.spaceDelimited("<arg>")
InputTask(_ => mainParser) { result =>
InputTask( TaskData(discoveredMainClasses)(runMainParser)(Nil) ) { result =>
(classpath, scalaRun, streams, result) map { case (cp, runner, s, (mainClass, args)) =>
runner.run(mainClass, data(cp), args, s.log) foreach error
}
@ -381,6 +380,12 @@ object Defaults
mappings
}
def runMainParser: (State, Seq[String]) => Parser[(String, Seq[String])] =
{
import DefaultParsers._
(state, mainClasses) => Space ~> token(NotSpace examples mainClasses.toSet) ~ spaceDelimited("<arg>")
}
def testOnlyParser: (State, Seq[String]) => Parser[(Seq[String],Seq[String])] =
{ (state, tests) =>
import DefaultParsers._

View File

@ -292,6 +292,8 @@ object Project extends Init[Scope] with ProjectExtra
str.open()
s.put(logged, str.log).addExitHook { str.close() }
}
// this is here instead of Scoped so that it is considered without need for import (because of Project.Initialize)
implicit def richInitializeTask[T](init: Initialize[Task[T]]): Scoped.RichInitializeTask[T] = new Scoped.RichInitializeTask(init)
}
trait ProjectExtra

View File

@ -213,8 +213,6 @@ object Scoped
def dependOn: Initialize[Task[Unit]] = Apply.tasks(KList.fromList(keys)) { kl => nop.dependsOn(kl.toList :_*) }
}
implicit def richInitializeTask[T](init: Initialize[Task[T]]): RichInitializeTask[T] = new RichInitializeTask(init)
final class RichInitializeTask[T](init: Initialize[Task[T]])
{
def triggeredBy(tasks: ScopedTask[_]*): Initialize[Task[T]] = nonLocal(tasks, Keys.triggeredBy)

View File

@ -33,7 +33,9 @@ object TaskData
val key = ScopedKey(Scope.fillTaskAxis(defined, readFrom), readFrom)
structure.streams.use(reader)(ts => f(ts, key))
}
def write[T, S](i: Initialize[Task[T]], convert: T => S = idFun, id: String = DefaultDataID)(implicit f: Format[S]): Initialize[Task[T]] =
def write[T](i: Initialize[Task[T]], id: String = DefaultDataID)(implicit f: Format[T]): Initialize[Task[T]] = writeRelated(i, id)(idFun[T])(f)
def writeRelated[T, S](i: Initialize[Task[T]], id: String = DefaultDataID)(convert: T => S)(implicit f: Format[S]): Initialize[Task[T]] =
(streams.identity zipWith i) { (sTask, iTask) =>
(sTask,iTask) map { case s :+: value :+: HNil =>
Operations.write( s.binary(id), convert(value) )(f)