aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Christopher Vogt <oss.nsp@cvogt.org>2017-06-13 11:24:39 -0400
committerGitHub <noreply@github.com>2017-06-13 11:24:39 -0400
commit00840fe6888b231c70e95ecf6feaeba89b42e218 (patch)
tree7a0cdec601addcfe487d299dcad25dc85c3dd7e8
parentace672254b31d7e6203b0c5a22f1c4e6dfe13f42 (diff)
parent38c7dc3bb8b81bebd7dc6a9e092cec0c10d30a9f (diff)
downloadcbt-00840fe6888b231c70e95ecf6feaeba89b42e218.tar.gz
cbt-00840fe6888b231c70e95ecf6feaeba89b42e218.tar.bz2
cbt-00840fe6888b231c70e95ecf6feaeba89b42e218.zip
Merge pull request #515 from megri/master
Rudimentary Macroparadise plugin
-rw-r--r--examples/new-style-macros-example/Hello.scala6
-rw-r--r--examples/new-style-macros-example/build/build.scala19
-rw-r--r--examples/new-style-macros-example/macros/Main.scala25
-rw-r--r--stage2/plugins/NewStyleMacros.scala29
-rw-r--r--stage2/plugins/OldStyleMacros.scala (renamed from stage2/plugins/ScalaParadise.scala)6
-rw-r--r--test/test.scala6
6 files changed, 88 insertions, 3 deletions
diff --git a/examples/new-style-macros-example/Hello.scala b/examples/new-style-macros-example/Hello.scala
new file mode 100644
index 0000000..7e04dcb
--- /dev/null
+++ b/examples/new-style-macros-example/Hello.scala
@@ -0,0 +1,6 @@
+package macroparadise_example
+import macros._
+
+@Main object Hello{
+ println("hello, world!")
+}
diff --git a/examples/new-style-macros-example/build/build.scala b/examples/new-style-macros-example/build/build.scala
new file mode 100644
index 0000000..2054aba
--- /dev/null
+++ b/examples/new-style-macros-example/build/build.scala
@@ -0,0 +1,19 @@
+package macroparadise_example_build
+import cbt._
+
+trait SharedSettings extends NewStyleMacros{
+ override def defaultScalaVersion = "2.12.2"
+}
+
+class Build(val context: Context) extends SharedSettings{
+ override def dependencies =
+ super.dependencies :+
+ new MacroBuild( context.copy( workingDirectory = projectDirectory / "macros" ) )
+}
+
+class MacroBuild(val context: Context) extends SharedSettings{
+ override def dependencies =
+ super.dependencies :+
+ Resolver( mavenCentral ).bindOne( ScalaDependency( "org.scalameta", "scalameta", "1.8.0" ) )
+}
+
diff --git a/examples/new-style-macros-example/macros/Main.scala b/examples/new-style-macros-example/macros/Main.scala
new file mode 100644
index 0000000..ecdce34
--- /dev/null
+++ b/examples/new-style-macros-example/macros/Main.scala
@@ -0,0 +1,25 @@
+package macroparadise_example.macros
+
+import scala.meta._
+import scala.collection.immutable.Seq
+
+class Main extends scala.annotation.StaticAnnotation {
+ inline def apply(defn: Any): Any = meta {
+ defn match {
+ case q"object $name { ..$stats }" =>
+ MainMacroImpl.expand(name, stats)
+ case _ =>
+ abort("@main must annotate an object.")
+ }
+ }
+}
+
+// This is an example how we can refactor the macro implementation into a utility
+// function which can be used for unit testing, see MainUnitTest.
+object MainMacroImpl {
+ def expand(name: Term.Name, stats: Seq[Stat]): Defn.Object = {
+ val main = q"def main(args: Array[String]): Unit = { ..$stats }"
+ q"object $name { $main }"
+ }
+}
+
diff --git a/stage2/plugins/NewStyleMacros.scala b/stage2/plugins/NewStyleMacros.scala
new file mode 100644
index 0000000..42b3287
--- /dev/null
+++ b/stage2/plugins/NewStyleMacros.scala
@@ -0,0 +1,29 @@
+package cbt
+import java.io.File
+
+trait NewStyleMacros extends BaseBuild{
+ def newStyleMacrosVersion = "3.0.0-M9"
+
+ override def scalacOptions = super.scalacOptions ++ NewStyleMacros.scalacOptions(
+ NewStyleMacros.dependencies( scalaVersion, newStyleMacrosVersion, context.cbtLastModified, context.paths.mavenCache ).jar
+ )
+}
+
+object NewStyleMacros{
+ def dependencies(
+ scalaVersion: String, newStyleMacrosVersion: String, cbtLastModified: Long, mavenCache: java.io.File
+ )(
+ implicit logger: Logger, transientCache: java.util.Map[AnyRef,AnyRef], classLoaderCache: ClassLoaderCache
+ ) =
+ MavenResolver( cbtLastModified, mavenCache, mavenCentral ).bindOne(
+ MavenDependency( "org.scalameta", "paradise_"+scalaVersion, newStyleMacrosVersion )
+ )
+
+ def scalacOptions( jarPath: File ) =
+ Seq(
+ "-Xplugin:" ++ jarPath.string,
+ "-Yrangepos",
+ "-Xplugin-require:macroparadise"
+ )
+}
+
diff --git a/stage2/plugins/ScalaParadise.scala b/stage2/plugins/OldStyleMacros.scala
index 28ee934..42719ea 100644
--- a/stage2/plugins/ScalaParadise.scala
+++ b/stage2/plugins/OldStyleMacros.scala
@@ -1,10 +1,10 @@
package cbt
-trait ScalaParadise extends BaseBuild{
- def scalaParadiseVersion = "2.1.0"
+trait OldStyleMacros extends BaseBuild{
+ def oldStyleMacrosVersion = "2.1.0"
private def scalaParadiseDependency =
Resolver( mavenCentral ).bindOne(
- "org.scalamacros" % ("paradise_" ++ scalaVersion) % scalaParadiseVersion
+ "org.scalamacros" % ("paradise_" ++ scalaVersion) % oldStyleMacrosVersion
)
override def dependencies = (
diff --git a/test/test.scala b/test/test.scala
index 74177c5..376d6bf 100644
--- a/test/test.scala
+++ b/test/test.scala
@@ -422,6 +422,12 @@ object Main{
}
{
+ val res = runCbt("../examples/new-style-macros-example", Seq("run"))
+ assert(res.exit0)
+ assert(res.out.contains("hello, world!"), res.out)
+ }
+
+ {
val res = runCbt("../examples/resources-example", Seq("run"))
assert(res.exit0)
assert(res.out.contains("via parent.parent: false 0"), res.out)