From 150784a9b6f0e84e4929cb8d266b4069e5df7d4a Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Sun, 18 Feb 2018 17:38:58 +0700 Subject: [PATCH] Mutability: support initialized final fields --- .../com/intellij/codeInspection/dataFlow/Mutability.java | 8 ++++++++ .../inspection/dataFlow/fixture/MutabilityJdk.java | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/Mutability.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/Mutability.java index db25e4e2bdb6..f1bacecb0c4e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/Mutability.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/Mutability.java @@ -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; } } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/MutabilityJdk.java b/java/java-tests/testData/inspection/dataFlow/fixture/MutabilityJdk.java index 7f2ee69162f9..5cf7f602e62c 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/MutabilityJdk.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/MutabilityJdk.java @@ -2,6 +2,11 @@ import java.util.*; import java.io.*; public class MutabilityJdk { + static final List LIST = Collections.unmodifiableList(Arrays.asList("foo", "bar")); + + void testField() { + LIST.add("baz"); + } void testEmpty() { List list = Collections.emptyList();