[PATCH] RFR: 8054213: Class name repeated in output of Type.toString()

Sergey Ustimenko merkel05 at gmail.com
Thu Mar 17 12:18:18 UTC 2016


Forgot to attach a patch

2016-03-17 15:13 GMT+03:00 Sergey Ustimenko <merkel05 at gmail.com>:

> Hi all,
>
> bug https://bugs.openjdk.java.net/browse/JDK-8054213
>
> This fix modifies behavior of Type.to String() to conform with JLS 13.1
> paragraph 1
> and also JVMS 4.2.1. For now in case of parametrized types inner type
> name consists
> of normal binary name of immediately enclosing type, followed by $ and
> finally followed
> by simple name of the member type.
>
> Patch with changes and jtreg test attached. I am looking for reviews and
> for sponsor to
> push this one.
>
> Thanks,
> Sergey.
>

-Sergey
-------------- next part --------------
diff --git a/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java b/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java
--- a/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java
+++ b/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,10 +25,7 @@
 
 package sun.reflect.generics.reflectiveObjects;
 
-import sun.reflect.generics.tree.FieldTypeSignature;
-
 import java.lang.reflect.MalformedParameterizedTypeException;
-import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
@@ -212,15 +209,16 @@
             else
                 sb.append(ownerType.toString());
 
-            sb.append(".");
+            sb.append("$");
 
-            if (ownerType instanceof ParameterizedTypeImpl) {
+            if (ownerType instanceof ParameterizedTypeImpl)
                 // Find simple name of nested type by removing the
                 // shared prefix with owner.
-                sb.append(rawType.getName().replace( ((ParameterizedTypeImpl)ownerType).rawType.getName() + "$",
-                                         ""));
-            } else
-                sb.append(rawType.getName());
+                sb.append(
+                        rawType.getName().replace(((ParameterizedTypeImpl) ownerType).rawType.getName() + "$", "")
+                );
+            else
+                sb.append(rawType.getSimpleName());
         } else
             sb.append(rawType.getName());
 
diff --git a/test/java/lang/reflect/Method/TestReturnTypeDuplication.java b/test/java/lang/reflect/Method/TestReturnTypeDuplication.java
new file mode 100644
--- /dev/null
+++ b/test/java/lang/reflect/Method/TestReturnTypeDuplication.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8054213
+ * @summary Check that Type.toString() generates valid
+ * output for static classes and interfaces
+ * @author Sergey Ustimenko
+ */
+public class TestReturnTypeDuplication<F> {
+
+    private static final String[] SIGNATURES = {
+            "TestReturnTypeDuplication$Static$A",
+            "TestReturnTypeDuplication$StaticParametrised<java.lang.String>$A",
+            "TestReturnTypeDuplication$Interface",
+            "TestReturnTypeDuplication$InterfaceParametrised<java.lang.String>",
+            "TestReturnTypeDuplication<java.lang.String>$Inner$A",
+            "TestReturnTypeDuplication<java.lang.String>$InnerParametrised<java.lang.String>$A"
+    };
+
+
+    public static void main(String[] args) throws Exception {
+        check(SIGNATURES[0], getFooGenericReturnType("foo0"));
+        check(SIGNATURES[1], getFooGenericReturnType("foo1"));
+        check(SIGNATURES[2], getFooGenericReturnType("foo2"));
+        check(SIGNATURES[3], getFooGenericReturnType("foo3"));
+        check(SIGNATURES[4], getFooGenericReturnType("foo4"));
+        check(SIGNATURES[5], getFooGenericReturnType("foo5"));
+    }
+
+    private static void check(String expected, String actual) {
+        if (!expected.equals(actual)) {
+            throw new RuntimeException(String.format("TypeName invalid! Expected {%s}, got {%s}", expected, actual));
+        }
+    }
+
+    private static String getFooGenericReturnType(String foo) throws Exception {
+        return TestReturnTypeDuplication.class.getMethod(foo).getGenericReturnType().getTypeName();
+    }
+
+    class Inner {class A{}}
+
+    class InnerParametrised<T> {class A{}}
+
+    static class Static {class A{}}
+
+    static class StaticParametrised<T> {class A{}}
+
+    interface Interface {}
+
+    interface InterfaceParametrised<T> {}
+
+    public TestReturnTypeDuplication.Static.A foo0(){return null;}
+
+    public TestReturnTypeDuplication.StaticParametrised<String>.A foo1(){return null;}
+
+    public TestReturnTypeDuplication.Interface foo2(){return null;}
+
+    public TestReturnTypeDuplication.InterfaceParametrised<String> foo3(){return null;}
+
+    public TestReturnTypeDuplication<String>.Inner.A foo4(){return null;}
+
+    public TestReturnTypeDuplication<String>.InnerParametrised<String>.A foo5(){return null;}
+
+}


More information about the core-libs-dev mailing list