improve support for renaming overriding methods in enum entries
#KT-8891 Fixed
This commit is contained in:
@@ -22,7 +22,6 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil;
|
import org.jetbrains.kotlin.codegen.AsmUtil;
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi;
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils;
|
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils;
|
||||||
import org.jetbrains.kotlin.name.Name;
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.psi.*;
|
import org.jetbrains.kotlin.psi.*;
|
||||||
@@ -75,9 +74,9 @@ public final class PsiCodegenPredictor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!PsiTreeUtil.instanceOf(declaration, JetClass.class, JetObjectDeclaration.class, JetNamedFunction.class, JetProperty.class) ||
|
if (!PsiTreeUtil.instanceOf(declaration, JetClass.class, JetObjectDeclaration.class, JetNamedFunction.class, JetProperty.class) ||
|
||||||
declaration instanceof JetEnumEntry) {
|
isEnumEntryWithoutBody(declaration)) {
|
||||||
// Other subclasses are not valid for class name prediction.
|
// Other subclasses are not valid for class name prediction.
|
||||||
// For example EnumEntry, JetFunctionLiteral
|
// For example JetFunctionLiteral
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,4 +104,12 @@ public final class PsiCodegenPredictor {
|
|||||||
|
|
||||||
return parentInternalName + (parentDeclaration == null ? "/" : "$") + name.asString();
|
return parentInternalName + (parentDeclaration == null ? "/" : "$") + name.asString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isEnumEntryWithoutBody(JetDeclaration declaration) {
|
||||||
|
if (!(declaration instanceof JetEnumEntry)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
JetClassBody body = ((JetEnumEntry) declaration).getBody();
|
||||||
|
return body == null || body.getDeclarations().size() == 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,9 +33,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
|
|||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ArgumentMatch
|
import org.jetbrains.kotlin.resolve.calls.model.ArgumentMatch
|
||||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.constant
|
import java.util.*
|
||||||
import java.util.ArrayList
|
|
||||||
import java.util.Collections
|
|
||||||
import kotlin.test.assertTrue
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
// NOTE: in this file we collect only Kotlin-specific methods working with PSI and not modifying it
|
// NOTE: in this file we collect only Kotlin-specific methods working with PSI and not modifying it
|
||||||
@@ -189,8 +187,8 @@ public fun JetDeclaration.isOverridable(): Boolean {
|
|||||||
val parent = getParent()
|
val parent = getParent()
|
||||||
if (!(parent is JetClassBody || parent is JetParameterList)) return false
|
if (!(parent is JetClassBody || parent is JetParameterList)) return false
|
||||||
|
|
||||||
val klass = parent.getParent()
|
val klass = parent.getParent() as? JetClass ?: return false
|
||||||
if (!(klass is JetClass && klass.isInheritable())) return false
|
if (!klass.isInheritable() && !klass.isEnum()) return false
|
||||||
|
|
||||||
if (hasModifier(JetTokens.FINAL_KEYWORD) || hasModifier(JetTokens.PRIVATE_KEYWORD)) return false
|
if (hasModifier(JetTokens.FINAL_KEYWORD) || hasModifier(JetTokens.PRIVATE_KEYWORD)) return false
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
enum class SampleEnum {
|
||||||
|
V1 {
|
||||||
|
override fun <lineMarker descr="Overrides function in 'SampleEnum'"></lineMarker>any() { super.any() }
|
||||||
|
};
|
||||||
|
|
||||||
|
open fun <lineMarker descr="<html><body>Is overridden in <br> Enum constant 'V1' in 'SampleEnum'</body></html>"></lineMarker>any() {}
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"type": "KOTLIN_FUNCTION",
|
||||||
|
"classId": "test/E.A",
|
||||||
|
"oldName": "foo",
|
||||||
|
"newName": "bar"
|
||||||
|
}
|
||||||
@@ -73,6 +73,12 @@ public class LineMarkersTestGenerated extends AbstractLineMarkersTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("EnumEntry.kt")
|
||||||
|
public void testEnumEntry() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/codeInsight/lineMarker/overrideImplement/EnumEntry.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("FakeOverrideForClasses.kt")
|
@TestMetadata("FakeOverrideForClasses.kt")
|
||||||
public void testFakeOverrideForClasses() throws Exception {
|
public void testFakeOverrideForClasses() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/codeInsight/lineMarker/overrideImplement/FakeOverrideForClasses.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/codeInsight/lineMarker/overrideImplement/FakeOverrideForClasses.kt");
|
||||||
|
|||||||
@@ -269,6 +269,12 @@ public class RenameTestGenerated extends AbstractRenameTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("renameKotlinFunctionInEnum/renameKotlinFunctionInEnumFromSubclass.test")
|
||||||
|
public void testRenameKotlinFunctionInEnum_RenameKotlinFunctionInEnumFromSubclass() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinFunctionInEnum/renameKotlinFunctionInEnumFromSubclass.test");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("renameKotlinMethod/javaWrapperForKotlinMethod.test")
|
@TestMetadata("renameKotlinMethod/javaWrapperForKotlinMethod.test")
|
||||||
public void testRenameKotlinMethod_JavaWrapperForKotlinMethod() throws Exception {
|
public void testRenameKotlinMethod_JavaWrapperForKotlinMethod() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinMethod/javaWrapperForKotlinMethod.test");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinMethod/javaWrapperForKotlinMethod.test");
|
||||||
|
|||||||
Reference in New Issue
Block a user