8202469 / 8202473: Correct type annotation resolution for class type variables

Joel Borggrén-Franck joel.borggren.franck at gmail.com
Fri Aug 2 08:00:41 UTC 2019


Hi Rafael

Thanks for looking into this. Can you separate the two fixes into two
different patches? The tests should be moved to
java/lang/annotation/typeAnnotations/... . Nit, copyright year is wrong.

I can host webrevs for you on cr to make it easier for other reviewers, if
you also send me the patches or webrefs off-list to get around the
attachment stripping I can upload them to cr.

cheers
/Joel

On Tue, Jul 23, 2019 at 8:51 PM Rafael Winterhalter <rafael.wth at gmail.com>
wrote:

> I integrated the tests into the jtreg bits (to me it looks like they are
> running ok but since this is my first time, please double-check).
>
> I have already signed the OCA a few years ago when I did some work on
> Glassfish. Let me know if anything else is missing or if I need to do
> anything else.
>
> Here comes the inline changeset including the additional jtreg tests:
>
> Index:
>
> test/jdk/java/lang/reflect/AnnotatedElement/TestTypeAnnotationParameterizedNonInterfaceBound.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> ---
>
> test/jdk/java/lang/reflect/AnnotatedElement/TestTypeAnnotationParameterizedNonInterfaceBound.java
> (revision 55752+:8ae33203d600+)
> +++
>
> test/jdk/java/lang/reflect/AnnotatedElement/TestTypeAnnotationParameterizedNonInterfaceBound.java
> (revision 55752+:8ae33203d600+)
> @@ -0,0 +1,52 @@
> +/*
> + * Copyright (c) 2005, 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 8202473
> + * @summary Make sure a type variable bound on a parameterized
> non-interface bound does not receive a type path offset
> + */
> +
> +import java.lang.annotation.Target;
> +import java.lang.annotation.*;
> +import java.lang.reflect.AnnotatedType;
> +import java.lang.reflect.TypeVariable;
> +import java.util.ArrayList;
> +
> +public class TestTypeAnnotationParameterizedNonInterfaceBound<U extends
> @TestTypeAnnotationParameterizedNonInterfaceBound.TypeAnnotation
> ArrayList<?>> {
> +
> +    public static void main(String[] args) {
> +        TypeVariable<?>[] variables =
> TestTypeAnnotationParameterizedNonInterfaceBound.class.getTypeParameters();
> +        TypeVariable<?> variable = variables[0];
> +        AnnotatedType[] bounds = variable.getAnnotatedBounds();
> +        AnnotatedType bound = bounds[0];
> +        Annotation[] annotations = bound.getAnnotations();
> +        if (annotations.length != 1) {
> +            throw new AssertionError();
> +        }
> +    }
> +
> +    @Retention(RetentionPolicy.RUNTIME)
> +    @Target(ElementType.TYPE_USE)
> +    @interface TypeAnnotation { }
> +}
> Index:
>
> test/jdk/java/lang/reflect/AnnotatedElement/TestTypeAnnotationTwoVariables.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> ---
>
> test/jdk/java/lang/reflect/AnnotatedElement/TestTypeAnnotationTwoVariables.java
> (revision 55752+:8ae33203d600+)
> +++
>
> test/jdk/java/lang/reflect/AnnotatedElement/TestTypeAnnotationTwoVariables.java
> (revision 55752+:8ae33203d600+)
> @@ -0,0 +1,61 @@
> +/*
> + * Copyright (c) 2005, 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 8202473
> + * @summary Make sure a type path for a type variable's bound is filtered
> by variable index
> + */
> +
> +import java.lang.annotation.Target;
> +import java.lang.annotation.*;
> +import java.lang.reflect.AnnotatedParameterizedType;
> +import java.lang.reflect.AnnotatedType;
> +import java.lang.reflect.TypeVariable;
> +import java.util.concurrent.Callable;
> +
> +public class TestTypeAnnotationTwoVariables<
> +        U extends
> Callable<@TestTypeAnnotationTwoVariables.TypeAnnotation(0) ?>,
> +        V extends
> Callable<@TestTypeAnnotationTwoVariables.TypeAnnotation(1) ?>> {
> +
> +    public static void main(String[] args) {
> +        TypeVariable<?>[] variables =
> TestTypeAnnotationTwoVariables.class.getTypeParameters();
> +        for (int i = 0; i < 2; i++) {
> +            TypeVariable<?> variable = variables[i];
> +            AnnotatedType[] bounds = variable.getAnnotatedBounds();
> +            AnnotatedType bound = bounds[0];
> +            AnnotatedParameterizedType parameterizedType =
> (AnnotatedParameterizedType) bound;
> +            AnnotatedType[] actualTypeArguments =
> parameterizedType.getAnnotatedActualTypeArguments();
> +            Annotation[] annotations =
> actualTypeArguments[0].getAnnotations();
> +            if (annotations.length != 1 || ((TypeAnnotation)
> annotations[0]).value() != i) {
> +                throw new AssertionError();
> +            }
> +        }
> +    }
> +
> +    @Retention(RetentionPolicy.RUNTIME)
> +    @Target(ElementType.TYPE_USE)
> +    @interface TypeAnnotation {
> +        int value();
> +    }
> +}
> Index:
>
> test/jdk/java/lang/reflect/AnnotatedElement/TestTypeAnnotationTypeVariableBound.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> ---
>
> test/jdk/java/lang/reflect/AnnotatedElement/TestTypeAnnotationTypeVariableBound.java
> (revision 55752+:8ae33203d600+)
> +++
>
> test/jdk/java/lang/reflect/AnnotatedElement/TestTypeAnnotationTypeVariableBound.java
> (revision 55752+:8ae33203d600+)
> @@ -0,0 +1,51 @@
> +/*
> + * Copyright (c) 2005, 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 8202469
> + * @summary Make sure a type variable that has another type variable as
> its bound receives the correct type annotation
> + */
> +
> +import java.lang.annotation.Target;
> +import java.lang.annotation.*;
> +import java.lang.reflect.AnnotatedType;
> +import java.lang.reflect.TypeVariable;
> +
> +public class TestTypeAnnotationTypeVariableBound<U, V extends
> @TestTypeAnnotationTypeVariableBound.TypeAnnotation U> {
> +
> +    public static void main(String[] args) {
> +        TypeVariable<?>[] variables =
> TestTypeAnnotationTypeVariableBound.class.getTypeParameters();
> +        TypeVariable<?> variable = variables[1];
> +        AnnotatedType[] bounds = variable.getAnnotatedBounds();
> +        AnnotatedType bound = bounds[0];
> +        Annotation[] annotations = bound.getAnnotations();
> +        if (annotations.length != 1) {
> +            throw new AssertionError();
> +        }
> +    }
> +
> +    @Retention(RetentionPolicy.RUNTIME)
> +    @Target(ElementType.TYPE_USE)
> +    @interface TypeAnnotation { }
> +}
> Index:
>
> test/jdk/java/lang/reflect/AnnotatedElement/TestTypeAnnotationUnionBound.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> ---
>
> test/jdk/java/lang/reflect/AnnotatedElement/TestTypeAnnotationUnionBound.java
> (revision 55752+:8ae33203d600+)
> +++
>
> test/jdk/java/lang/reflect/AnnotatedElement/TestTypeAnnotationUnionBound.java
> (revision 55752+:8ae33203d600+)
> @@ -0,0 +1,64 @@
> +/*
> + * Copyright (c) 2005, 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 8202473
> + * @summary Make sure that the union bounds of a type variable receive the
> correct type annotations
> + */
> +
> +import java.lang.annotation.Target;
> +import java.lang.annotation.*;
> +import java.lang.reflect.AnnotatedParameterizedType;
> +import java.lang.reflect.AnnotatedType;
> +import java.lang.reflect.TypeVariable;
> +import java.util.List;
> +import java.util.concurrent.Callable;
> +
> +public class TestTypeAnnotationUnionBound<
> +        U extends Callable<@TestTypeAnnotationUnionBound.TypeAnnotation(0)
> ?> & List<@TestTypeAnnotationUnionBound.TypeAnnotation(1) ?>> {
> +
> +    public static void main(String[] args) {
> +        TypeVariable<?>[] variables =
> TestTypeAnnotationUnionBound.class.getTypeParameters();
> +        TypeVariable<?> variable = variables[0];
> +        if (variable.getAnnotations().length > 0) {
> +            throw new AssertionError();
> +        }
> +        AnnotatedType[] bounds = variable.getAnnotatedBounds();
> +        for (int i = 0; i < 2; i++) {
> +            AnnotatedType bound = bounds[i];
> +            AnnotatedParameterizedType parameterizedType =
> (AnnotatedParameterizedType) bound;
> +            AnnotatedType[] actualTypeArguments =
> parameterizedType.getAnnotatedActualTypeArguments();
> +            Annotation[] annotations =
> actualTypeArguments[0].getAnnotations();
> +            if (annotations.length != 1 || ((TypeAnnotation)
> annotations[0]).value() != i) {
> +                throw new AssertionError();
> +            }
> +        }
> +    }
> +
> +    @Retention(RetentionPolicy.RUNTIME)
> +    @Target(ElementType.TYPE_USE)
> +    @interface TypeAnnotation {
> +        int value();
> +    }
> +}
> Index:
>
> src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> ---
>
> src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java
> (revision 55752:8ae33203d600a7c9f9b2be9b31a0eb8197270ab1)
> +++
>
> src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java
> (revision 55752+:8ae33203d600+)
> @@ -276,11 +276,21 @@
>              // index 1.
>              if (bounds.length > 0) {
>                  Type b0 = bounds[0];
> -                if (!(b0 instanceof Class<?>)) {
> -                    startIndex = 1;
> -                } else {
> -                    Class<?> c = (Class<?>)b0;
> -                    if (c.isInterface()) {
> +                if (!(b0 instanceof TypeVariable<?>)) {
> +                    if (b0 instanceof Class<?>) {
> +                        Class<?> c = (Class<?>) b0;
> +                        if (c.isInterface()) {
> +                            startIndex = 1;
> +                        }
> +                    } else if (b0 instanceof ParameterizedType) {
> +                        ParameterizedType p = (ParameterizedType) b0;
> +                        Type r = p.getRawType();
> +                        if (!(r instanceof Class<?>)) {
> +                            throw new AnnotationFormatError("Unexpected
> raw type: " + r);
> +                        } else if (((Class<?>) r).isInterface()) {
> +                            startIndex = 1;
> +                        }
> +                    } else {
>                          startIndex = 1;
>                      }
>                  }
> @@ -295,10 +305,11 @@
>                          l.add(t);
>                      }
>                  }
> +                TypeAnnotation[] annon =
> l.toArray(EMPTY_TYPE_ANNOTATION_ARRAY);
>                  res[i] =
> AnnotatedTypeFactory.buildAnnotatedType(bounds[i],
>                          AnnotatedTypeFactory.nestingForType(bounds[i],
> loc),
> -                        l.toArray(EMPTY_TYPE_ANNOTATION_ARRAY),
> -                        candidates.toArray(EMPTY_TYPE_ANNOTATION_ARRAY),
> +                        annon,
> +                        annon,
>                          (AnnotatedElement)decl);
>              }
>              return res;
>


More information about the core-libs-dev mailing list