From 763be33feae8be5b026700189caa21f0e255b8f7 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Thu, 14 Jan 2010 01:22:05 +0000 Subject: Finished up fixing #2773. import synthetic locals from previous scopes. --- src/compiler/scala/tools/nsc/Interpreter.scala | 15 +++++++++------ src/compiler/scala/tools/nsc/typechecker/Namers.scala | 9 +-------- 2 files changed, 10 insertions(+), 14 deletions(-) (limited to 'src/compiler') diff --git a/src/compiler/scala/tools/nsc/Interpreter.scala b/src/compiler/scala/tools/nsc/Interpreter.scala index f1d050de03..1655c0130d 100644 --- a/src/compiler/scala/tools/nsc/Interpreter.scala +++ b/src/compiler/scala/tools/nsc/Interpreter.scala @@ -517,12 +517,14 @@ class Interpreter(val settings: Settings, out: PrintWriter) /** A traverser that finds all mentioned identifiers, i.e. things * that need to be imported. It might return extra names. */ - private class ImportVarsTraverser(definedVars: List[Name]) extends Traverser { + private class ImportVarsTraverser extends Traverser { val importVars = new HashSet[Name]() override def traverse(ast: Tree) = ast match { - case Ident(name) => importVars += name - case _ => super.traverse(ast) + // XXX this is obviously inadequate but it's going to require some effort + // to get right. + case Ident(name) if !(name.toString startsWith "x$") => importVars += name + case _ => super.traverse(ast) } } @@ -530,9 +532,9 @@ class Interpreter(val settings: Settings, out: PrintWriter) * in a single interpreter request. */ private sealed abstract class MemberHandler(val member: Tree) { - val usedNames: List[Name] = { - val ivt = new ImportVarsTraverser(boundNames) - ivt.traverseTrees(List(member)) + lazy val usedNames: List[Name] = { + val ivt = new ImportVarsTraverser() + ivt traverse member ivt.importVars.toList } def boundNames: List[Name] = Nil @@ -547,6 +549,7 @@ class Interpreter(val settings: Settings, out: PrintWriter) def extraCodeToEvaluate(req: Request, code: PrintWriter) { } def resultExtractionCode(req: Request, code: PrintWriter) { } + override def toString = "%s(usedNames = %s)".format(this.getClass, usedNames) } private class GenericHandler(member: Tree) extends MemberHandler(member) diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index 4b5b052dcb..ae8fd3a956 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -1188,17 +1188,10 @@ trait Namers { self: Analyzer => def checkSelectors(selectors: List[ImportSelector]): Unit = selectors match { case ImportSelector(from, _, to, _) :: rest => if (from != nme.WILDCARD && base != ErrorType) { - if (base.member(from) == NoSymbol && - base.member(from.toTypeName) == NoSymbol) - context.error(tree.pos, from.decode + " is not a member of " + expr); -/* The previous test should be: if (base.nonLocalMember(from) == NoSymbol && base.nonLocalMember(from.toTypeName) == NoSymbol) - context.error(tree.pos, from.decode + " is not a member of " + expr); + context.error(tree.pos, from.decode + " is not a member of " + expr) - * but this breaks the jvm/interpreter.scala test, because - * it seems it imports a local member of a $iw object - */ if (checkNotRedundant(tree.pos, from, to)) checkNotRedundant(tree.pos, from.toTypeName, to.toTypeName) } -- cgit v1.2.3