< prev index next >

src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java

Print this page

        

@@ -121,13 +121,34 @@
                 @SuppressWarnings("unchecked")
                 ArrayList<TypeAnnotation> tmp = l[pos];
                 tmp.add(t);
             }
         }
+        // If a constructor has a mandated outer this, it has no
+        // annotations and the annotations to parameter mapping should
+        // be offset by 1.
+        boolean offset = false;
+        if (decl instanceof Constructor) {
+            Constructor<?> ctor = (Constructor<?>) decl;
+            Class<?> declaringClass = ctor.getDeclaringClass();
+            if (!declaringClass.isEnum() &&
+                (declaringClass.isMemberClass() &&
+                 (declaringClass.getModifiers() & Modifier.STATIC) == 0) ) {
+                offset = true;
+            }
+        }
         for (int i = 0; i < size; i++) {
+            ArrayList<TypeAnnotation> list;
+            if (offset) {
             @SuppressWarnings("unchecked")
-            ArrayList<TypeAnnotation> list = l[i];
+                ArrayList<TypeAnnotation> tmp = (i == 0) ? null : l[i - 1];
+                list = tmp;
+            } else {
+                @SuppressWarnings("unchecked")
+                ArrayList<TypeAnnotation> tmp = l[i];
+                list = tmp;
+            }
             TypeAnnotation[] typeAnnotations;
             if (list != null) {
                 typeAnnotations = list.toArray(new TypeAnnotation[list.size()]);
             } else {
                 typeAnnotations = EMPTY_TYPE_ANNOTATION_ARRAY;
< prev index next >