summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala13
-rw-r--r--test/files/run/t3897.check8
-rw-r--r--test/files/run/t3897/J_2.java23
-rw-r--r--test/files/run/t3897/a_1.scala8
-rw-r--r--test/files/run/t3897/a_2.scala13
5 files changed, 60 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
index 160ce03a7f..7d216dc3aa 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
@@ -491,12 +491,15 @@ abstract class GenJVM extends SubComponent {
nannots
}
+ // @M don't generate java generics sigs for (members of) implementation classes, as they are monomorphic (TODO: ok?)
private def noGenericSignature(sym: Symbol) = (
- sym.isSynthetic ||
- sym.isLiftedMethod ||
- (sym hasFlag Flags.EXPANDEDNAME) ||
- // @M don't generate java generics sigs for (members of) implementation classes, as they are monomorphic (TODO: ok?)
- (sym.ownerChain exists (_.isImplClass))
+ // PP: This condition used to include sym.hasExpandedName, but this leads to the total loss
+ // of generic information if a private member is accessed from a closure: both the field and
+ // the accessor were generated without it. This is particularly bad because the availability
+ // of generic information could disappear as a consequence of a seemingly unrelated change.
+ sym.isSynthetic
+ || sym.isLiftedMethod
+ || (sym.ownerChain exists (_.isImplClass))
)
def addGenericSignature(jmember: JMember, sym: Symbol, owner: Symbol) {
if (noGenericSignature(sym)) ()
diff --git a/test/files/run/t3897.check b/test/files/run/t3897.check
new file mode 100644
index 0000000000..244b83716f
--- /dev/null
+++ b/test/files/run/t3897.check
@@ -0,0 +1,8 @@
+(One$$messages,scala.collection.mutable.MutableList<java.lang.String>)
+(One$$messages,scala.collection.mutable.MutableList<java.lang.String>)
+(messages,scala.collection.mutable.MutableList<java.lang.String>)
+(messages,scala.collection.mutable.MutableList<java.lang.String>)
+(One$$messages,scala.collection.mutable.MutableList<java.lang.String>)
+(One$$messages,scala.collection.mutable.MutableList<java.lang.String>)
+(messages,scala.collection.mutable.MutableList<java.lang.String>)
+(messages,scala.collection.mutable.MutableList<java.lang.String>)
diff --git a/test/files/run/t3897/J_2.java b/test/files/run/t3897/J_2.java
new file mode 100644
index 0000000000..5d5131737e
--- /dev/null
+++ b/test/files/run/t3897/J_2.java
@@ -0,0 +1,23 @@
+import java.lang.reflect.*;
+
+public class J_2 {
+ public void f1(Class<?> clazz) {
+ Field[] fields = clazz.getDeclaredFields();
+ for (int i = 0 ; i < fields.length; i++) {
+ System.out.println("(" + fields[i].getName() + "," + fields[i].getGenericType() + ")");
+ }
+ }
+ public void f2(Class<?> clazz) {
+ Method[] methods = clazz.getDeclaredMethods();
+ for (int i = 0 ; i < methods.length; i++) {
+ System.out.println("(" + methods[i].getName() + "," + methods[i].getGenericReturnType() + ")");
+ }
+ }
+
+ public void javaRun() {
+ f1(One.class);
+ f2(One.class);
+ f1(Two.class);
+ f2(Two.class);
+ }
+} \ No newline at end of file
diff --git a/test/files/run/t3897/a_1.scala b/test/files/run/t3897/a_1.scala
new file mode 100644
index 0000000000..4da959e2ac
--- /dev/null
+++ b/test/files/run/t3897/a_1.scala
@@ -0,0 +1,8 @@
+class One {
+ private val messages = new collection.mutable.MutableList[String]
+ List("a") foreach { messages += _ }
+}
+
+class Two {
+ private val messages = new collection.mutable.MutableList[String]
+}
diff --git a/test/files/run/t3897/a_2.scala b/test/files/run/t3897/a_2.scala
new file mode 100644
index 0000000000..da5f8df63e
--- /dev/null
+++ b/test/files/run/t3897/a_2.scala
@@ -0,0 +1,13 @@
+object Test {
+ def f1(clazz: Class[_]) = clazz.getDeclaredFields.toList map (f => (f.getName, f.getGenericType)) foreach println
+ def f2(clazz: Class[_]) = clazz.getDeclaredMethods.toList map (f => (f.getName, f.getGenericReturnType)) foreach println
+
+ def main(args: Array[String]): Unit = {
+ f1(classOf[One])
+ f2(classOf[One])
+ f1(classOf[Two])
+ f2(classOf[Two])
+
+ new J_2().javaRun
+ }
+}