Review Request: 7193406 - Clean-up JDK Build Warnings in java.util, java.io
Stuart Marks
stuart.marks at oracle.com
Fri Aug 31 01:45:50 UTC 2012
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
More information about the core-libs-dev
mailing list