Mutability: support initialized final fields

This commit is contained in:
Tagir Valeev
2018-02-18 17:38:58 +07:00
parent 2dbfc72915
commit 150784a9b6
2 changed files with 13 additions and 0 deletions
@@ -6,6 +6,7 @@ package com.intellij.codeInspection.dataFlow;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.ObjectUtils;
import org.jetbrains.annotations.NotNull;
@@ -52,6 +53,13 @@ public enum Mutability {
AnnotationUtil.CHECK_INFERRED)) {
return UNMODIFIABLE_VIEW;
}
if (owner instanceof PsiField && owner.hasModifierProperty(PsiModifier.FINAL)) {
PsiExpression initializer = PsiUtil.skipParenthesizedExprDown(((PsiField)owner).getInitializer());
if (initializer instanceof PsiMethodCallExpression) {
PsiMethod method = ((PsiMethodCallExpression)initializer).resolveMethod();
return method == null ? UNKNOWN : getMutability(method);
}
}
return UNKNOWN;
}
}
@@ -2,6 +2,11 @@ import java.util.*;
import java.io.*;
public class MutabilityJdk {
static final List<String> LIST = Collections.unmodifiableList(Arrays.asList("foo", "bar"));
void testField() {
LIST.<warning descr="Immutable object is modified">add</warning>("baz");
}
void testEmpty() {
List<String> list = Collections.emptyList();