From 9bfe739adc62ba073342f78a64e24c18e12d4792 Mon Sep 17 00:00:00 2001 From: prassee Date: Sat, 9 Jul 2016 01:21:45 +0000 Subject: Add IntelliJ IDEA project generator plugin --- .gitignore | 2 + examples/idea-plugin-example/README.md | 1 + examples/idea-plugin-example/build/build.scala | 8 ++ .../idea-plugin-example/build/build/build.scala | 6 ++ examples/idea-plugin-example/src/Main.scala | 3 + plugins/idea_plugin/IdeaPlugin.scala | 85 ++++++++++++++++++++++ plugins/idea_plugin/build/build.scala | 9 +++ stage2/plugins.scala | 1 + 8 files changed, 115 insertions(+) create mode 100644 examples/idea-plugin-example/README.md create mode 100644 examples/idea-plugin-example/build/build.scala create mode 100644 examples/idea-plugin-example/build/build/build.scala create mode 100644 examples/idea-plugin-example/src/Main.scala create mode 100644 plugins/idea_plugin/IdeaPlugin.scala create mode 100644 plugins/idea_plugin/build/build.scala diff --git a/.gitignore b/.gitignore index fb5cb68..8f25ae3 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ examples/scalajs-react-example/server/public/generated test/simple/src_generated examples/scalapb-example/src_generated ScalatexGenerated.scala +.idea/ +*.iml diff --git a/examples/idea-plugin-example/README.md b/examples/idea-plugin-example/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/idea-plugin-example/README.md @@ -0,0 +1 @@ + diff --git a/examples/idea-plugin-example/build/build.scala b/examples/idea-plugin-example/build/build.scala new file mode 100644 index 0000000..6252402 --- /dev/null +++ b/examples/idea-plugin-example/build/build.scala @@ -0,0 +1,8 @@ + +import cbt._ +import idea_plugin.IdeaPlugin + + +class Build(val context: Context) extends BaseBuild with IdeaPlugin { + override def name = "idea-plugin-example" +} diff --git a/examples/idea-plugin-example/build/build/build.scala b/examples/idea-plugin-example/build/build/build.scala new file mode 100644 index 0000000..df4934a --- /dev/null +++ b/examples/idea-plugin-example/build/build/build.scala @@ -0,0 +1,6 @@ + +import cbt._ + +class Build(val context: Context) extends BuildBuild { + override def dependencies = super.dependencies :+ plugins.ideaPlugin +} diff --git a/examples/idea-plugin-example/src/Main.scala b/examples/idea-plugin-example/src/Main.scala new file mode 100644 index 0000000..ec68f73 --- /dev/null +++ b/examples/idea-plugin-example/src/Main.scala @@ -0,0 +1,3 @@ +object Main extends App { + println("This is an example Application for illustrating CBT IDEA plugin ") +} diff --git a/plugins/idea_plugin/IdeaPlugin.scala b/plugins/idea_plugin/IdeaPlugin.scala new file mode 100644 index 0000000..97e53b1 --- /dev/null +++ b/plugins/idea_plugin/IdeaPlugin.scala @@ -0,0 +1,85 @@ +package idea_plugin + +import java.io.{File, FileWriter} + +import cbt.{BaseBuild, ExitCode} + +trait IdeaPlugin extends BaseBuild { + + import IdeaPlugin._ + + // @TODO add only the top level dependencies + // @TODO return exit code dynamically + def generateIdeaProject: ExitCode = { + + val dependencyEntry: (String) => String = (url: String) => + + + + + + + + .toString() + + val moduleDir = projectDirectory.getPath + val projectDependencies: List[String] = for { + depJarFile <- this.dependencies + .flatMap(dep => dep.dependenciesArray().toList) + .flatMap(x => x.exportedClasspathArray().toList) + .toList + depIdeaOrderEntry = dependencyEntry( + s"jar://$moduleDir/../cbt/${depJarFile.getPath.split("/cbt")(1)}!/") + } yield depIdeaOrderEntry + + val imlFile = new File(projectDirectory.getPath + s"/$name.iml") + if (!imlFile.exists()) { + imlFile.createNewFile() + } + val fw = new FileWriter(imlFile.getPath, false) + fw.write(templateWithCBTSources(projectDependencies.mkString("\n"), moduleDir)) + fw.close() + ExitCode.Success + } + +} + +private[idea_plugin] object IdeaPlugin { + + // @TODO inject from the build.scala + // @TODO infer scala version from project + // path of cbt relative to module dir + + private val templateWithCBTSources: (String, String) => String = (dependencies: String, + moduleRootDir: String) => + """ + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | | + | """.stripMargin + dependencies + + """ + |""".stripMargin +} diff --git a/plugins/idea_plugin/build/build.scala b/plugins/idea_plugin/build/build.scala new file mode 100644 index 0000000..991e07e --- /dev/null +++ b/plugins/idea_plugin/build/build.scala @@ -0,0 +1,9 @@ +import cbt._ + +class Build(val context: Context) extends Plugin { + override def dependencies = + super.dependencies ++ + Resolver(mavenCentral).bind( + ScalaDependency("org.scala-lang.modules", "scala-xml", "1.0.5") + ) +} diff --git a/stage2/plugins.scala b/stage2/plugins.scala index ea1aa74..c48a31b 100644 --- a/stage2/plugins.scala +++ b/stage2/plugins.scala @@ -7,6 +7,7 @@ class plugins( context: Context, scalaVersion: String ) { ), None ) + final lazy val ideaPlugin = plugin( "idea_plugin" ) final lazy val googleJavaFormat = plugin( "google-java-format" ) final lazy val proguard = plugin( "proguard" ) final lazy val sbtLayout = plugin( "sbt_layout" ) -- cgit v1.2.3