Java: Check reflection calls - cleanup upon review (IDEA-CR-20616, IDEA-172003)

This commit is contained in:
Pavel Dolgov
2017-05-30 13:34:32 +03:00
parent 21cbbbfc65
commit adb5d93cee
2 changed files with 14 additions and 28 deletions
@@ -25,7 +25,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Iconable;
import com.intellij.openapi.util.RecursionGuard;
import com.intellij.openapi.util.RecursionManager;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.impl.JavaConstantExpressionEvaluator;
@@ -247,6 +246,7 @@ public class JavaReflectionReferenceUtil {
@Nullable
private static PsiExpression findFinalFieldDefinition(@NotNull PsiReferenceExpression referenceExpression, @NotNull PsiField field) {
if (!field.hasModifierProperty(PsiModifier.FINAL)) return null;
final PsiClass psiClass = ObjectUtils.tryCast(field.getParent(), PsiClass.class);
if (psiClass != null) {
final boolean isStatic = field.hasModifierProperty(PsiModifier.STATIC);
@@ -273,34 +273,12 @@ public class JavaReflectionReferenceUtil {
return null;
}
@Nullable
private static PsiExpression getAssignedExpression(@NotNull PsiMember maybeContainsAssignment, @NotNull PsiField field) {
final Ref<PsiExpression> refResult = new Ref<>();
maybeContainsAssignment.accept(new JavaRecursiveElementVisitor() {
boolean stopped = false;
@Override
public void visitElement(PsiElement element) {
if (!stopped) {
super.visitElement(element);
}
}
@Override
public void visitExpression(PsiExpression expression) {
// do nothing
}
@Override
public void visitAssignmentExpression(PsiAssignmentExpression expression) {
super.visitAssignmentExpression(expression);
if (VariableAccessUtils.evaluatesToVariable(expression.getLExpression(), field)) {
refResult.set(expression.getRExpression());
stopped = true;
}
}
});
return refResult.get();
final PsiAssignmentExpression assignment = SyntaxTraverser.psiTraverser(maybeContainsAssignment)
.filter(PsiAssignmentExpression.class)
.find(expression -> VariableAccessUtils.evaluatesToVariable(expression.getLExpression(), field));
return assignment != null ? assignment.getRExpression() : null;
}
private static PsiClass findClass(@NotNull String qualifiedName, @NotNull PsiElement context) {
@@ -43,11 +43,19 @@ class Vararg {
myB = Class.forName("B");
}
final Class<?> myB1;
Vararg(int n) throws Exception {
Object bb = Array.newInstance(myB, n);
Class<?> bc = bb.getClass();
ourA.getConstructor(bc);
ourA.getMethod("bar", String.class, bc);
myB1 = B.class;
}
void foo1() {
ourA.getMethod("bar", myB1);
ourA.getMethod(<warning descr="Cannot resolve method 'bar' with specified argument types">"bar"</warning>, myB1, String.class);
}
}