diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2008-09-12 18:38:05 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2008-09-12 18:38:05 +0000 |
commit | f36d200b2895e699d6d5c250209d7e2138308467 (patch) | |
tree | 6c0d76ec7fa7129e12cd3ec8197dd91a9ced0760 /src | |
parent | 6402af9e5d90af5219b90ea08f007b7336cefefa (diff) | |
download | scala-f36d200b2895e699d6d5c250209d7e2138308467.tar.gz scala-f36d200b2895e699d6d5c250209d7e2138308467.tar.bz2 scala-f36d200b2895e699d6d5c250209d7e2138308467.zip |
Fixed #1329.
Diffstat (limited to 'src')
5 files changed, 28 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala index 811efc410b..9709fa53d3 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala @@ -929,7 +929,7 @@ abstract class GenICode extends SubComponent { generatedType = SCALA_ALLREF case _ => ctx.bb.emit(CONSTANT(value), tree.pos); - generatedType = toTypeKind(value.tpe) + generatedType = toTypeKind(tree.tpe.underlying) } ctx diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala index 7bfedd634b..2bfc225754 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala @@ -890,7 +890,7 @@ abstract class GenJVM extends SubComponent { val sym = const.symbolValue jcode.emitGETSTATIC(javaName(sym.owner), javaName(sym), - javaType(const.tpe)) + javaType(sym.tpe.underlying)) case _ => abort("Unknown constant value: " + const); } diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 8fbf8926e7..99b8089b8b 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -2040,7 +2040,12 @@ A type's typeSymbol should never be inspected directly. /** the canonical creator for a constant type */ def mkConstantType(value: Constant): ConstantType = { - class UniqueConstantType extends ConstantType(value) with UniqueType + class UniqueConstantType extends ConstantType(value) with UniqueType { + /** Save the type of 'value'. For Java enums, it depends on finding the linked class, + * which might not be found after 'flatten'. */ + private lazy val _tpe: Type = value.tpe + override def underlying: Type = _tpe + } unique(new UniqueConstantType) } 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) } } } diff --git a/src/compiler/scala/tools/nsc/transform/LazyVals.scala b/src/compiler/scala/tools/nsc/transform/LazyVals.scala index d5d96927ca..b53fa2fcf4 100644 --- a/src/compiler/scala/tools/nsc/transform/LazyVals.scala +++ b/src/compiler/scala/tools/nsc/transform/LazyVals.scala @@ -76,7 +76,6 @@ abstract class LazyVals extends Transform { } copy.Template(tree, parents, self, stats) - case _ => super.transform(tree) } } |