diff options
author | Martin Odersky <odersky@gmail.com> | 2004-07-01 17:13:53 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2004-07-01 17:13:53 +0000 |
commit | 45541e41cb9a6d456902240898e3efb9661d4372 (patch) | |
tree | 7737084f99a05b4b18d8d2d8a624febb6c276a62 /sources | |
parent | 1c5ee40dabefd1a9a8a0f061351e0eb8b20d2478 (diff) | |
download | scala-45541e41cb9a6d456902240898e3efb9661d4372.tar.gz scala-45541e41cb9a6d456902240898e3efb9661d4372.tar.bz2 scala-45541e41cb9a6d456902240898e3efb9661d4372.zip |
*** empty log message ***
Diffstat (limited to 'sources')
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 } |