Hej Joe,

New version looks good!

Thanks for the explanations, makes sense to me.

Cheers
/Joel

On Wed, 10 Oct 2018 at 08:27, joe darcy <joe.da...@oracle.com> wrote:

> Hi Joel,
>
> Thanks for the review; slightly revised version at
>
>      http://cr.openjdk.java.net/~darcy/8058202.3/
>
> Comments below.
>
>
> On 10/9/2018 11:00 AM, Joel Borggrén-Franck wrote:
> > Hi Joe,
> >
> > Good to see this happening. In general looks good to me, a few nits
> below.
> >
> > AnnotatedTypeBaseImpl contains comments indicating from which
> > superclass or interface the overridden methods comes. I'd either add
> > // Object at line 207 or delete line 145 and 177 for consistency.
>
> Okay; comments added to follow that local convention.
>
> >
> > Even though this isn't performance critical by far the allocation at
> > line 215 still bugs me a bit given that the common case will most
> > certainly be no annotations.
>
> Sure; refactored to avoid the allocation.
>
> >
> > Why the inverted logic line 250-253, IIRC you should be able to test
> > if it is an AnnotatedBaseTypeImpl, or?
>
> I was aiming to avoid testing for the impl class directly to not
> directly tie the classes to this particular implementation of the
> AnnotatedType hierarchy. However, inter-operability based on the specs
> would need the equals and hashCode behavior to be defined.
>
> >
> > For equalsTypeAndAnnotations and baseHashCode lines 232-244 equals
> > test for owner type equality while hashcode doesn't include owner
> > type. I must confess I no longer remember the equals-hashCode contract
> > but I assume this is intentional.
>
> Good catch; equals and hashCode checks made consistent.
>
> Some refactoring and hardening of the test included too.
>
> Delta-diffs below.
>
> Thanks,
>
> -Joe
>
> diff
> webrev.2/raw_files/new/src/java.base/share/classes/sun/reflect/annotation/AnnotatedTypeFactory.java
>
> webrev/raw_files/new/src/java.base/share/classes/sun/reflect/annotation/AnnotatedTypeFactory.java
>
>
> 2c2
> <  * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights
> reserved.
> ---
>  >  * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights
> reserved.
> 207c207
> <         @Override
> ---
>  >         @Override // java.lang.Object
> 215d214
> <             StringJoiner sj = new StringJoiner(" ");
> 216a216
>  >         StringJoiner sj = new StringJoiner(" ");
> 228,229c228,231
> <             }
> <             return sj.toString();
> ---
>  >         return sj.toString();
>  >             } else {
>  >         return "";
>  >         }
> 244c246,247
> <                 Objects.hash((Object[])getAnnotations());
> ---
>  >                 Objects.hash((Object[])getAnnotations()) ^
>  >         Objects.hash(getAnnotatedOwnerType());
>
> diff
> webrev.2/raw_files/new/test/jdk/java/lang/annotation/typeAnnotations/TestObjectMethods.java
>
> webrev/raw_files/new/test/jdk/java/lang/annotation/typeAnnotations/TestObjectMethods.java
>
>
> 142d141
> <
> 157,168c156,158
> <             AnnotatedType annotType1 = m.getAnnotatedReturnType();
> <             AnnotatedType annotType2 = m.getAnnotatedReturnType();
> <
> <             boolean valid = annotType1.equals(annotType2);
> <
> <             if (!valid) {
> <                 errors++;
> <                 System.err.println(annotType1);
> <                 System.err.println(" is not equal to ");
> <                 System.err.println(annotType2);
> <                 System.err.println();
> <             }
> ---
>  >         checkTypesForEquality(m.getAnnotatedReturnType(),
>  >                   m.getAnnotatedReturnType(),
>  >                   true);
> 171a162,185
>  >     private static void checkTypesForEquality(AnnotatedType annotType1,
>  >                           AnnotatedType annotType2,
>  >                           boolean expected) {
>  >     boolean comparison = annotType1.equals(annotType2);
>  >
>  >     if (comparison) {
>  >         int hash1 = annotType1.hashCode();
>  >         int hash2 = annotType1.hashCode();
>  >         if (hash1 != hash2) {
>  >         errors++;
>  >         System.err.format("Equal AnnotatedTypes with unequal hash
> codes: %n%s%n%s%n",
>  >                   annotType1.toString(), annotType2.toString());
>  >         }
>  >     }
>  >
>  >     if (comparison != expected) {
>  >         errors++;
>  >         System.err.println(annotType1);
>  >         System.err.println(expected ? " is not equal to " : " is
> equal to ");
>  >         System.err.println(annotType2);
>  >         System.err.println();
>  >     }
>  >     }
>  >
> 184,196c198,200
> <                     AnnotatedType annotType1 =
> methods[i].getAnnotatedReturnType();
> <                     AnnotatedType annotType2 =
> methods[j].getAnnotatedReturnType();
> <
> <                     boolean valid = !annotType1.equals(annotType2);
> <
> <                     if (!valid) {
> <                         errors++;
> <                         System.err.println(annotType1);
> <                         System.err.println(" is equal to ");
> <                         System.err.println(annotType2);
> <                         System.err.println();
> <                     }
> <
> ---
>  > checkTypesForEquality(methods[i].getAnnotatedReturnType(),
>  >                       methods[j].getAnnotatedReturnType(),
>  >                       false);
> 209,210c213
> <         Method[] methods1  = clazz1.getDeclaredMethods();
> <         Method[] methods2 = clazz2.getDeclaredMethods();
> ---
>  >         System.err.println("Testing that presence/absence of
> annotations matters for equals comparison.");
> 212,226c215,230
> <         // Skip 0th element since void cannoted be annotated
> <         for (int i = 1; i < methods1.length; i++) {
> <             AnnotatedType annotType1 =
> methods1[i].getAnnotatedReturnType();
> <             AnnotatedType annotType2 =
> methods2[i].getAnnotatedReturnType();
> <
> <             boolean valid  = !annotType1.equals(annotType2);
> <
> <             if (!valid) {
> <                 errors++;
> <                 System.err.println(annotType1);
> <                 System.err.println(" is equal to ");
> <                 System.err.println(annotType2);
> <                 System.err.println();
> <             }
> <         }
> ---
>  >     String methodName = null;
>  >         for (Method method :  clazz1.getDeclaredMethods()) {
>  >         if ("void".equals(method.getReturnType().toString())) {
>  >         continue;
>  >         }
>  >
>  >         methodName = method.getName();
>  >         try {
>  >         checkTypesForEquality(method.getAnnotatedReturnType(),
>  > clazz2.getDeclaredMethod(methodName).getAnnotatedReturnType(),
>  >                       false);
>  >         } catch (Exception e) {
>  >         errors++;
>  >         System.err.println("Method " + methodName + " not found.");
>  >         }
>  >     }
> 230a235
>  >         System.err.println("Testing wildcards");
> 242,248c247
> <         if (awt1.equals(awt2)) {
> <             errors++;
> <             System.err.println(awt1);
> <             System.err.println(" is equal to ");
> <             System.err.println(awt2);
> <             System.err.println();
> <         }
> ---
>  >     checkTypesForEquality(awt1, awt2, false);
> 254d252
> <
>

Reply via email to