Несколько @EnsuresNonNullIf должно быть в порядке; но компилятор жалуется - PullRequest
0 голосов
/ 06 июля 2019

Руководство Checker Framework утверждает, что «Вы можете написать несколько аннотаций @EnsuresNonNullIf для одного метода», однако при попытке сделать это я вижу следующее сообщение:

@EnsuresNonNullIf(expression="getFieldNames()", result=true)
@EnsuresNonNullIf(expression="getFieldName(i)", result=true)
public boolean hasFieldNames() {
    return fFieldNames != null;
}

Полученное сообщение об ошибке компилятора Java Eclipse:

Дублирующая аннотация неповторяемого типа @EnsuresNonNullIf. Только типы аннотаций с пометкой @Repeatable могут использоваться несколько раз на одной цели.

Результирующее сообщение об ошибке компилятора javac MVN:

[ОШИБКА] Blabla.java: [?,?] Org.checkerframework.checker.nullness.qual.EnsuresNonNullIf не является повторяющимся типом аннотации

Я аннотирую 10-летний код, так что я надеюсь, что какой-то трюк с настройкой может спасти день :-) Без нескольких @EnsuresNonNullIf Я собираюсь написать немного аннотации кода вручную, чтобы исправить ложные срабатывания что меня не интересует ...

PS: я пытался использовать и checker-framework-2.8.1 и 2.9.0 с похожими результатами, и всегда использовал <maven.compiler.source>1.8</maven.compiler.source>

1 Ответ

0 голосов
/ 06 июля 2019

Я обнаружил эту проблему на трекере проблем Checker Framework: https://github.com/typetools/checker-framework/issues/1307

Объясняет запрос «улучшения» для добавления @Repeatable к следующим аннотациям CF:

>  @DefaultQualifier -- DONE
>  @EnsuresKeyFor
>  @EnsuresKeyForIf
>  @EnsuresLockHeldIf
>  @EnsuresLTLengthOf
>  @EnsuresLTLengthOfIf
>  @EnsuresMinLenIf
>  @EnsuresNonNullIf
>  @EnsuresQualifier -- DONE
>  @EnsuresQualifierIf -- DONE
>  @FieldInvariant
>  @GuardSatisfied
>  @HasSubsequence
>  @MethodVal
>  @MinLenFieldInvariant
>  @RequiresQualifier -- DONE
>  @SubstringIndexFor

И обсуждение содержит обходной путь, поскольку EnsuresQualifiersIf уже повторяется:

@EnsuresQualifiersIf({
    @EnsuresQualifierIf(result=true, qualifier=NonNull.class, expression="getFoo()"),
    @EnsuresQualifierIf(result=false, qualifier=NonNull.class, expression="getBar()")
})
boolean hasFoo();

И в моем случае это получается:

 @EnsuresQualifiersIf({
    @EnsuresQualifierIf(result=true, qualifier=NonNull.class, expression="getFieldNames()"),
    @EnsuresQualifierIf(result=true, qualifier=NonNull.class, expression="getFieldName(i)")
})
public boolean hasFieldNames() {
    return fFieldNames != null;
}
...