diff --git a/main/Defaults.scala b/main/Defaults.scala index 4e5e5b902..9f92a6d14 100644 --- a/main/Defaults.scala +++ b/main/Defaults.scala @@ -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, "")) ~ complete.Parsers.spaceDelimited("") - 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("") + } + def testOnlyParser: (State, Seq[String]) => Parser[(Seq[String],Seq[String])] = { (state, tests) => import DefaultParsers._ diff --git a/main/Project.scala b/main/Project.scala index 11123660a..10cdb8b52 100644 --- a/main/Project.scala +++ b/main/Project.scala @@ -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 diff --git a/main/Structure.scala b/main/Structure.scala index a4268cfa0..9ba0a1ef3 100644 --- a/main/Structure.scala +++ b/main/Structure.scala @@ -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) diff --git a/main/TaskData.scala b/main/TaskData.scala index 810872bee..04667c978 100644 --- a/main/TaskData.scala +++ b/main/TaskData.scala @@ -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)