diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClassOrObject.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClassOrObject.kt index 2420af7487f..b58e39d1c60 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClassOrObject.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClassOrObject.kt @@ -16,10 +16,13 @@ package org.jetbrains.kotlin.psi +import com.intellij.lang.ASTNode import com.intellij.lang.ASTNode import com.intellij.navigation.ItemPresentation import com.intellij.navigation.ItemPresentationProviders import com.intellij.psi.PsiElement +import com.intellij.psi.impl.CheckUtil +import com.intellij.psi.impl.source.codeStyle.CodeEditUtil import com.intellij.psi.stubs.IStubElementType import org.jetbrains.kotlin.JetNodeTypes import org.jetbrains.kotlin.lexer.JetTokens @@ -62,4 +65,16 @@ abstract public class JetClassOrObject : JetTypeParameterListOwnerStub = getBody()?.getSecondaryConstructors().orEmpty() public fun isAnnotation(): Boolean = hasModifier(JetTokens.ANNOTATION_KEYWORD) + + public override fun delete() { + CheckUtil.checkWritable(this); + + val file = getContainingJetFile(); + if (!isTopLevel() || file.getDeclarations().size() > 1) { + CodeEditUtil.removeChild(getParent().getNode(), getNode()); + } + else { + file.delete(); + } + } } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt index 54b86fd30cf..dbf680eca3f 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.core import com.intellij.psi.PsiElement import com.intellij.psi.PsiWhiteSpace +import com.intellij.psi.impl.source.codeStyle.CodeEditUtil import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil @@ -148,4 +149,8 @@ private fun deleteElementWithDelimiters(element: PsiElement) { val parent = element.getParent() parent.deleteChildRange(from, to) +} + +public fun PsiElement.deleteSingle() { + CodeEditUtil.removeChild(getParent()?.getNode() ?: return, getNode() ?: return) } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/MoveKotlinTopLevelDeclarationsProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/MoveKotlinTopLevelDeclarationsProcessor.kt index 067fd823d20..4192974b79b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/MoveKotlinTopLevelDeclarationsProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/MoveKotlinTopLevelDeclarationsProcessor.kt @@ -45,6 +45,7 @@ import org.jetbrains.kotlin.asJava.toLightElements import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.codeInsight.JetFileReferencesResolver import org.jetbrains.kotlin.idea.codeInsight.shorten.addToShorteningWaitSet +import org.jetbrains.kotlin.idea.core.deleteSingle import org.jetbrains.kotlin.idea.core.refactoring.getUsageContext import org.jetbrains.kotlin.idea.refactoring.JetRefactoringBundle import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName @@ -68,7 +69,7 @@ trait Mover: (originalElement: JetNamedDeclaration, targetFile: JetFile) -> JetN object Default: Mover { override fun invoke(originalElement: JetNamedDeclaration, targetFile: JetFile): JetNamedDeclaration { val newElement = targetFile.add(originalElement) as JetNamedDeclaration - originalElement.delete() + originalElement.deleteSingle() return newElement } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt index 608aef3f8d1..a6809f045a4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt @@ -37,12 +37,12 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.idea.JetBundle import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.core.deleteElementAndCleanParent import org.jetbrains.kotlin.idea.refactoring.JetRefactoringUtil import org.jetbrains.kotlin.idea.references.JetReference import org.jetbrains.kotlin.idea.search.usagesSearch.processDelegationCallConstructorUsages import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.idea.core.deleteElementAndCleanParent import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext import java.util.ArrayList @@ -326,18 +326,4 @@ public class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { else -> super.getElementsToSearch(element, module, allElementsToDelete) } } - - override fun getAdditionalElementsToDelete( - element: PsiElement, - allElementsToDelete: MutableCollection, - askUser: Boolean - ): Collection { - val filesToDelete = allElementsToDelete - .filter { it is JetNamedDeclaration && it.getContainingJetFile() == it.getParent() } - .groupBy { (it as JetNamedDeclaration).getContainingJetFile() } - .filter { it.getKey().getDeclarations().size() == it.getValue().size() } - .keySet() - return super.getAdditionalElementsToDelete(element, allElementsToDelete, askUser)?.let { it + filesToDelete } - ?: filesToDelete - } }