diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java index ce4f674d2f97..c0deaa6b0eb1 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java @@ -26,10 +26,7 @@ import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.JavaConstantExpressionEvaluator; -import com.intellij.psi.util.InheritanceUtil; -import com.intellij.psi.util.PropertyUtilBase; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.*; import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; import com.siyeh.ig.psiutils.ClassUtils; @@ -378,9 +375,12 @@ public class DfaExpressionFactory { private static final class GetterDescriptor implements VariableDescriptor { private final @NotNull PsiMethod myGetter; + private final boolean myStable; GetterDescriptor(@NotNull PsiMethod getter) { myGetter = getter; + PsiField field = PsiUtil.canBeOverridden(getter) ? null : PropertyUtil.getFieldOfGetter(getter); + myStable = field != null && field.hasModifierProperty(PsiModifier.FINAL); } @NotNull @@ -397,7 +397,7 @@ public class DfaExpressionFactory { @Override public boolean isStable() { - return false; + return myStable; } @Override diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ChainedFinalFieldAccessorsDfa.java b/java/java-tests/testData/inspection/dataFlow/fixture/ChainedFinalFieldAccessorsDfa.java index b62c400bfd44..2aa796d1e134 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/ChainedFinalFieldAccessorsDfa.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ChainedFinalFieldAccessorsDfa.java @@ -42,7 +42,7 @@ class BrokenAlignment { private static class Data { @Nullable final String text; - @Nullable final Data inner; + @Nullable Data inner; Data(@Nullable String text, Data inner) { this.text = text; diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/FinalGettersForFinalFields.java b/java/java-tests/testData/inspection/dataFlow/fixture/FinalGettersForFinalFields.java new file mode 100644 index 000000000000..0728264cc123 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/FinalGettersForFinalFields.java @@ -0,0 +1,34 @@ +import java.io.File; + +final class MyClass { + + + void test(Point p) { + if (p.getX() == p.getY()) { + unknown(); + if (p.getX() == p.getY()) {} + } + } + + native void unknown(); + + void testFile(File f) { + if (!f.exists()) { + unknown(); + if (!f.exists()) {} + } + } + + final class Point { + final int x; + final int y; + + Point(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() {return x;} + public int getY() {return y;} + } +} \ No newline at end of file