boolean (@NotNull List<? extends PsiExpression> occurrences, @NotNull PsiCodeBlock body) { if (occurrences.isEmpty()) return false; Project project = occurrences.get(0).getProject(); Set<PsiVariable> variables = collectVariablesSafeToExtract(occurrences); if (variables == null) return false; if (variables.isEmpty()) return true; PsiElement anchor = CommonJavaRefactoringUtil.getAnchorElementForMultipleExpressions(occurrences.toArray(PsiExpression.EMPTY_ARRAY), null); if (anchor == null) return false; PsiElement anchorParent = anchor.getParent(); if (anchorParent == null) return false; try { ControlFlow flow = ControlFlowFactory.getInstance(project).getControlFlow(body, new LocalsControlFlowPolicy(body)); int startOffset = flow.getSize(); int endOffset = 0; for (PsiExpression occurrence : occurrences) { PsiElement occurrenceSurroundings = PsiTreeUtil.findFirstParent(occurrence, false, e -> e.getParent() == anchorParent); if (occurrenceSurroundings == null) return false; startOffset = Math.min(startOffset, flow.getStartOffset(occurrenceSurroundings)); endOffset = Math.max(endOffset, flow.getEndOffset(occurrenceSurroundings)); } return ControlFlowUtil.areVariablesUnmodifiedAtLocations(flow, startOffset, endOffset, variables, occurrences); } catch (AnalysisCanceledException e) { return false; } }