Skip to content

Commit

Permalink
[fixes lh 187, lh 240] refactoring eclipse support using sbteclipse-2…
Browse files Browse the repository at this point in the history
….1.0-M2

this is the first few fixes based on the fully configurable version of sbteclipse.

- target folder is now set to .target

- java projects now have java builder in .project file (scala nature is removed)

- java projects include scala-library.jar

- java projects include classes_managed

- scala projects include src_managed/main

- scala projects use the IDE supplied scala container for allocating scala-library.jar
  • Loading branch information
ph2734 committed Apr 30, 2012
1 parent 0906721 commit b9cf8de
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 32 deletions.
2 changes: 1 addition & 1 deletion framework/project/Build.scala
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ object PlayBuild extends Build {
sbtPlugin := true,
publishMavenStyle := false,
libraryDependencies := sbtDependencies,
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-core" % "2.0.0"),
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-core" % "2.1.0-M2"),
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.1.0-M1-TYPESAFE"),
unmanagedJars in Compile ++= sbtJars,
publishTo := Some(playIvyRepository),
Expand Down
31 changes: 1 addition & 30 deletions framework/src/sbt-plugin/src/main/scala/PlayCommands.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import scala.annotation.tailrec
import scala.collection.JavaConverters._
import java.lang.{ ProcessBuilder => JProcessBuilder }

trait PlayCommands extends PlayAssetsCompiler {
trait PlayCommands extends PlayAssetsCompiler with PlayEclipse {
this: PlayReloader =>

//- mainly scala, mainly java or none
Expand Down Expand Up @@ -203,35 +203,6 @@ exec java $* -cp "`dirname $0`/lib/*" """ + customFileName.map(fn => "-Dconfig.f
zip
}

/**
* provides Settings for the eclipse project
* @param mainLang mainly scala or java?
*/
def eclipseCommandSettings(mainLang: String) = {
val settingsDir = new File(".settings")
val coreSettings = new File(settingsDir.toString + java.io.File.separator + "org.eclipse.core.resources.prefs")
if (mainLang == JAVA && coreSettings.exists == false) {
IO.createDirectory(settingsDir)
IO.write(coreSettings,
"""|eclipse.preferences.version=1
|encoding/<project>=UTF-8""".stripMargin
)
}
import com.typesafe.sbteclipse.core._
import com.typesafe.sbteclipse.core.EclipsePlugin._
def transformerFactory =
new EclipseClasspathEntryTransformerFactory {
override def createTransformer(ref: ProjectRef, state: State) =
setting(crossTarget in ref)(state) map (ct =>
(entries: Seq[EclipseClasspathEntry]) => entries :+ EclipseClasspathEntry.Lib(ct + java.io.File.separator + "classes_managed")
)
}

EclipsePlugin.eclipseSettings ++ Seq(EclipseKeys.commandName := "eclipsify",
EclipseKeys.createSrc := EclipseCreateSrc.Default,
EclipseKeys.preTasks := Seq(compile in Compile),
EclipseKeys.classpathEntryTransformerFactory := transformerFactory)
}

def intellijCommandSettings(mainLang: String) = {
import org.sbtidea.SbtIdeaPlugin
Expand Down
124 changes: 124 additions & 0 deletions framework/src/sbt-plugin/src/main/scala/PlayEclipse.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package sbt

import Keys._

trait PlayEclipse {
this: PlayCommands =>

private def generateJavaPrefFile(mainLang: String): Unit = {
val settingsDir = new File(".settings")
val coreSettings = new File(settingsDir.toString + java.io.File.separator + "org.eclipse.core.resources.prefs")
if (mainLang == JAVA && coreSettings.exists == false) {
IO.createDirectory(settingsDir)
IO.write(coreSettings,
"""|eclipse.preferences.version=1
|encoding/<project>=UTF-8""".stripMargin
)
}
}

/**
* provides Settings for the eclipse project
* @param mainLang mainly scala or java?
*/
def eclipseCommandSettings(mainLang: String) = {
import com.typesafe.sbteclipse.core._
import com.typesafe.sbteclipse.core.EclipsePlugin._
import com.typesafe.sbteclipse.core.Validation
import scala.xml._
import scala.xml.transform.RewriteRule

val f = java.io.File.separator



def err(node: Node) = throw new RuntimeException("error proccessing "+ Node)

lazy val addClassesManaged = new EclipseTransformerFactory[RewriteRule] {
override def createTransformer(ref: ProjectRef, state: State): Validation[RewriteRule] = {
setting(crossTarget in ref, state) map { ct =>
new RewriteRule {
override def transform(node: Node): Seq[Node] = node match {
//add classes_managed
case elem if (elem.label == "classpathentry" && elem.attribute("path").getOrElse(err(elem)).toString.contains("org.scala-ide.sdt.launching.SCALA_CONTAINER")) =>
<classpathentry path={ct + java.io.File.separator + "classes_managed"} kind="lib"></classpathentry>
case other =>
other
}
}
}
}
}

lazy val addJavaBuilder = new EclipseTransformerFactory[RewriteRule] {
override def createTransformer(ref: ProjectRef, state: State): Validation[RewriteRule] = {
setting(crossTarget in ref, state) map { ct =>
new RewriteRule {
override def transform(node: Node): Seq[Node] = node match {
//add javabuilder
case elem if (elem.text == "org.scala-ide.sdt.core.scalabuilder") =>
<name>org.eclipse.jdt.core.javabuilder</name>
//remove scala nature
case elem if (elem.text == "org.scala-ide.sdt.core.scalanature") =>
<name></name>
case other =>
other
}
}
}
}
}

lazy val addScalaLib = new EclipseTransformerFactory[RewriteRule] {
override def createTransformer(ref: ProjectRef, state: State): Validation[RewriteRule] = {
evaluateTask(dependencyClasspath in Runtime, ref, state) map { classpath =>
val scalaLib = classpath.filter(_.data.getAbsolutePath.contains("scala-library.jar")).headOption.map(_.data.getAbsolutePath).getOrElse(throw new RuntimeException("could not find scala-library.jar"))
new RewriteRule {
override def transform(node: Node): Seq[Node] = node match {
//add scala-library.jar
case elem if (elem.label == "classpath") =>
val newChild = elem.child ++ <classpathentry path={scalaLib} kind="lib"></classpathentry>
Elem(elem.prefix, "classpath", elem.attributes, elem.scope, newChild: _*)
case other =>
other
}
}
}
}
}

lazy val addSourcesManaged = new EclipseTransformerFactory[RewriteRule] {
override def createTransformer(ref: ProjectRef, state: State): Validation[RewriteRule] = {
setting(crossTarget in ref, state) map { ct =>
new RewriteRule {
override def transform(node: Node): Seq[Node] = node match {
//add src_managed/main
case elem if (elem.label == "classpath") =>
val newChild = elem.child ++ <classpathentry path={ct + f + "src_managed"+ f + "main" } kind="src"></classpathentry>
Elem(elem.prefix, "classpath", elem.attributes, elem.scope, newChild: _*)
case other =>
other
}
}
}
}
}

//setup project file
val projectTransformers = if (mainLang == SCALA) Seq[EclipseTransformerFactory[RewriteRule]]() else Seq(addJavaBuilder)

//setup classpath
val classPathTransformers = if (mainLang == SCALA) Seq(addSourcesManaged) else Seq(addClassesManaged, addScalaLib)

//generate JDT pref file if needed
generateJavaPrefFile(mainLang)

//setup sbteclipse
EclipsePlugin.eclipseSettings ++ Seq(EclipseKeys.commandName := "eclipsify",
EclipseKeys.createSrc := EclipseCreateSrc.Default,
EclipseKeys.eclipseOutput := Some(".target"),
EclipseKeys.preTasks := Seq(compile in Compile),
EclipseKeys.projectTransformerFactories := projectTransformers,
EclipseKeys.classpathTransformerFactories := classPathTransformers)
}
}
2 changes: 1 addition & 1 deletion framework/src/sbt-plugin/src/main/scala/PlayProject.scala
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ object PlayProject extends Plugin with PlayExceptions with PlayKeys with PlayRel
case _ =>
}

private def whichLang(name: String) = {
private def whichLang(name: String): Seq[Setting[_]] = {
if (name == JAVA) {
defaultJavaSettings
} else if (name == SCALA) {
Expand Down

0 comments on commit b9cf8de

Please sign in to comment.