LineRange ( @NotNull Editor editor, @NotNull PsiElement sibling, boolean down, @NotNull PsiElement target ) { PsiElement start = sibling; PsiElement end = sibling; PsiElement nextParent; // moving out of code block if (isMovingOutOfBlock(sibling, down)) { // elements which aren't immediately placed in class body can't leave the block PsiElement parent = sibling.getParent(); if (!(parent instanceof KtClassBody)) return null; if (target instanceof KtEnumEntry) return null; KtClassOrObject ktClassOrObject = (KtClassOrObject) parent.getParent(); assert ktClassOrObject != null; nextParent = ktClassOrObject.getParent(); if (!down) { start = ktClassOrObject; } } // moving into code block // element may move only into class body else { KtClassBody classBody = getClassBody(sibling); // confined elements can't leave their block nextParent = classBody; if (classBody != null) { if (!down) { start = classBody.getRBrace(); } end = down ? classBody.getLBrace() : classBody.getRBrace(); } } if (nextParent != null) { if (target instanceof KtAnonymousInitializer && !(nextParent instanceof KtClassBody)) return null; if (target instanceof KtEnumEntry) { KtClassOrObject nextClassOrObject = (KtClassOrObject) nextParent.getParent(); assert nextClassOrObject != null; if (!nextClassOrObject.hasModifier(KtTokens.ENUM_KEYWORD)) return null; } } if (target instanceof KtPropertyAccessor && !(sibling instanceof KtPropertyAccessor)) return null; return start != null && end != null ? new LineRange(start, end, editor.getDocument()) : null; }