diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2012-12-29 05:22:31 -0800 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2012-12-29 05:22:31 -0800 |
commit | 26c27d831db5d68c4b65c0f1eb6d7286798814b5 (patch) | |
tree | cb8fd8b0144f15a4d579b79390ea58170f364f6d /src | |
parent | 8c7e034d528017afea18e9f345be71f7485380ee (diff) | |
parent | 48cdfefb95ee43ded08688d6c99a8c3a32d47f18 (diff) | |
download | scala-26c27d831db5d68c4b65c0f1eb6d7286798814b5.tar.gz scala-26c27d831db5d68c4b65c0f1eb6d7286798814b5.tar.bz2 scala-26c27d831db5d68c4b65c0f1eb6d7286798814b5.zip |
Merge pull request #1818 from scalamacros/topic/auto-duplicate-expansions
macro expansions are now auto-duplicated
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Macros.scala | 8 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/Trees.scala | 7 |
2 files changed, 10 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Macros.scala b/src/compiler/scala/tools/nsc/typechecker/Macros.scala index 6ed879af14..768d739b4b 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Macros.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Macros.scala @@ -694,9 +694,11 @@ trait Macros extends scala.tools.reflect.FastTrack with Traces { var expectedTpe = expandee.tpe if (isNullaryInvocation(expandee)) expectedTpe = expectedTpe.finalResultType - var typechecked = typecheck("macro def return type", expanded, expectedTpe) - typechecked = typecheck("expected type", typechecked, pt) - typechecked + // also see http://groups.google.com/group/scala-internals/browse_thread/thread/492560d941b315cc + val expanded0 = duplicateAndKeepPositions(expanded) + val expanded1 = typecheck("macro def return type", expanded0, expectedTpe) + val expanded2 = typecheck("expected type", expanded1, pt) + expanded2 } finally { popMacroContext() } diff --git a/src/reflect/scala/reflect/internal/Trees.scala b/src/reflect/scala/reflect/internal/Trees.scala index 2029fb67b3..35e10d73c8 100644 --- a/src/reflect/scala/reflect/internal/Trees.scala +++ b/src/reflect/scala/reflect/internal/Trees.scala @@ -1501,15 +1501,18 @@ trait Trees extends api.Trees { self: SymbolTable => } } - private lazy val duplicator = new Transformer { + private lazy val duplicator = new Duplicator(focusPositions = true) + private class Duplicator(focusPositions: Boolean) extends Transformer { override val treeCopy = newStrictTreeCopier override def transform(t: Tree) = { val t1 = super.transform(t) - if ((t1 ne t) && t1.pos.isRange) t1 setPos t.pos.focus + if ((t1 ne t) && t1.pos.isRange && focusPositions) t1 setPos t.pos.focus t1 } } + def duplicateAndKeepPositions(tree: Tree) = new Duplicator(focusPositions = false) transform tree + // ------ copiers ------------------------------------------- def copyDefDef(tree: Tree)( |