PsiElementVisitor (@NotNull ProblemsHolder holder, boolean isOnTheFly) { return new JavaElementVisitor() { @Override public void visitMethodCallExpression(@NotNull PsiMethodCallExpression call) { super.visitMethodCallExpression(call); BulkMethodInfo info = findInfo(call.getMethodExpression()); if (info == null) return; PsiExpression iterable = findIterable(call, info); if (iterable != null) { register(iterable, info, call.getMethodExpression()); } } @Override public void visitMethodReferenceExpression(@NotNull PsiMethodReferenceExpression methodReference) { super.visitMethodReferenceExpression(methodReference); BulkMethodInfo info = findInfo(methodReference); if (info == null) return; PsiExpression iterable = findIterableForFunction(methodReference); if (iterable != null) { register(iterable, info, methodReference); } } private void register(@NotNull PsiExpression iterable, @NotNull BulkMethodInfo info, @NotNull PsiReferenceExpression methodExpression) { PsiExpression qualifier = PsiUtil.skipParenthesizedExprDown(ExpressionUtils.getEffectiveQualifier(methodExpression)); if (qualifier instanceof PsiQualifiedExpression) { PsiMethod method = PsiTreeUtil.getParentOfType(iterable, PsiMethod.class); // Likely we are inside of the bulk method implementation if (method != null && method.getName().equals(info.getBulkName())) return; } if (isSupportedQualifier(qualifier) && info.isSupportedIterable(qualifier, iterable, USE_ARRAYS_AS_LIST)) { holder.registerProblem(methodExpression, JavaBundle.message("inspection.replace.with.bulk.message", info.getReplacementName()), new UseBulkOperationFix(info)); } } @Contract("null -> false") private static boolean isSupportedQualifier(PsiExpression qualifier) { if (qualifier instanceof PsiQualifiedExpression) return true; if (qualifier instanceof PsiReferenceExpression) { PsiExpression subQualifier = ((PsiReferenceExpression)qualifier).getQualifierExpression(); return subQualifier == null || isSupportedQualifier(subQualifier); } return false; } }; }