diff --git a/project/build/SbtProject.scala b/project/build/SbtProject.scala index 985d02412..b56239059 100644 --- a/project/build/SbtProject.scala +++ b/project/build/SbtProject.scala @@ -6,7 +6,7 @@ import sbt._ import java.io.File import java.net.URL -abstract class SbtProject(info: ProjectInfo) extends DefaultProject(info) with test.SbtScripted with posterous.Publish +abstract class SbtProject(info: ProjectInfo) extends DefaultProject(info) with test.SbtScripted with posterous.Publish with Sxr { /* Additional resources to include in the produced jar.*/ def extraResources = descendents(info.projectPath / "licenses", "*") +++ "LICENSE" +++ "NOTICE" @@ -46,7 +46,6 @@ abstract class SbtProject(info: ProjectInfo) extends DefaultProject(info) with t val testInterface = "org.scala-tools.testing" % "test-interface" % "0.5" - def deepSources = Path.finder { topologicalSort.flatMap { case p: ScalaPaths => p.mainSources.getFiles } } lazy val sbtDoc = scaladocTask("sbt", deepSources, docPath, docClasspath, documentOptions) /* For generating JettyRun for Jetty 6 and 7. The only difference is the imports, but the file has to be compiled against each set of imports. */ diff --git a/project/build/Sxr.scala b/project/build/Sxr.scala new file mode 100644 index 000000000..1ef11b9fa --- /dev/null +++ b/project/build/Sxr.scala @@ -0,0 +1,25 @@ +import sbt._ + +trait Sxr extends BasicScalaProject +{ + val sxrConf = config("sxr") hide + val sxrDep = "org.scala-tools.sxr" %% "sxr" % "0.2.4" % sxrConf.name + + def deepSources: PathFinder + def deepBaseDirectories = Path.finder { topologicalSort.flatMap { case p: ScalaPaths => p.mainSourceRoots.getFiles } } + def sxrBaseDirs = "-P:sxr:base-directory:" + deepBaseDirectories.absString + def sxrLocation = "-Xplugin:" + managedClasspath(sxrConf).absString + def sxrDirName = "browse" + def sxrOutput = outputPath / (sxrDirName + ".sxr") + def sxrClassesOutput = outputPath / sxrDirName // isn't actually written to, since compiler stops before writing classes + def sxrOptions = compileOptions.map(_.asString) ++ Seq(sxrBaseDirs, sxrLocation, "-Ystop:superaccessors") + + lazy val sxr = task { + xsbt.FileUtilities.delete(sxrOutput +++ sxrClassesOutput getFiles) + xsbt.FileUtilities.createDirectory(sxrClassesOutput asFile) + val compiler = new xsbt.RawCompiler(buildScalaInstance, true, true, log) + // `Set() ++` is temporary. getFiles returns immutable.Set in sbt 0.7.3. + compiler(Set() ++ deepSources.getFiles, Set() ++ compileClasspath.getFiles, sxrClassesOutput asFile, sxrOptions) + None + } +} diff --git a/sbt/src/main/scala/sbt/Path.scala b/sbt/src/main/scala/sbt/Path.scala index e45b190f8..586499e63 100644 --- a/sbt/src/main/scala/sbt/Path.scala +++ b/sbt/src/main/scala/sbt/Path.scala @@ -7,7 +7,8 @@ import Path._ import FileUtilities.wrapNull import java.io.File import java.net.URL -import scala.collection.mutable.{Set, HashSet} +import scala.collection.{immutable, mutable} +import mutable.{Set, HashSet} /** A Path represents a file in a project. * @see sbt.PathFinder*/ @@ -243,9 +244,9 @@ object Path def fromFiles(files: Iterable[File]): Iterable[Path] = files.map(fromFile) // done this way because collection.Set.map returns Iterable that is Set underneath, so no need to create a new set - def mapSet[T](files: Iterable[Path])(f: Path => T): scala.collection.immutable.Set[T] = - files.map(f) match { case s: scala.collection.immutable.Set[T] => s; case x => scala.collection.immutable.Set() ++ x } - def getFiles(files: Iterable[Path]): scala.collection.immutable.Set[File] = mapSet(files)(_.asFile) + def mapSet[T](files: Iterable[Path])(f: Path => T): immutable.Set[T] = + files.map(f) match { case s: immutable.Set[T] => s; case x => immutable.Set() ++ x } + def getFiles(files: Iterable[Path]): immutable.Set[File] = mapSet(files)(_.asFile) def getURLs(files: Iterable[Path]): Array[URL] = files.map(_.asURL).toSeq.toArray } @@ -295,10 +296,10 @@ sealed abstract class PathFinder extends NotNull final def filter(f: Path => Boolean): PathFinder = Path.lazyPathFinder(get.filter(f)) final def flatMap(f: Path => PathFinder): PathFinder = Path.lazyPathFinder(get.flatMap(p => f(p).get)) final def getURLs: Array[URL] = Path.getURLs(get) - final def getFiles: scala.collection.immutable.Set[File] = Path.getFiles(get) - final def getPaths: scala.collection.immutable.Set[String] = strictMap(_.absolutePath) - final def getRelativePaths: scala.collection.immutable.Set[String] = strictMap(_.relativePath) - final def strictMap[T](f: Path => T): scala.collection.immutable.Set[T] = Path.mapSet(get)(f) + final def getFiles: immutable.Set[File] = Path.getFiles(get) + final def getPaths: immutable.Set[String] = strictMap(_.absolutePath) + final def getRelativePaths: immutable.Set[String] = strictMap(_.relativePath) + final def strictMap[T](f: Path => T): immutable.Set[T] = Path.mapSet(get)(f) private[sbt] def addTo(pathSet: Set[Path]) final def absString = Path.makeString(get) diff --git a/sbt/src/main/scala/sbt/ScalaProject.scala b/sbt/src/main/scala/sbt/ScalaProject.scala index ad4ea5b2d..c2d5a2b06 100644 --- a/sbt/src/main/scala/sbt/ScalaProject.scala +++ b/sbt/src/main/scala/sbt/ScalaProject.scala @@ -43,6 +43,8 @@ trait SimpleScalaProject extends ExecProject with Cleanable case class CompileOption(val asString: String) extends ActionOption case class JavaCompileOption(val asString: String) extends ActionOption + def compileOptions(asString: String*): Seq[CompileOption] = asString.map(CompileOption.apply) + val Deprecation = CompileOption(CompileOptions.Deprecation) val ExplainTypes = CompileOption("-explaintypes") val Optimize = CompileOption("-optimise")