Skip to content

Instantly share code, notes, and snippets.

@kiritsuku
Last active December 14, 2015 15:48
Show Gist options
  • Select an option

  • Save kiritsuku/5110095 to your computer and use it in GitHub Desktop.

Select an option

Save kiritsuku/5110095 to your computer and use it in GitHub Desktop.
object ImplicitMacros {
implicit class C(val a: Int) {
def add(b: _) = macro Impl.add
}
}
trait Impl extends Macro {
def add(b: c.Tree) = {
import c.universe._
val s = Select(c.prefix.tree, TermName("a"))
val res = b match {
case Ident(tn) =>
val value1 = Select(c.prefix.tree, TermName("a"))
val value2 = Select(c.enclosingImpl, tn)
Apply(Select(value1, TermName("$plus")), List(value2))
case _ =>
c.abort(c.enclosingPosition, "\n>>>\n"+showRaw(b)+"\n>>>\n"+s.toString)
}
res
}
}
performing macro expansion macrotest.ImplicitMacros.C(ImplicitMacroTest.this.a).add(b) at source-/home/antoras/dev/Scala/sbt-example-paradise/core/src/main/scala/macrouse/Test.scala,line-87,offset=2122
macro expansion has failed: java.lang.StackOverflowError
performing macro expansion macrotest.ImplicitMacros.C(ImplicitMacroTest.this.a).add(b) at source-/home/antoras/dev/Scala/sbt-example-paradise/core/src/main/scala/macrouse/Test.scala,line-87,offset=2122
macro expansion has failed: java.lang.StackOverflowError
[error]
[error] while compiling: /home/antoras/dev/Scala/sbt-example-paradise/core/src/main/scala/macrouse/Test.scala
[error] during phase: typer
[error] library version: version 2.11.0-20130223-173205-ef24a8b53c
[error] compiler version: version 2.11.0-20130223-173205-ef24a8b53c
[error] reconstructed args: -Ymacro-debug-lite -Ywarn-nullary-unit -feature -Xlint -Ywarn-inaccessible -unchecked -bootclasspath /usr/lib/jvm/java-6-openjdk/jre/lib/resources.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/jsse.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/jce.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/charsets.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/netx.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/plugin.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/modules/jdk.boot.jar:/usr/lib/jvm/java-6-openjdk/jre/classes:/home/antoras/tmp/kepler-topic-introduce-member/pack/lib/scala-library.jar -classpath /home/antoras/dev/Scala/sbt-example-paradise/core/target/scala-2.11/classes:/home/antoras/dev/Scala/sbt-example-paradise/macros/target/scala-2.11/classes:/home/antoras/tmp/kepler-topic-introduce-member/pack/lib/scalap.jar:/home/antoras/tmp/kepler-topic-introduce-member/pack/lib/scala-partest.jar:/home/antoras/tmp/kepler-topic-introduce-member/pack/lib/scala-actors.jar:/home/antoras/tmp/kepler-topic-introduce-member/pack/lib/scalacheck.jar:/home/antoras/tmp/kepler-topic-introduce-member/pack/lib/scala-compiler.jar:/home/antoras/tmp/kepler-topic-introduce-member/pack/lib/jline.jar:/home/antoras/tmp/kepler-topic-introduce-member/pack/lib/scala-partest-javaagent.jar:/home/antoras/tmp/kepler-topic-introduce-member/pack/lib/scala-reflect.jar:/home/antoras/tmp/kepler-topic-introduce-member/pack/lib/scala-swing.jar -deprecation -d /home/antoras/dev/Scala/sbt-example-paradise/core/target/scala-2.11/classes -Xlog-reflective-calls -Ywarn-nullary-override -Ywarn-infer-any -Ywarn-adapted-args
[error]
[error] last tree to typer: term ImplicitMacroTest
[error] symbol: object ImplicitMacroTest in package macrouse (flags: <module>)
[error] symbol definition: object ImplicitMacroTest
[error] symbol owners: object ImplicitMacroTest -> package macrouse
[error] context owners: object ImplicitMacroTest -> package macrouse
[error]
[error] == Enclosing template or block ==
[error]
[error] Template( // val <local ImplicitMacroTest>: <notype> in object ImplicitMacroTest
[error] "java.lang.Object" // parents
[error] ValDef(
[error] private
[error] "_"
[error] <tpt>
[error] <empty>
[error] )
[error] // 5 statements
[error] DefDef( // def <init>(): macrouse.ImplicitMacroTest.type in object ImplicitMacroTest
[error] <method>
[error] "<init>"
[error] []
[error] List(Nil)
[error] <tpt> // tree.tpe=macrouse.ImplicitMacroTest.type
[error] Block(
[error] Apply(
[error] super."<init>"
[error] Nil
[error] )
[error] ()
[error] )
[error] )
[error] Import( // val <import>: ImportType(macrotest.ImplicitMacros)
[error] "macrotest"."ImplicitMacros" // object ImplicitMacros in package macrotest, tree.tpe=macrotest.ImplicitMacros.type
[error] List(
[error] ImportSelector(_,2091,null,-1)
[error] )
[error] )
[error] ValDef( // private[this] val a: Int in object ImplicitMacroTest
[error] private <local>
[error] "a"
[error] <tpt> // tree.tpe=Int
[error] 1
[error] )
[error] ValDef( // private[this] val b: Int in object ImplicitMacroTest
[error] private <local>
[error] "b"
[error] <tpt> // tree.tpe=Int
[error] 1
[error] )
[error] Apply(
[error] "a"."add"
[error] "b"
[error] )
[error] )
[error]
[error] uncaught exception during compilation: StackOverflowError @ scala.reflect.internal.Trees$class.itransform(Trees.scala:1280)
[trace] Stack trace suppressed: run last core/compile:compile for the full output.
[error] (core/compile:compile) java.lang.StackOverflowError
[error] Total time: 16 s, completed Mar 7, 2013 6:48:54 PM
object ImplicitMacroTest {
import macrotest.ImplicitMacros._
val a = 1
val b = 1
println(a add b)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment