import com.siyeh.ig.BaseInspectionVisitor;
import com.siyeh.ig.psiutils.ParenthesesUtils;
import com.siyeh.ig.psiutils.TypeUtils;
+import gnu.trove.THashSet;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Set;
/**
* @author Bas Leijdekkers
private static class OptionalGetWithoutIsPresentVisitor extends BaseInspectionVisitor {
- private final List<PsiExpression> seen = new ArrayList<>();
+ private final Set<PsiMethodCallExpression> seen = new THashSet<>();
@Override
public void visitMethodCallExpression(PsiMethodCallExpression expression) {
super.visitMethodCallExpression(expression);
+ if (seen.contains(expression)) {
+ return;
+ }
final PsiReferenceExpression methodExpression = expression.getMethodExpression();
final String name = methodExpression.getReferenceName();
if (!isOptionalGetMethodName(name)) {
if (!TypeUtils.isOptional(type)) {
return;
}
- for (PsiExpression checked : seen) {
- if (PsiEquivalenceUtil.areElementsEquivalent(qualifier, checked)) {
- return;
- }
- }
- seen.add(qualifier);
PsiElement context = PsiTreeUtil.getParentOfType(expression, PsiMember.class, PsiLambdaExpression.class);
if (context instanceof PsiMethod) {
context = ((PsiMethod)context).getBody();
final DfaInstructionState[] states = super.visitMethodCall(instruction, runner, memState);
final PsiCall callExpression = instruction.getCallExpression();
- if ((callExpression instanceof PsiMethodCallExpression) &&
- isCallOnSameQualifier((PsiMethodCallExpression)callExpression, qualifierValue, qualifier)) {
- final PsiMethod targetMethod = instruction.getTargetMethod();
- if (targetMethod != null) {
- final PsiClass aClass = targetMethod.getContainingClass();
- if (TypeUtils.isOptional(aClass)) {
- final String methodName = targetMethod.getName();
- if ("isPresent".equals(methodName)) {
- memState.pop();
- memState.push(runner.getFactory().getConstFactory().getFalse());
- }
- else if (isOptionalGetMethodName(methodName)) {
- registerMethodCallError((PsiMethodCallExpression)instruction.getCallExpression(), aClass);
+ if (callExpression instanceof PsiMethodCallExpression) {
+ final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)callExpression;
+ if (isCallOnSameQualifier(methodCallExpression, qualifierValue, qualifier)) {
+ final PsiMethod targetMethod = instruction.getTargetMethod();
+ if (targetMethod != null) {
+ final PsiClass aClass = targetMethod.getContainingClass();
+ if (TypeUtils.isOptional(aClass)) {
+ final String methodName = targetMethod.getName();
+ if ("isPresent".equals(methodName)) {
+ memState.pop();
+ memState.push(runner.getFactory().getConstFactory().getFalse());
+ }
+ else if (isOptionalGetMethodName(methodName)) {
+ seen.add(methodCallExpression);
+ registerMethodCallError(methodCallExpression, aClass);
+ }
}
}
}