summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2004-07-01 17:13:53 +0000
committerMartin Odersky <odersky@gmail.com>2004-07-01 17:13:53 +0000
commit45541e41cb9a6d456902240898e3efb9661d4372 (patch)
tree7737084f99a05b4b18d8d2d8a624febb6c276a62
parent1c5ee40dabefd1a9a8a0f061351e0eb8b20d2478 (diff)
downloadscala-45541e41cb9a6d456902240898e3efb9661d4372.tar.gz
scala-45541e41cb9a6d456902240898e3efb9661d4372.tar.bz2
scala-45541e41cb9a6d456902240898e3efb9661d4372.zip
*** empty log message ***
-rw-r--r--sources/scala/tools/scalac/typechecker/Analyzer.scala19
-rw-r--r--sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala6
-rw-r--r--sources/scala/tools/scalac/typechecker/Context.scala10
3 files changed, 26 insertions, 9 deletions
diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala
index a999f184fa..8266dd1c59 100644
--- a/sources/scala/tools/scalac/typechecker/Analyzer.scala
+++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala
@@ -15,7 +15,7 @@
import ch.epfl.lamp.util.Pair;
import scala.tools.util.Position;
-import scalac.{symtab => scalac_symtab, _};
+import scalac._;
import scalac.util._;
import scalac.ast._;
import scalac.ast.printer._;
@@ -23,6 +23,7 @@ import scalac.atree.AConstant;
import scalac.atree.AConstant$CHAR;
import scalac.atree.AConstant$INT;
import scalac.symtab.classfile._;
+import scalac.{symtab => scalac_symtab}
import Tree._;
import java.util.HashMap;
import scala.tools.scalac.util.NewArray;
@@ -943,7 +944,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(
var sym: Symbol = null;
if (name == Names.CONSTRUCTOR) {
var c = context;
- while (c.tree.isInstanceOf[Tree$Import]) c = c.outer;
+ while (c.isImportContext) c = c.outer;
val clazz: Symbol = c.enclClass.owner;
if (!(c.tree.isInstanceOf[Tree$Template]) ||
clazz.isModuleClass() ||
@@ -1616,14 +1617,21 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(
var sym: Symbol = Symbol.NONE;
var pre: Type = null;
var qual: Tree = Tree.Empty;
+ var stopPos: int = Integer.MIN_VALUE;
var nextcontext: Context = context;
while (sym.kind == NONE && nextcontext != Context.NONE) {
sym = nextcontext.scope.lookup(name);
- if (sym.kind == NONE) {
+ if (sym.kind != NONE) {
+ stopPos = sym.pos;
+ } else {
nextcontext = nextcontext.enclClass;
if (nextcontext != Context.NONE) {
sym = nextcontext.owner.thisSym().info().lookup(name);
- if (sym.kind == NONE) nextcontext = nextcontext.outer;
+ if (sym.kind != NONE) {
+ stopPos = nextcontext.owner.pos;
+ } else {
+ nextcontext = nextcontext.outer;
+ }
}
}
}
@@ -1631,8 +1639,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(
var impcontext: Context = context.prevImport;
var lastimpcontext: Context = null;
var sym1: Symbol = Symbol.NONE;
- while (sym1.kind == NONE && impcontext.depth > nextcontext.depth) {
- //System.out.println("imp " + name + " from " + impcontext.tree);
+ while (sym1.kind == NONE && impcontext != Context.NONE && impcontext.tree.pos > stopPos) {
sym1 = impcontext.importedSymbol(name);
lastimpcontext = impcontext;
impcontext = impcontext.outer.prevImport;
diff --git a/sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala b/sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala
index 960096e212..5d99791f38 100644
--- a/sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala
+++ b/sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala
@@ -39,7 +39,11 @@ class AnalyzerPhase(global: scalac_Global, descriptor: PhaseDescriptor) extends
startContext = addImport(startContext, global.definitions.PREDEF);
}
- startContext = new Context(Tree.Empty, startContext.owner, global.definitions.ROOT_CLASS.members(), startContext);
+ startContext = new Context(
+ Tree.Empty,
+ startContext.owner,
+ global.definitions.ROOT_CLASS.members(),
+ startContext);
var consoleContext = new Context(
Tree.Empty,
diff --git a/sources/scala/tools/scalac/typechecker/Context.scala b/sources/scala/tools/scalac/typechecker/Context.scala
index 822b4bf148..8de7f321f5 100644
--- a/sources/scala/tools/scalac/typechecker/Context.scala
+++ b/sources/scala/tools/scalac/typechecker/Context.scala
@@ -45,8 +45,7 @@ class Context {
tree.isInstanceOf[Tree$CompoundType]) &&
tree != outer.tree) this
else outer.enclClass;
- this.prevImport = if (tree.isInstanceOf[Tree$Import] &&
- tree != outer.tree) this
+ this.prevImport = if (isImportContext && tree != outer.tree) this
else outer.prevImport;
this.variance = outer.variance;
this.constructorClass = outer.constructorClass;
@@ -75,12 +74,19 @@ class Context {
outer.isTopLevel()
}
+ def isImportContext: boolean = tree.isInstanceOf[Tree$Import];
+
def importString(): String =
if (prevImport == Context.NONE) ""
else
prevImport.outer.importString() +
prevImport.tree.symbol().toString() + ";";
+ override def toString(): String = {
+ if (this == Context.NONE) "Context.NONE";
+ else tree.toString() + "\n:: " + outer.toString()
+ }
+
def importPrefix(): Tree = tree match {
case Tree$Import(expr, _) => expr
}