summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-01-14 01:22:05 +0000
committerPaul Phillips <paulp@improving.org>2010-01-14 01:22:05 +0000
commit763be33feae8be5b026700189caa21f0e255b8f7 (patch)
tree02256bfc312f8975f94048a11816fe5db671ae5c /src/compiler
parent34fe81a8a91aeb63f6316211ac9212899ec14116 (diff)
downloadscala-763be33feae8be5b026700189caa21f0e255b8f7.tar.gz
scala-763be33feae8be5b026700189caa21f0e255b8f7.tar.bz2
scala-763be33feae8be5b026700189caa21f0e255b8f7.zip
Finished up fixing #2773.
import synthetic locals from previous scopes.
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/Interpreter.scala15
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala9
2 files changed, 10 insertions, 14 deletions
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)
}