test failures

Jonathan Gibbons jonathan.gibbons at oracle.com
Thu May 2 18:39:44 PDT 2013


Yes, it looks like the ExecutableType should be updated for 
type-annotations on all of

* return type
* receiver type
* parameter types
* throw types

-- Jon


On 04/25/2013 08:07 PM, Werner Dietl wrote:
> Jon,
>
> if you look 
> at com.sun.tools.javac.code.TypeAnnotations.TypeAnnotationPositions.separateAnnotationsKinds 
> you'll see code like this:
>
>             if (sym.getKind() == ElementKind.METHOD) {
>                 sym.type.asMethodType().restype = type;
>             } else {
>                 sym.type = type;
>             }
>
> If the symbol is a parameter, then only its type is changed, but it 
> looks like we never change the ExecutableType.
> Do you agree that this might be the source of this inconsistency?
> It might be enough to find the method for a parameter and update its 
> ExecutableType, right?
>
> cu, WMD.
>
>
> On Thu, Apr 25, 2013 at 10:30 PM, Jonathan Gibbons 
> <jonathan.gibbons at oracle.com <mailto:jonathan.gibbons at oracle.com>> wrote:
>
>     On 04/24/2013 09:51 PM, Jonathan Gibbons wrote:
>>     tools/javac/processing/model/type/BasicAnnoTests.java
>
>     This test is failing because the internal data model for type
>     annotations within javac is inconsistent.
>
>     The broken test case is this one (and maybe others like it):
>
>>         @Test(posn=1, annoType=TA.class, expect="4")
>>         public int m1(@TA(4) float a) throws Exception { return 0; }
>
>     If you look at the ExecutableElement for m1, you can navigate to
>     the VariableElement for the parameter "a", and from there get to
>     the type annotations on the type used for "a".  The debug output
>     from the test confirms the existence of @TA(4) on "float".
>
>     But there's a second way to get to that instance of "float".
>
>     From the ExecutableElement, you can get an ExecutableType using
>     Element.asType(), and from the ExecutableType, you can get the
>     ParameterTypes using getParameterTypes().  It seems intuitively
>     reasonable to expect that the type of the first parameter obtained
>     in this manner should be the annotated type "@TA(4) float".  The
>     debug output from the test indicates there are no type annotations
>     here, and so the test fails.
>
>     Generally speaking, I think all the following pairs should be
>     equivalent^[1,2] , for any ExecutableElement ee:
>
>     using ExecutableElement
>     	using ExecutableType
>     ee.getReceiverType()
>     	ee.asType().getReceiverType()
>     ee.getReturnType()
>     	ee.asType().getReturnType()
>     ee.getParameters().get(i).asType()
>     	ee.asType().getParameterTypes().get(i)
>     ee.getThrownTypes().get(i)
>     	ee.asType().getThrownTypes().get(i)
>     ee.getTypeParameters().get(i).asType()
>     	ee.asType().getTypeParameters().get(i)
>
>
>     [1] where "equivalent" means that the types and annotations on
>     those types should match: something like a recursive evaluation of
>             Types.isSameType(a, b) &&
>     Objects.equals(a.getAnnotationMirrors(), b.getAnnotationMirrors())
>
>     [2] In practice, I would expect the values to be ==, but I would
>     not mandate that.
>
>     The BasicAnnoTests covers some of these cases, but should be
>     extended to cover all of them.
>
>     -- Jon
>
>
>
>
>
>
>
>
>
> -- 
> http://www.google.com/profiles/wdietl

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/type-annotations-dev/attachments/20130502/0cbdf167/attachment.html 


More information about the type-annotations-dev mailing list