Review Request: 7193406 - Clean-up JDK Build Warnings in java.util, java.io

Dan Xu dan.xu at oracle.com
Fri Aug 31 19:06:31 UTC 2012


On 08/30/2012 06:45 PM, Stuart Marks wrote:
> On 8/30/12 7:14 AM, Ulf Zibis wrote:
>> Am 30.08.2012 01:20, schrieb Stuart Marks:
>>> On 8/29/12 4:36 AM, Ulf Zibis wrote:
>>>>> @SuppressWarnings("fallthrough") is put to suppress warnings 
>>>>> generated by
>>>>> another switch/case statements
>>>> Can't you move it from method scope to there?
>>>>
>>>>>             while (i >= matchlen && !seencomma) {
>>>>>                 switch(a[i-matchlen]) {
>>>>>                 case ',':
>>>>>                     seencomma = true;
>>>>>                     /*FALLTHROUGH*/
>>>>>                 case ' ': case '\r': case '\n':
>>>>>                 case '\f': case '\t':
>>>>>                     break;
>>>>>                 default:
>>>>>                     throw new IllegalArgumentException(
>>>>>                             "invalid permission: " + actions);
>>>>>                 }
>>>>>                 i--;
>>>>>             }
>>>
>>> Unfortunately there is no suitable place to put the annotation. 
>>> Annotations
>>> can only be placed on declarations, and the narrowest enclosing 
>>> declaration
>>> around this switch statement is, unfortunately, the entire method. 
>>> One might
>>> consider refactoring the switch statement into its own method, but 
>>> that kind
>>> of refactoring is too large a change for warnings cleanup.
>>
>> I can see that it is reasonable/possible to bind a
>> @SuppressWarnings("unchecked") to a declaration which contains the 
>> unchecked
>> assignment, but which declaration should contain a fallthrough case?
>>
>> So shouldn't  @SuppressWarnings("fallthrough") better be binded to a 
>> switch or
>> case statement?
>
> In principle it would be nice to place the @SuppressWarnings right 
> next to the switch statement for which the warnings are suppressed. 
> However, it is a syntactic restriction of the Java programming 
> language that annotations can only be used as modifiers on 
> declarations, specifically package, class, method, method parameter, 
> constructor, and local variable declarations. See JLS 9.7 [1]. It is 
> not legal to place annotations on statements. So, the SuppressWarnings 
> annotation has to be placed on a declaration that encloses the switch 
> statement in question. In this case that's the declaration of the 
> entire method.
>
> [1] http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.7
>
> It turns out that this discussion is moot, as the switch fall-through 
> is actually unnecessary! The comma case falls through to the next 
> case, but all that does is break. The warning can be eliminated simply 
> by replacing /*FALLTHROUGH*/ with a break statement. This removes the 
> need for the SuppressWarnings annotation.
>
> This permissions-parsing code occurs in several places around the JDK, 
> copied and slightly modified. Some of them use the string identity 
> comparison optimization, and some have this switch fall through. 
> (We've discussed this previously. See [2].) Accordingly, I've asked 
> Dan to adjust a couple of these other cases to have the same comment 
> about string identity comparisons, and to change the switch statement 
> to avoid the fall-through entirely.
>
> [2] 
> http://mail.openjdk.java.net/pipermail/jdk8-dev/2011-December/000415.html
>
> While I'm reluctant to expand the scope of this changeset, I think 
> it's important to keep these five occurrences consistent. Obviously it 
> would be nicer to unify the five copies into one, but this is a much 
> bigger change that I think is clearly out of scope.
>
> Dan will issue another webrev with these changes shortly.
>
> s'marks
>

I have adjusted my fix with the above suggestions.

The latest webrev is posted at, 
http://cr.openjdk.java.net/~dxu/7193406/webrev.05/. Thanks for your 
comments!

-Dan



More information about the core-libs-dev mailing list