diff options
Diffstat (limited to 'tests/disabled/macro/run/macro-range')
3 files changed, 108 insertions, 0 deletions
diff --git a/tests/disabled/macro/run/macro-range/Common_1.scala b/tests/disabled/macro/run/macro-range/Common_1.scala new file mode 100644 index 000000000..35d2efd76 --- /dev/null +++ b/tests/disabled/macro/run/macro-range/Common_1.scala @@ -0,0 +1,48 @@ +import scala.reflect.macros.blackbox.Context + +abstract class RangeDefault { + val from, to: Int + def foreach(f: Int => Unit) = { + var i = from + while (i < to) { f(i); i += 1 } + } +} + +/** This class should go into reflect.macro once it is a bit more stable. */ +abstract class Utils { + val context: Context + import context.universe._ + import internal._ + + class TreeSubstituter(from: List[Symbol], to: List[Tree]) extends Transformer { + override def transform(tree: Tree): Tree = tree match { + case Ident(_) => + def subst(from: List[Symbol], to: List[Tree]): Tree = + if (from.isEmpty) tree + else if (tree.symbol == from.head) to.head.duplicate // TODO: does it ever make sense *not* to perform a shallowDuplicate on `to.head`? + else subst(from.tail, to.tail); + subst(from, to) + case _ => + val tree1 = super.transform(tree) + if (tree1 ne tree) setType(tree1, null) + tree1 + } + } + def makeApply(fn: Tree, args: List[Tree]): Tree = fn match { + case Function(vparams, body) => + new TreeSubstituter(vparams map (_.symbol), args) transform body + case Block(stats, expr) => + Block(stats, makeApply(expr, args)) + case _ => + // todo. read the compiler config and print if -Ydebug is set + //println("no beta on "+fn+" "+fn.getClass) + Apply(fn, args) + } + def makeWhile(lname: TermName, cond: Tree, body: Tree): Tree = { + val continu = Apply(Ident(lname), Nil) + val rhs = If(cond, Block(List(body), continu), Literal(Constant())) + LabelDef(lname, Nil, rhs) + } + def makeBinop(left: Tree, op: String, right: Tree): Tree = + Apply(Select(left, TermName(op)), List(right)) +} diff --git a/tests/disabled/macro/run/macro-range/Expansion_Impossible_2.scala b/tests/disabled/macro/run/macro-range/Expansion_Impossible_2.scala new file mode 100644 index 000000000..b3c2fa348 --- /dev/null +++ b/tests/disabled/macro/run/macro-range/Expansion_Impossible_2.scala @@ -0,0 +1,53 @@ +import scala.reflect.macros.blackbox.Context + +object Impls { + def foreach(c: Context)(f: c.Expr[Int => Unit]): c.Expr[Unit] = { + // todo. read the compiler config and print if -Ydebug is set + //println("macro-expand, _this = "+ _this) + object utils extends Utils { val context: c.type = c } + import utils._ + import c.universe._ + import Flag._ + + val initName = termNames.CONSTRUCTOR + // Either: + // scala"{ var i = $low; val h = $hi; while (i < h) { $f(i); i = i + 1 } } + // or: + // scala"($_this: RangeDefault).foreach($f)" + c.Expr(c.prefix.tree match { + case Apply(Select(New(tpt), initName), List(lo, hi)) if tpt.symbol.fullName == "Range" => + val iname = TermName("$i") + val hname = TermName("$h") + def iref = Ident(iname) + def href = Ident(hname) + val labelname = TermName("$while") + val cond = makeBinop(iref, "$less", href) + val body = Block( + List(makeApply(f.tree, List(iref))), + Assign(iref, makeBinop(iref, "$plus", Literal(Constant(1))))) + val generated = + Block( + List( + ValDef(Modifiers(MUTABLE), iname, TypeTree(), lo), + ValDef(Modifiers(), hname, TypeTree(), hi)), + makeWhile(labelname, cond, body)) + // todo. read the compiler config and print if -Ydebug is set + //tools.nsc.util.trace("generated: ")(generated) + generated + case _ => + Apply( + Select( + Typed(c.prefix.tree, Ident(TypeName("RangeDefault"))), + TermName("foreach")), + List(f.tree)) + }) + } +} + +class Range(val from: Int, val to: Int) extends RangeDefault { + override def foreach(f: Int => Unit): Unit = macro Impls.foreach +} + +object Test extends dotty.runtime.LegacyApp { + new Range(1, 10) foreach println +}
\ No newline at end of file diff --git a/tests/disabled/macro/run/macro-range/Expansion_Possible_3.scala b/tests/disabled/macro/run/macro-range/Expansion_Possible_3.scala new file mode 100644 index 000000000..b1fbba765 --- /dev/null +++ b/tests/disabled/macro/run/macro-range/Expansion_Possible_3.scala @@ -0,0 +1,7 @@ +class Range(val from: Int, val to: Int) extends RangeDefault { + override def foreach(f: Int => Unit): Unit = macro Impls.foreach +} + +object Test extends dotty.runtime.LegacyApp { + new Range(1, 10) foreach println +}
\ No newline at end of file |