PsiElementVisitor (@NotNull ProblemsHolder holder, boolean isOnTheFly) { if (!PsiUtil.isLanguageLevel8OrHigher(holder.getFile())) { return PsiElementVisitor.EMPTY_VISITOR; } return new JavaElementVisitor() { @Override public void visitMethodCallExpression(@NotNull PsiMethodCallExpression call) { super.visitMethodCallExpression(call); PsiReferenceExpression expression = call.getMethodExpression(); PsiElement nameElement = expression.getReferenceNameElement(); if (nameElement == null || !SUPPORTED_TERMINALS.contains(nameElement.getText())) return; if (!CodeBlockSurrounder.canSurround(call)) return; PsiMethod method = call.resolveMethod(); if(method == null) return; PsiClass aClass = method.getContainingClass(); if (InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_UTIL_STREAM_BASE_STREAM)) { if (extractOperations(ChainVariable.STUB, call, SUPPORT_UNKNOWN_SOURCES) != null) { register(call, nameElement, JavaBundle.message("stream.to.loop.inspection.message.replace.stream.api.chain.with.loop")); } } else if (extractIterableForEach(call) != null || extractMapForEach(call) != null) { register(call, nameElement, JavaBundle.message("stream.to.loop.inspection.message.replace.foreach.call.with.loop")); } } private void register(PsiMethodCallExpression call, PsiElement nameElement, @InspectionMessage String message) { TextRange range; if (isOnTheFly && InspectionProjectProfileManager.isInformationLevel(getShortName(), call)) { range = new TextRange(0, call.getTextLength()); } else { range = nameElement.getTextRange().shiftRight(-call.getTextOffset()); } holder.registerProblem(call, range, message, new ReplaceStreamWithLoopFix(message)); } }; }