diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2009-08-31 14:26:33 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2009-08-31 14:26:33 +0000 |
commit | 09ba9ab65e4e10ce05f099e4bf28a16341dac70c (patch) | |
tree | bb49b08977a5d4c4ca01a5566bc4082363915a3b /src/compiler | |
parent | 158e5db28b9a95f54002302f4393b26aa6106e68 (diff) | |
download | scala-09ba9ab65e4e10ce05f099e4bf28a16341dac70c.tar.gz scala-09ba9ab65e4e10ce05f099e4bf28a16341dac70c.tar.bz2 scala-09ba9ab65e4e10ce05f099e4bf28a16341dac70c.zip |
Fixed #1539.
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Symbols.scala | 4 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala | 33 |
2 files changed, 17 insertions, 20 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala index 192d3a2bb7..b4a2ca9853 100644 --- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala +++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala @@ -708,7 +708,7 @@ trait Symbols { assert(infos.prev eq null, this.name) val tp = infos.info //if (settings.debug.value) System.out.println("completing " + this.rawname + tp.getClass());//debug - lock { + lock { setInfo(ErrorType) throw CyclicReference(this, tp) } @@ -717,7 +717,7 @@ trait Symbols { phase = phaseOf(infos.validFrom) tp.complete(this) // if (settings.debug.value && runId(validTo) == currentRunId) System.out.println("completed " + this/* + ":" + info*/);//DEBUG - unlock() + unlock() } finally { phase = current } diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index a2e7a4a2a4..5aafda4430 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -424,7 +424,7 @@ abstract class ClassfileParser { val staticInfo = ClassInfoType(List(), staticDefs, statics) if (!isScala && !isScalaRaw) { - //println("Entering inner classes for " + clazz) +// println("Entering inner classes for " + clazz) enterOwnInnerClasses } val curbp = in.bp @@ -991,21 +991,28 @@ abstract class ClassfileParser { */ def classSymbol(externalName: Name): Symbol = { /** Return the symbol of `innerName', having the given `externalName'. */ - def innerSymbol(externalName: Name, innerName: Name, static: Boolean): Symbol = + def innerSymbol(externalName: Name, innerName: Name, static: Boolean): Symbol = { + def getMember(sym: Symbol, name: Name): Symbol = + if (static) + if (sym == clazz) staticDefs.lookup(name) + else sym.linkedModuleOfClass.info.member(name) + else + if (sym == clazz) instanceDefs.lookup(name) + else sym.info.member(name) + innerClasses.get(externalName) match { case Some(entry) => val sym = classSymbol(entry.outerName) - if (static) { - val s = atPhase(currentRun.typerPhase)(sym.linkedModuleOfClass.info.member(innerName.toTypeName)) - assert(s ne NoSymbol, sym + "." + innerName + " linkedModule: " + sym.linkedModuleOfClass + sym.linkedModuleOfClass.info.members) - s - } else - sym.info.member(innerName.toTypeName) + val s = atPhase(currentRun.typerPhase)(getMember(sym, innerName.toTypeName)) + assert(s ne NoSymbol, sym + "." + innerName + " linkedModule: " + sym.linkedModuleOfClass + sym.linkedModuleOfClass.info.members) + s + case None => val cls = classNameToSymbol(externalName) cls //if (static) cls.linkedClassOfModule else cls } + } get(externalName) match { case Some(entry) => @@ -1025,16 +1032,6 @@ abstract class ClassfileParser { } } - /** A lazy type that represents a Java inner class. */ - class LazyInnerClassType(innerEntry: InnerClassEntry) extends LazyType { - override def complete(sym: Symbol) { -// println("completing " + sym) - val clazz = innerClasses.classSymbol(innerEntry.externalName) -// println("found symbol: " + clazz) - sym.setInfo(clazz.info) - } - } - def skipAttributes() { val attrCount = in.nextChar for (i <- 0 until attrCount) { |