Hi Joe, all,

the logic looks good to me.

In the tests I'm wondering whether to include an annotated wildcard
bound. There is:

307         public @AnnotType(11) Set<@AnnotType(13) ? extends Number>
fooNumberSet2() {return null;}

but nothing like

Set<? extends @AnnotType(13) Number> fooNumberSet2() {return null;}

I wouldn't expect problems for this, but a test would exercise some of
the code that gets added.

Best,
cu, WMD.




On Wed, Oct 10, 2018 at 2:40 AM Joel Borggrén-Franck
<joel.borggren.fra...@gmail.com> wrote:
>
> 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
>> <



-- 
http://www.google.com/profiles/wdietl

Reply via email to