IDEA-160864 (Wrong report of local variables or parameters unnecessarily declared final)

This commit is contained in:
Bas Leijdekkers
2017-04-06 15:07:41 +02:00
parent 82b4938229
commit 8fd859094c
2 changed files with 29 additions and 28 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2003-2013 Dave Griffith, Bas Leijdekkers
* Copyright 2003-2017 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -149,14 +149,13 @@ public class UnnecessaryFinalOnLocalVariableOrParameterInspection extends BaseIn
if (declaredElements.length == 0) {
return;
}
for (final PsiElement declaredElement : declaredElements) {
if (!(declaredElement instanceof PsiLocalVariable)) {
return;
}
final PsiLocalVariable variable = (PsiLocalVariable)declaredElement;
if (!variable.hasModifierProperty(PsiModifier.FINAL)) {
return;
}
final PsiElement firstElement = declaredElements[0];
if (!(firstElement instanceof PsiLocalVariable)) {
return;
}
final PsiLocalVariable firstVariable = (PsiLocalVariable)firstElement;
if (!firstVariable.hasModifierProperty(PsiModifier.FINAL)) {
return;
}
final PsiCodeBlock containingBlock = PsiTreeUtil.getParentOfType(statement, PsiCodeBlock.class);
if (containingBlock == null) {
@@ -164,11 +163,11 @@ public class UnnecessaryFinalOnLocalVariableOrParameterInspection extends BaseIn
}
for (PsiElement declaredElement : declaredElements) {
final PsiLocalVariable variable = (PsiLocalVariable)declaredElement;
if (isNecessaryFinal(containingBlock, variable)) {
if (isNecessaryFinal(variable, containingBlock)) {
return;
}
}
final PsiLocalVariable variable = (PsiLocalVariable)statement.getDeclaredElements()[0];
final PsiLocalVariable variable = (PsiLocalVariable)firstElement;
registerModifierError(PsiModifier.FINAL, variable, variable);
}
@@ -189,21 +188,12 @@ public class UnnecessaryFinalOnLocalVariableOrParameterInspection extends BaseIn
if (!parameter.hasModifierProperty(PsiModifier.FINAL)) {
return;
}
final PsiClass containingClass = method.getContainingClass();
if (containingClass != null) {
if (containingClass.isInterface() || containingClass.isAnnotationType()) {
registerModifierError(PsiModifier.FINAL, parameter, parameter);
return;
}
}
if (method.hasModifierProperty(PsiModifier.ABSTRACT)) {
registerModifierError(PsiModifier.FINAL, parameter, parameter);
return;
}
if (onlyWarnOnAbstractMethods) {
return;
else if (!onlyWarnOnAbstractMethods) {
check(parameter);
}
registerError(method, parameter);
}
@Override
@@ -222,7 +212,7 @@ public class UnnecessaryFinalOnLocalVariableOrParameterInspection extends BaseIn
if (!parameter.hasModifierProperty(PsiModifier.FINAL)) {
continue;
}
registerError(catchBlock, parameter);
check(parameter);
}
}
@@ -236,15 +226,15 @@ public class UnnecessaryFinalOnLocalVariableOrParameterInspection extends BaseIn
if (!parameter.hasModifierProperty(PsiModifier.FINAL)) {
return;
}
registerError(statement, parameter);
check(parameter);
}
private boolean isNecessaryFinal(PsiElement method, PsiVariable parameter) {
return !PsiUtil.isLanguageLevel8OrHigher(parameter) && VariableAccessUtils.variableIsUsedInInnerClass(parameter, method);
private boolean isNecessaryFinal(PsiVariable parameter, PsiElement context) {
return !PsiUtil.isLanguageLevel8OrHigher(parameter) && VariableAccessUtils.variableIsUsedInInnerClass(parameter, context);
}
private void registerError(PsiElement context, PsiVariable parameter) {
if (!isNecessaryFinal(context, parameter)) {
private void check(PsiParameter parameter) {
if (!isNecessaryFinal(parameter, parameter.getDeclarationScope())) {
registerModifierError(PsiModifier.FINAL, parameter, parameter);
}
}
@@ -41,6 +41,17 @@ public class UnnecessaryFinalOnLocalVariableOrParameterInspectionJava8Test exten
"}");
}
public void testInterfaceMethods() {
final UnnecessaryFinalOnLocalVariableOrParameterInspection inspection = new UnnecessaryFinalOnLocalVariableOrParameterInspection();
inspection.onlyWarnOnAbstractMethods = true;
myFixture.enableInspections(inspection);
doTest("interface X {" +
" default void m(final String s) {}" +
" static void n(final String s) {}" +
" void o(/*Unnecessary 'final' on parameter 's'*/final/**/ String s);" +
"}");
}
@Nullable
@Override
protected InspectionProfileEntry getInspection() {