ToArrayTerminal (@NotNull CollectTerminal terminal, @NotNull PsiElement element) { if (terminal.getStatus() == ControlFlowUtils.InitializerUsageStatus.UNKNOWN) return null; if (!(element instanceof PsiExpressionStatement) && !(element instanceof PsiDeclarationStatement) && !(element instanceof PsiReturnStatement)) { return null; } String intermediateSteps = terminal.getIntermediateStepsFromCollection(); if (intermediateSteps == null) return null; List<? extends PsiExpression> usages = terminal.targetReferences().toList(); if (usages.isEmpty()) return null; PsiMethodCallExpression toArrayCandidate = StreamEx.of(usages) .map(usage -> ExpressionUtils.getCallForQualifier(tryCast(usage, PsiExpression.class))) .nonNull().findFirst().orElse(null); if (toArrayCandidate == null) return null; PsiReferenceExpression methodExpression = toArrayCandidate.getMethodExpression(); if (!"toArray".equals(methodExpression.getReferenceName())) return null; /* We want to allow reusing the same empty collection in another branch of code after return. * However, in this case, return should be on the same level as the stream itself. * See beforeToArrayInBranch.java and beforeToArrayReusedCollection.java tests. */ if ((!(PsiUtil.skipParenthesizedExprUp(toArrayCandidate.getParent()) instanceof PsiReturnStatement stmt) || stmt.getParent() != element.getParent()) && ContainerUtil.exists(usages, usage -> !PsiTreeUtil.isAncestor(toArrayCandidate, usage, false))) { return null; } PsiLocalVariable var = tryCast(PsiUtil.skipParenthesizedExprUp(toArrayCandidate.getParent()), PsiLocalVariable.class); String supplier = extractSupplier(toArrayCandidate); if (supplier == null) return null; return new ToArrayTerminal(terminal, var, intermediateSteps, toArrayCandidate, supplier); }