From bc09fbf3858b2911b8bbc41fe9652c36a37b9b98 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 4 Mar 2005 14:45:36 +0300 Subject: [PATCH] (no message) --- .../editor/actions/MoveStatementHandler.java | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/source/com/intellij/openapi/editor/actions/MoveStatementHandler.java b/source/com/intellij/openapi/editor/actions/MoveStatementHandler.java index 825057c35e28..c23a5ba76e3a 100644 --- a/source/com/intellij/openapi/editor/actions/MoveStatementHandler.java +++ b/source/com/intellij/openapi/editor/actions/MoveStatementHandler.java @@ -32,7 +32,6 @@ class MoveStatementHandler extends EditorWriteActionHandler { final CaretModel caretModel = editor.getCaretModel(); final int caretColumn = caretModel.getLogicalPosition().column; - final int caretLine = caretModel.getLogicalPosition().line; final LineRange lineRange = getRangeToMove(editor,file); final int startLine = lineRange.startLine; final int endLine = lineRange.endLine; @@ -87,10 +86,7 @@ class MoveStatementHandler extends EditorWriteActionHandler { } while (true) { final int offset = editor.logicalPositionToOffset(new LogicalPosition(line, 0)); - PsiElement element = file.findElementAt(offset); - if (element instanceof PsiWhiteSpace) { - element = element.getNextSibling(); - } + PsiElement element = firstNonWhiteElement(offset, file, true); while (element != null) { if ((element instanceof PsiStatement || element instanceof PsiComment) && element.getParent() instanceof PsiCodeBlock) { return offset; @@ -154,16 +150,38 @@ class MoveStatementHandler extends EditorWriteActionHandler { if (result.startLine <= 1 && !isDown) return null; if (result.endLine >= maxLine - 1 && isDown) return null; - final PsiElement elementAt = file.findElementAt(editor.getCaretModel().getOffset()); - if (elementAt == null) return null; - final PsiElement guard = PsiTreeUtil.getParentOfType(elementAt, new Class[]{PsiMethod.class, PsiClassInitializer.class, PsiClass.class}); - // move operation should not go out of method - final int insertOffset = calcInsertOffset(editor, result.startLine, result.endLine); - if (guard != null && !guard.getTextRange().shiftRight(1).grown(-1).contains(insertOffset)) return null; - + if (!checkMovingInsideOutside(file, editor, result)) return null; return result; } + private boolean checkMovingInsideOutside(final PsiFile file, final Editor editor, final LineRange result) { + final int offset = editor.getCaretModel().getOffset(); + PsiElement elementAt = file.findElementAt(offset); + if (elementAt == null) return false; + + final PsiElement guard = PsiTreeUtil.getParentOfType(elementAt, new Class[]{PsiMethod.class, PsiClassInitializer.class, PsiClass.class}); + // cannot move in/outside method/class/initializer + final int insertOffset = calcInsertOffset(editor, result.startLine, result.endLine); + elementAt = file.findElementAt(insertOffset); + final PsiElement newGuard = PsiTreeUtil.getParentOfType(elementAt, new Class[]{PsiMethod.class, PsiClassInitializer.class, PsiClass.class}); + if (newGuard == guard && isInside(insertOffset, newGuard) == isInside(offset, guard)) return true; + + // moving in/out nested class is OK + if (guard instanceof PsiClass && guard.getParent() instanceof PsiClass) return true; + if (newGuard instanceof PsiClass && newGuard.getParent() instanceof PsiClass) return true; + return false; + } + + private static boolean isInside(final int offset, final PsiElement guard) { + if (guard == null) return false; + TextRange inside = guard instanceof PsiMethod ? ((PsiMethod)guard).getBody().getTextRange() : guard instanceof PsiClassInitializer + ? ((PsiClassInitializer)guard).getBody().getTextRange() + : guard instanceof PsiClass + ? new TextRange(((PsiClass)guard).getLBrace().getTextOffset(), ((PsiClass)guard).getRBrace().getTextOffset()) + : null; + return inside != null && inside.contains(offset); + } + private static LineRange expandLineRangeToStatement(final LineRange range, Editor editor, final PsiFile file) { final int startOffset = editor.logicalPositionToOffset(new LogicalPosition(range.startLine, 0)); PsiElement startingElement = firstNonWhiteElement(startOffset, file, true); @@ -213,6 +231,7 @@ class MoveStatementHandler extends EditorWriteActionHandler { } } //todo - // no move inside/outside class/method/initializer/comment - // create codeblock when moving inside statement - // moving declarations \ No newline at end of file + // + no move inside/outside class(except nested)/method/initializer/comment +// moving declarations +// create codeblock when moving inside statement +