ExpressionUtils#isSimpleExpression: disable for non-final fields

This commit is contained in:
Tagir Valeev
2018-02-05 15:51:55 +07:00
parent f49e9abdc6
commit d5f9284f2e
7 changed files with 21 additions and 16 deletions

View File

@@ -5,7 +5,7 @@ import java.util.List;
import java.util.Objects;
public class Main {
private Point field = new Point(0, 0);
private final Point field = new Point(0, 0);
public Point find(List<Point> points) {
return points.stream().filter(Objects::nonNull).findFirst().orElse(field);

View File

@@ -5,7 +5,7 @@ import java.util.List;
import java.util.Objects;
public class Main {
private static Point ZERO = new Point(0, 0);
private static final Point ZERO = new Point(0, 0);
public static Point find(List<Point> points) {
return points.stream().filter(Objects::nonNull).findFirst().orElse(ZERO);

View File

@@ -4,7 +4,7 @@ import java.awt.*;
import java.util.List;
public class Main {
private Point field = new Point(0, 0);
private final Point field = new Point(0, 0);
public Point find(List<Point> points) {
for (Point pt : poin<caret>ts) {

View File

@@ -4,7 +4,7 @@ import java.awt.*;
import java.util.List;
public class Main {
private static Point ZERO = new Point(0, 0);
private static final Point ZERO = new Point(0, 0);
public static Point find(List<Point> points) {
for (Point pt : point<caret>s) {

View File

@@ -8,7 +8,7 @@ import java.util.function.Predicate;
import static java.util.stream.Collectors.*;
public class Main {
static Predicate<String> nonEmpty = s -> s != null && !s.isEmpty();
static final Predicate<String> nonEmpty = s -> s != null && !s.isEmpty();
private static long testFunctionInField(List<String> strings) {
long count = 0L;

View File

@@ -7,7 +7,7 @@ import java.util.function.Predicate;
import static java.util.stream.Collectors.*;
public class Main {
static Predicate<String> nonEmpty = s -> s != null && !s.isEmpty();
static final Predicate<String> nonEmpty = s -> s != null && !s.isEmpty();
private static long testFunctionInField(List<String> strings) {
return strings.stream().filter(nonEmpty).cou<caret>nt();

View File

@@ -746,12 +746,14 @@ public class ExpressionUtils {
/**
* Returns true if the expression can be moved to earlier point in program order without possible semantic change or
* notable performance handicap. Examples of simple expressions are:
* - literal (number, char, string, class literal, true, false, null)
* - compile-time constant
* - this
* - variable/parameter read
* - static field read
* - instance field read having 'this' as qualifier
* <ul>
* <li>literal (number, char, string, class literal, true, false, null)</li>
* <li>compile-time constant</li>
* <li>this</li>
* <li>variable/parameter read</li>
* <li>final field read (either static or this-qualified)</li>
* <li>some static method calls known to return final static field (like {@code Collections.emptyList()})</li>
* </ul>
*
* @param expression an expression to test (must be valid expression)
* @return true if the supplied expression is simple
@@ -766,11 +768,14 @@ public class ExpressionUtils {
return true;
}
if(expression instanceof PsiReferenceExpression) {
PsiElement target = ((PsiReferenceExpression)expression).resolve();
if (target instanceof PsiLocalVariable || target instanceof PsiParameter) return true;
PsiExpression qualifier = ((PsiReferenceExpression)expression).getQualifierExpression();
if(qualifier == null || qualifier instanceof PsiThisExpression) return true;
if(qualifier instanceof PsiReferenceExpression) {
PsiElement resolvedQualifier = ((PsiReferenceExpression)qualifier).resolve();
if(resolvedQualifier instanceof PsiClass) return true;
if (target == null && qualifier == null) return true;
if (target instanceof PsiField) {
PsiField field = (PsiField)target;
if (!field.hasModifierProperty(PsiModifier.FINAL)) return false;
return qualifier == null || qualifier instanceof PsiThisExpression || field.hasModifierProperty(PsiModifier.STATIC);
}
}
if (expression instanceof PsiMethodCallExpression) {