summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2008-09-12 18:38:05 +0000
committerIulian Dragos <jaguarul@gmail.com>2008-09-12 18:38:05 +0000
commitf36d200b2895e699d6d5c250209d7e2138308467 (patch)
tree6c0d76ec7fa7129e12cd3ec8197dd91a9ced0760 /src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
parent6402af9e5d90af5219b90ea08f007b7336cefefa (diff)
downloadscala-f36d200b2895e699d6d5c250209d7e2138308467.tar.gz
scala-f36d200b2895e699d6d5c250209d7e2138308467.tar.bz2
scala-f36d200b2895e699d6d5c250209d7e2138308467.zip
Fixed #1329.
Diffstat (limited to 'src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala')
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
index cba063430a..c77d1700c6 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
@@ -354,7 +354,7 @@ abstract class ClassfileParser {
var sflags = transFlags(jflags, true)
var nameIdx = in.nextChar
externalName = pool.getClassName(nameIdx)
- val c = pool.getClassSymbol(nameIdx)
+ val c = if (externalName.toString.indexOf('$') < 0) pool.getClassSymbol(nameIdx) else clazz
if (c != clazz && externalName.toString.indexOf("$") < 0) {
if ((clazz eq NoSymbol) && (c ne NoSymbol)) { // XXX: needed for build compiler, so can't protect with inIDE
clazz = c
@@ -832,7 +832,12 @@ abstract class ClassfileParser {
* and implicitly current class' superclasses.
*/
private def enterOwnInnerClasses {
- def enterClassAndModule(name: Name, completer: global.loaders.SymbolLoader, jflags: Int): Symbol = {
+ def className(name: Name): Name = {
+ name.subName(name.lastPos('.') + 1, name.length)
+ }
+
+ def enterClassAndModule(entry: InnerClassEntry, completer: global.loaders.SymbolLoader, jflags: Int) {
+ val name = entry.originalName
var sflags = transFlags(jflags, true)
val innerClass = getOwner(jflags).newClass(NoPosition, name.toTypeName).setInfo(completer).setFlag(sflags)
@@ -841,6 +846,18 @@ abstract class ClassfileParser {
getScope(jflags).enter(innerClass)
getScope(jflags).enter(innerModule)
+
+ val decls = innerClass.enclosingPackage.info.decls
+ val e = decls.lookupEntry(className(entry.externalName))
+ if (e ne null) {
+ //println("removing " + e)
+ decls.unlink(e)
+ }
+ val e1 = decls.lookupEntry(className(entry.externalName).toTypeName)
+ if (e1 ne null) {
+ //println("removing " + e1)
+ decls.unlink(e1)
+ }
}
for (entry <- innerClasses.values) {
@@ -849,7 +866,7 @@ abstract class ClassfileParser {
val file = global.classPath.lookupPath(
entry.externalName.replace('.', java.io.File.separatorChar).toString, false)
assert(file ne null, entry.externalName)
- enterClassAndModule(entry.originalName, new global.loaders.ClassfileLoader(file, null, null), entry.jflags)
+ enterClassAndModule(entry, new global.loaders.ClassfileLoader(file, null, null), entry.jflags)
}
}
}