diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2013-08-08 08:15:56 -0700 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2013-08-08 08:15:56 -0700 |
commit | ed5c1abbfca18a880c79048cc7e9578ae932101d (patch) | |
tree | 7f4dd7f6ea5aaa42b2d473f5095d5134924f7c66 | |
parent | e9ccb416b307d853120411572a57cb57867a9afc (diff) | |
parent | 36524c21964696ec71170970c6a65f9bb7aec8f0 (diff) | |
download | scala-ed5c1abbfca18a880c79048cc7e9578ae932101d.tar.gz scala-ed5c1abbfca18a880c79048cc7e9578ae932101d.tar.bz2 scala-ed5c1abbfca18a880c79048cc7e9578ae932101d.zip |
Merge pull request #2800 from densh/topic/toolbox-positions
SI-7331 tb.parse returns unpositioned trees
-rw-r--r-- | src/compiler/scala/tools/reflect/ToolBoxFactory.scala | 10 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/Importers.scala | 7 | ||||
-rw-r--r-- | test/files/run/t7331a.check | 2 | ||||
-rw-r--r-- | test/files/run/t7331a.scala | 10 | ||||
-rw-r--r-- | test/files/run/t7331b.check | 3 | ||||
-rw-r--r-- | test/files/run/t7331b.scala | 11 | ||||
-rw-r--r-- | test/files/run/t7331c.check | 3 | ||||
-rw-r--r-- | test/files/run/t7331c.scala | 11 |
8 files changed, 51 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/reflect/ToolBoxFactory.scala b/src/compiler/scala/tools/reflect/ToolBoxFactory.scala index 64b8870619..ec61f7a945 100644 --- a/src/compiler/scala/tools/reflect/ToolBoxFactory.scala +++ b/src/compiler/scala/tools/reflect/ToolBoxFactory.scala @@ -8,6 +8,7 @@ import scala.tools.nsc.typechecker.Modes import scala.tools.nsc.io.VirtualDirectory import scala.tools.nsc.interpreter.AbstractFileClassLoader import scala.tools.nsc.util.FreshNameCreator +import scala.tools.nsc.ast.parser.Tokens.EOF import scala.reflect.internal.Flags._ import scala.reflect.internal.util.{BatchSourceFile, NoSourceFile, NoFile} import java.lang.{Class => jClass} @@ -273,14 +274,13 @@ abstract class ToolBoxFactory[U <: JavaUniverse](val u: U) { factorySelf => def parse(code: String): Tree = { val run = new Run reporter.reset() - val wrappedCode = "object wrapper {" + EOL + code + EOL + "}" - val file = new BatchSourceFile("<toolbox>", wrappedCode) + val file = new BatchSourceFile("<toolbox>", code) val unit = new CompilationUnit(file) phase = run.parserPhase val parser = new syntaxAnalyzer.UnitParser(unit) - val wrappedTree = parser.parse() + val parsed = parser.templateStats() + parser.accept(EOF) throwIfErrors() - val PackageDef(_, List(ModuleDef(_, _, Template(_, _, _ :: parsed)))) = wrappedTree parsed match { case expr :: Nil => expr case stats :+ expr => Block(stats, expr) @@ -402,7 +402,7 @@ abstract class ToolBoxFactory[U <: JavaUniverse](val u: U) { factorySelf => def compile(tree: u.Tree): () => Any = { if (compiler.settings.verbose.value) println("importing "+tree) - var ctree: compiler.Tree = importer.importTree(tree) + val ctree: compiler.Tree = importer.importTree(tree) if (compiler.settings.verbose.value) println("compiling "+ctree) compiler.compile(ctree) diff --git a/src/reflect/scala/reflect/internal/Importers.scala b/src/reflect/scala/reflect/internal/Importers.scala index 43902c1930..9a8dee1f15 100644 --- a/src/reflect/scala/reflect/internal/Importers.scala +++ b/src/reflect/scala/reflect/internal/Importers.scala @@ -443,7 +443,12 @@ trait Importers extends api.Importers { self: SymbolTable => } }) tryFixup() - mytree + // we have to be careful with position import as some shared trees + // like EmptyTree, emptyValDef don't support position assignment + if (tree.pos != NoPosition) + mytree.setPos(importPosition(tree.pos)) + else + mytree } def importValDef(tree: from.ValDef): ValDef = importTree(tree).asInstanceOf[ValDef] diff --git a/test/files/run/t7331a.check b/test/files/run/t7331a.check new file mode 100644 index 0000000000..a59b400344 --- /dev/null +++ b/test/files/run/t7331a.check @@ -0,0 +1,2 @@ +source-<toolbox>,line-1,offset=0 +2
\ No newline at end of file diff --git a/test/files/run/t7331a.scala b/test/files/run/t7331a.scala new file mode 100644 index 0000000000..1851945e63 --- /dev/null +++ b/test/files/run/t7331a.scala @@ -0,0 +1,10 @@ +import scala.reflect.runtime.universe._ +import scala.reflect.runtime.{currentMirror => cm} +import scala.tools.reflect.ToolBox + +object Test extends App { + val tb = cm.mkToolBox() + val tree = tb.parse("x") + println(tree.pos) + println(tree.pos.source.content.length) +}
\ No newline at end of file diff --git a/test/files/run/t7331b.check b/test/files/run/t7331b.check new file mode 100644 index 0000000000..7034a95a3f --- /dev/null +++ b/test/files/run/t7331b.check @@ -0,0 +1,3 @@ +reflective compilation has failed: + +')' expected but eof found. diff --git a/test/files/run/t7331b.scala b/test/files/run/t7331b.scala new file mode 100644 index 0000000000..052656d11b --- /dev/null +++ b/test/files/run/t7331b.scala @@ -0,0 +1,11 @@ +import scala.reflect.runtime.universe._ +import scala.reflect.runtime.{currentMirror => cm} +import scala.tools.reflect.{ToolBox, ToolBoxError} + +object Test extends App { + val tb = cm.mkToolBox() + try tb.parse("f(x") + catch { + case ToolBoxError(msg, _) => println(msg) + } +}
\ No newline at end of file diff --git a/test/files/run/t7331c.check b/test/files/run/t7331c.check new file mode 100644 index 0000000000..af9f1b1ad9 --- /dev/null +++ b/test/files/run/t7331c.check @@ -0,0 +1,3 @@ +ClassDef(Modifiers(), newTypeName("C"), List(), Template(List(Select(Ident(scala), newTypeName("AnyRef"))), emptyValDef, List(DefDef(Modifiers(), nme.CONSTRUCTOR, List(), List(List()), TypeTree(), Block(List(Apply(Select(Super(This(tpnme.EMPTY), tpnme.EMPTY), nme.CONSTRUCTOR), List())), Literal(Constant(()))))))) +source-<toolbox>,line-1,offset=6 +NoPosition diff --git a/test/files/run/t7331c.scala b/test/files/run/t7331c.scala new file mode 100644 index 0000000000..75873afcd0 --- /dev/null +++ b/test/files/run/t7331c.scala @@ -0,0 +1,11 @@ +import scala.reflect.runtime.universe._ +import scala.reflect.runtime.{currentMirror => cm} +import scala.tools.reflect.ToolBox + +object Test extends App { + val tb = cm.mkToolBox() + val tree = tb.parse("class C").asInstanceOf[ClassDef] + println(showRaw(tree)) + println(tree.pos) + println(tree.impl.self.pos) +}
\ No newline at end of file |