IDEA-204461 DFA: Make final getter stable if it gets a final field

This commit is contained in:
Tagir Valeev
2018-12-20 12:40:09 +07:00
parent 1c15d0c27d
commit 86b64bdfe8
3 changed files with 40 additions and 6 deletions
@@ -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
@@ -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;
@@ -0,0 +1,34 @@
import java.io.File;
final class MyClass {
void test(Point p) {
if (p.getX() == p.getY()) {
unknown();
if (<warning descr="Condition 'p.getX() == p.getY()' is always 'true'">p.getX() == p.getY()</warning>) {}
}
}
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;}
}
}