Search in sources :

Example 1 with PyCodeFragment

use of com.jetbrains.python.codeInsight.codeFragment.PyCodeFragment in project intellij-community by JetBrains.

the class PyExtractMethodHandler method invokeOnEditor.

private static void invokeOnEditor(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, PyBundle.message("refactoring.extract.method.error.bad.selection"), RefactoringBundle.message("extract.method.title"), "refactoring.extractMethod");
        return;
    }
    if (rangeBelongsToSameClassBody(element1, element2)) {
        CommonRefactoringUtil.showErrorHint(project, editor, PyBundle.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, PyBundle.message("refactoring.extract.method.error.bad.selection"), RefactoringBundle.message("extract.method.title"), "refactoring.extractMethod");
}
Also used : ScopeOwner(com.jetbrains.python.codeInsight.controlflow.ScopeOwner) PyCodeFragment(com.jetbrains.python.codeInsight.codeFragment.PyCodeFragment) CannotCreateCodeFragmentException(com.intellij.codeInsight.codeFragment.CannotCreateCodeFragmentException) PsiElement(com.intellij.psi.PsiElement)

Aggregations

CannotCreateCodeFragmentException (com.intellij.codeInsight.codeFragment.CannotCreateCodeFragmentException)1 PsiElement (com.intellij.psi.PsiElement)1 PyCodeFragment (com.jetbrains.python.codeInsight.codeFragment.PyCodeFragment)1 ScopeOwner (com.jetbrains.python.codeInsight.controlflow.ScopeOwner)1