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