summaryrefslogtreecommitdiff
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
parent6402af9e5d90af5219b90ea08f007b7336cefefa (diff)
downloadscala-f36d200b2895e699d6d5c250209d7e2138308467.tar.gz
scala-f36d200b2895e699d6d5c250209d7e2138308467.tar.bz2
scala-f36d200b2895e699d6d5c250209d7e2138308467.zip
Fixed #1329.
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/GenICode.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala7
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala23
-rw-r--r--src/compiler/scala/tools/nsc/transform/LazyVals.scala1
-rw-r--r--test/files/jvm5/OuterEnum.java5
-rw-r--r--test/files/jvm5/outerEnum.check1
-rw-r--r--test/files/jvm5/outerEnum.scala9
-rw-r--r--test/files/lib/enums.jar.desired.sha11
9 files changed, 44 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)
}
}
diff --git a/test/files/jvm5/OuterEnum.java b/test/files/jvm5/OuterEnum.java
new file mode 100644
index 0000000000..75d3f34223
--- /dev/null
+++ b/test/files/jvm5/OuterEnum.java
@@ -0,0 +1,5 @@
+package enums;
+
+public class OuterEnum {
+ public enum Foo { Bar }
+}
diff --git a/test/files/jvm5/outerEnum.check b/test/files/jvm5/outerEnum.check
new file mode 100644
index 0000000000..ebd7525b33
--- /dev/null
+++ b/test/files/jvm5/outerEnum.check
@@ -0,0 +1 @@
+Bar
diff --git a/test/files/jvm5/outerEnum.scala b/test/files/jvm5/outerEnum.scala
new file mode 100644
index 0000000000..18794b7dbe
--- /dev/null
+++ b/test/files/jvm5/outerEnum.scala
@@ -0,0 +1,9 @@
+import enums._
+
+object Test extends Application {
+ def foo {
+ val res: OuterEnum.Foo = OuterEnum.Foo.Bar
+ println(res)
+ }
+ foo
+}
diff --git a/test/files/lib/enums.jar.desired.sha1 b/test/files/lib/enums.jar.desired.sha1
new file mode 100644
index 0000000000..83efe7ab98
--- /dev/null
+++ b/test/files/lib/enums.jar.desired.sha1
@@ -0,0 +1 @@
+ec9e5587d2b3c3e1f1e3e2d38b0731c01ee26772 ?enums.jar