ElementToWorkOn (final Editor editor, final PsiFile file, final @NlsContexts.DialogTitle String refactoringName, final String helpId, final Project project, PsiLocalVariable localVar, PsiExpression expr) { int startOffset = 0; int endOffset = 0; if (localVar == null && expr == null) { startOffset = editor.getSelectionModel().getSelectionStart(); endOffset = editor.getSelectionModel().getSelectionEnd(); expr = CodeInsightUtil.findExpressionInRange(file, startOffset, endOffset); if (expr == null) { PsiIdentifier ident = CodeInsightUtil.findElementInRange(file, startOffset, endOffset, PsiIdentifier.class); if (ident != null) { localVar = PsiTreeUtil.getParentOfType(ident, PsiLocalVariable.class); } } else if (expr instanceof PsiArrayInitializerExpression && expr.getParent() instanceof PsiNewExpression) { expr = (PsiExpression)expr.getParent(); } } if (expr == null && localVar == null) { PsiElement[] statements = CodeInsightUtil.findStatementsInRange(file, startOffset, endOffset); if (statements.length == 1 && statements[0] instanceof PsiExpressionStatement) { expr = ((PsiExpressionStatement)statements[0]).getExpression(); } else if (statements.length == 1 && statements[0] instanceof PsiDeclarationStatement decl) { PsiElement[] declaredElements = decl.getDeclaredElements(); if (declaredElements.length == 1 && declaredElements[0] instanceof PsiLocalVariable) { localVar = (PsiLocalVariable)declaredElements[0]; } } } if (localVar == null && expr == null) { expr = IntroduceVariableUtil.getSelectedExpression(project, file, startOffset, endOffset); } if (localVar == null && expr != null) { final String errorMessage = IntroduceVariableUtil.getErrorMessage(expr); if (errorMessage != null) { CommonRefactoringUtil.showErrorHint(project, editor, errorMessage, refactoringName, helpId); return null; } } return new ElementToWorkOn(localVar, expr); }