Forbid "safe delete" for anonymous objects
This commit is contained in:
@@ -41,6 +41,7 @@ import org.jetbrains.jet.lang.psi.JetClassBody
|
|||||||
import org.jetbrains.jet.lang.psi.JetParameterList
|
import org.jetbrains.jet.lang.psi.JetParameterList
|
||||||
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
|
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
|
||||||
import com.intellij.psi.PsiNamedElement
|
import com.intellij.psi.PsiNamedElement
|
||||||
|
import org.jetbrains.jet.lang.psi.JetObjectDeclaration
|
||||||
|
|
||||||
fun PsiElement.getParentByTypesAndPredicate<T: PsiElement>(
|
fun PsiElement.getParentByTypesAndPredicate<T: PsiElement>(
|
||||||
strict : Boolean = false, vararg parentClasses : Class<T>, predicate: (T) -> Boolean
|
strict : Boolean = false, vararg parentClasses : Class<T>, predicate: (T) -> Boolean
|
||||||
@@ -176,3 +177,5 @@ fun JetDeclaration.isOverridable(): Boolean {
|
|||||||
|
|
||||||
val PsiElement.namedNavigationElement: PsiNamedElement?
|
val PsiElement.namedNavigationElement: PsiNamedElement?
|
||||||
get() = getNavigationElement()?.getParentByType(javaClass<PsiNamedElement>())
|
get() = getNavigationElement()?.getParentByType(javaClass<PsiNamedElement>())
|
||||||
|
|
||||||
|
fun PsiElement.isObjectLiteral(): Boolean = this is JetObjectDeclaration && isObjectLiteral()
|
||||||
+2
@@ -46,6 +46,7 @@ import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
|
|||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.Modality;
|
import org.jetbrains.jet.lang.descriptors.Modality;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
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.BindingContext;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
|
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.java.jetAsJava.KotlinLightMethod;
|
import org.jetbrains.jet.lang.resolve.java.jetAsJava.KotlinLightMethod;
|
||||||
@@ -58,6 +59,7 @@ import java.util.*;
|
|||||||
|
|
||||||
public class KotlinSafeDeleteProcessor extends JavaSafeDeleteProcessor {
|
public class KotlinSafeDeleteProcessor extends JavaSafeDeleteProcessor {
|
||||||
public static boolean canDeleteElement(@NotNull PsiElement element) {
|
public static boolean canDeleteElement(@NotNull PsiElement element) {
|
||||||
|
if (PsiUtilPackage.isObjectLiteral(element)) return false;
|
||||||
return element instanceof JetClassOrObject
|
return element instanceof JetClassOrObject
|
||||||
|| element instanceof JetNamedFunction
|
|| element instanceof JetNamedFunction
|
||||||
|| element instanceof PsiMethod
|
|| 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);
|
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")
|
@TestMetadata("localObject1.kt")
|
||||||
public void testLocalObject1() throws Exception {
|
public void testLocalObject1() throws Exception {
|
||||||
doObjectTest("idea/testData/safeDelete/deleteObject/kotlinObject/localObject1.kt");
|
doObjectTest("idea/testData/safeDelete/deleteObject/kotlinObject/localObject1.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user