Forbid "safe delete" for anonymous objects

This commit is contained in:
Alexey Sedunov
2014-01-20 15:35:50 +04:00
parent 5cfb07072c
commit fffae7b6a4
5 changed files with 25 additions and 1 deletions
@@ -41,6 +41,7 @@ import org.jetbrains.jet.lang.psi.JetClassBody
import org.jetbrains.jet.lang.psi.JetParameterList
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
import com.intellij.psi.PsiNamedElement
import org.jetbrains.jet.lang.psi.JetObjectDeclaration
fun PsiElement.getParentByTypesAndPredicate<T: PsiElement>(
strict : Boolean = false, vararg parentClasses : Class<T>, predicate: (T) -> Boolean
@@ -175,4 +176,6 @@ fun JetDeclaration.isOverridable(): Boolean {
}
val PsiElement.namedNavigationElement: PsiNamedElement?
get() = getNavigationElement()?.getParentByType(javaClass<PsiNamedElement>())
get() = getNavigationElement()?.getParentByType(javaClass<PsiNamedElement>())
fun PsiElement.isObjectLiteral(): Boolean = this is JetObjectDeclaration && isObjectLiteral()
@@ -46,6 +46,7 @@ import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.Modality;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.psi.psiUtil.PsiUtilPackage;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.java.jetAsJava.KotlinLightMethod;
@@ -58,6 +59,7 @@ import java.util.*;
public class KotlinSafeDeleteProcessor extends JavaSafeDeleteProcessor {
public static boolean canDeleteElement(@NotNull PsiElement element) {
if (PsiUtilPackage.isObjectLiteral(element)) return false;
return element instanceof JetClassOrObject
|| element instanceof JetNamedFunction
|| element instanceof PsiMethod
@@ -0,0 +1,7 @@
trait A
fun foo(): A {
return <caret>object: A {
}
}
@@ -0,0 +1,7 @@
trait A
fun foo(): A {
return object: A {
}
}
@@ -101,6 +101,11 @@ public class JetSafeDeleteTestGenerated extends AbstractJetSafeDeleteTest {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/safeDelete/deleteObject/kotlinObject"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("anonymousObject.kt")
public void testAnonymousObject() throws Exception {
doObjectTest("idea/testData/safeDelete/deleteObject/kotlinObject/anonymousObject.kt");
}
@TestMetadata("localObject1.kt")
public void testLocalObject1() throws Exception {
doObjectTest("idea/testData/safeDelete/deleteObject/kotlinObject/localObject1.kt");