List<PsiElement> (PsiElement last, PsiElement declaration, PsiTryStatement armStatement) { PsiCodeBlock tryBlock = armStatement.getTryBlock(); assert tryBlock != null : armStatement.getText(); PsiElement parent = declaration.getParent(); LocalSearchScope scope = new LocalSearchScope(parent); List<PsiElement> toFormat = new SmartList<>(); PsiElement stopAt = last.getNextSibling(); PsiElement i = declaration.getNextSibling(); while (i != null && i != stopAt) { PsiElement child = i; i = PsiTreeUtil.skipWhitespacesAndCommentsForward(i); if (!(child instanceof PsiDeclarationStatement)) continue; int endOffset = last.getTextRange().getEndOffset(); //declared after last usage if (child.getTextOffset() > endOffset) break; PsiElement anchor = child; PsiElement[] declaredElements = ((PsiDeclarationStatement)child).getDeclaredElements(); for (PsiElement declared : declaredElements) { if (!(declared instanceof PsiLocalVariable)) continue; boolean contained = ReferencesSearch.search(declared, scope).allMatch(ref -> ref.getElement().getTextOffset() <= endOffset); if (!contained) { PsiLocalVariable var = (PsiLocalVariable)declared; PsiElementFactory factory = JavaPsiFacade.getElementFactory(declaration.getProject()); String name = var.getName(); PsiDeclarationStatement declarationStatement = factory.createVariableDeclarationStatement(name, var.getType(), null); PsiUtil.setModifierProperty((PsiLocalVariable)declarationStatement.getDeclaredElements()[0], PsiModifier.FINAL, var.hasModifierProperty(PsiModifier.FINAL)); toFormat.add(parent.addBefore(declarationStatement, declaration)); CommentTracker commentTracker = new CommentTracker(); PsiExpression varInit = var.getInitializer(); if (varInit != null) { String varAssignText = name + " = " + commentTracker.text(varInit) + ";"; anchor = parent.addAfter(factory.createStatementFromText(varAssignText, parent), anchor); } commentTracker.deleteAndRestoreComments(declaredElements.length == 1 ? child : var); } } if (child == last && !child.isValid()) { last = anchor; } } PsiElement first = declaration.getNextSibling(); tryBlock.addRangeBefore(first, last, tryBlock.getRBrace()); parent.deleteChildRange(first, last); return toFormat; }