improve support for renaming overriding methods in enum entries

#KT-8891 Fixed
This commit is contained in:
Dmitry Jemerov
2015-08-26 17:02:41 +02:00
parent a012fd0c7d
commit c7b26ed7ca
6 changed files with 38 additions and 8 deletions
@@ -22,7 +22,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.codegen.AsmUtil;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.load.java.JvmAbi;
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils;
import org.jetbrains.kotlin.name.Name;
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) ||
declaration instanceof JetEnumEntry) {
isEnumEntryWithoutBody(declaration)) {
// Other subclasses are not valid for class name prediction.
// For example EnumEntry, JetFunctionLiteral
// For example JetFunctionLiteral
return null;
}
@@ -105,4 +104,12 @@ public final class PsiCodegenPredictor {
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.model.ArgumentMatch
import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.utils.addToStdlib.constant
import java.util.ArrayList
import java.util.Collections
import java.util.*
import kotlin.test.assertTrue
// 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()
if (!(parent is JetClassBody || parent is JetParameterList)) return false
val klass = parent.getParent()
if (!(klass is JetClass && klass.isInheritable())) return false
val klass = parent.getParent() as? JetClass ?: return false
if (!klass.isInheritable() && !klass.isEnum()) return false
if (hasModifier(JetTokens.FINAL_KEYWORD) || hasModifier(JetTokens.PRIVATE_KEYWORD)) return false