void (final Project project, final Editor editor, final PsiFile file) { CommonRefactoringUtil.checkReadOnlyStatus(project, file); PsiElement element1 = null; PsiElement element2 = null; final SelectionModel selectionModel = editor.getSelectionModel(); if (selectionModel.hasSelection()) { element1 = file.findElementAt(selectionModel.getSelectionStart()); element2 = file.findElementAt(selectionModel.getSelectionEnd() - 1); } else { final CaretModel caretModel = editor.getCaretModel(); final Document document = editor.getDocument(); int lineNumber = document.getLineNumber(caretModel.getOffset()); if ((lineNumber >= 0) && (lineNumber < document.getLineCount())) { element1 = file.findElementAt(document.getLineStartOffset(lineNumber)); element2 = file.findElementAt(document.getLineEndOffset(lineNumber) - 1); } } // Pass comments and whitespaces element1 = PyPsiUtils.getNextSignificantLeaf(element1, false); element2 = PyPsiUtils.getPrevSignificantLeaf(element2, false); if (element1 == null || element2 == null) { CommonRefactoringUtil.showErrorHint(project, editor, PyPsiBundle.message("refactoring.extract.method.error.bad.selection"), RefactoringBundle.message("extract.method.title"), "refactoring.extractMethod"); return; } if (rangeBelongsToSameClassBody(element1, element2)) { CommonRefactoringUtil.showErrorHint(project, editor, PyPsiBundle.message("refactoring.extract.method.error.class.level"), RefactoringBundle.message("extract.method.title"), "refactoring.extractMethod"); return; } final Couple<PsiElement> statements = getStatementsRange(element1, element2); if (statements != null) { final ScopeOwner owner = PsiTreeUtil.getParentOfType(statements.getFirst(), ScopeOwner.class); if (owner == null) { return; } final PyCodeFragment fragment; try { fragment = PyCodeFragmentUtil.createCodeFragment(owner, element1, element2); } catch (CannotCreateCodeFragmentException e) { CommonRefactoringUtil.showErrorHint(project, editor, e.getMessage(), RefactoringBundle.message("extract.method.title"), "refactoring.extractMethod"); return; } PyExtractMethodUtil.extractFromStatements(project, editor, fragment, statements.getFirst(), statements.getSecond()); return; } final PsiElement expression = PyRefactoringUtil.getSelectedExpression(project, file, element1, element2); if (expression != null) { final ScopeOwner owner = PsiTreeUtil.getParentOfType(element1, ScopeOwner.class); if (owner == null) { return; } final PyCodeFragment fragment; try { fragment = PyCodeFragmentUtil.createCodeFragment(owner, element1, element2); } catch (CannotCreateCodeFragmentException e) { CommonRefactoringUtil.showErrorHint(project, editor, e.getMessage(), RefactoringBundle.message("extract.method.title"), "refactoring.extractMethod"); return; } PyExtractMethodUtil.extractFromExpression(project, editor, fragment, expression); return; } CommonRefactoringUtil.showErrorHint(project, editor, PyPsiBundle.message("refactoring.extract.method.error.bad.selection"), RefactoringBundle.message("extract.method.title"), "refactoring.extractMethod"); }