Refactoring: CallableMemberDescriptor.isOverridable

This commit is contained in:
Mikhail Glukhikh
2015-12-08 17:55:21 +03:00
parent c73f01927a
commit fb406bfc24
12 changed files with 18 additions and 16 deletions
@@ -16,10 +16,7 @@
package org.jetbrains.kotlin.resolve.jvm.checkers package org.jetbrains.kotlin.resolve.jvm.checkers
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
import org.jetbrains.kotlin.fileClasses.isInsideJvmMultifileClassFile import org.jetbrains.kotlin.fileClasses.isInsideJvmMultifileClassFile
@@ -58,7 +55,7 @@ class JvmFieldApplicabilityChecker : DeclarationChecker {
val problem = when { val problem = when {
descriptor !is PropertyDescriptor -> NOT_A_PROPERTY descriptor !is PropertyDescriptor -> NOT_A_PROPERTY
descriptor.modality.isOverridable -> NOT_FINAL descriptor.isOverridable -> NOT_FINAL
Visibilities.isPrivate(descriptor.visibility) -> PRIVATE Visibilities.isPrivate(descriptor.visibility) -> PRIVATE
!descriptor.hasBackingField(bindingContext) -> NO_BACKING_FIELD !descriptor.hasBackingField(bindingContext) -> NO_BACKING_FIELD
descriptor.hasCustomAccessor() -> CUSTOM_ACCESSOR descriptor.hasCustomAccessor() -> CUSTOM_ACCESSOR
@@ -115,7 +115,7 @@ public class JvmNameAnnotationChecker : DeclarationChecker {
if (descriptor is CallableMemberDescriptor) { if (descriptor is CallableMemberDescriptor) {
val callableMemberDescriptor = descriptor val callableMemberDescriptor = descriptor
if (DescriptorUtils.isOverride(callableMemberDescriptor) || callableMemberDescriptor.modality.isOverridable) { if (DescriptorUtils.isOverride(callableMemberDescriptor) || callableMemberDescriptor.isOverridable) {
diagnosticHolder.report(ErrorsJvm.INAPPLICABLE_JVM_NAME.on(annotationEntry)) diagnosticHolder.report(ErrorsJvm.INAPPLICABLE_JVM_NAME.on(annotationEntry))
} }
} }
@@ -612,7 +612,7 @@ public class KotlinFlowInformationProvider {
FunctionDescriptor functionDescriptor = (FunctionDescriptor) descriptor; FunctionDescriptor functionDescriptor = (FunctionDescriptor) descriptor;
String functionName = functionDescriptor.getName().asString(); String functionName = functionDescriptor.getName().asString();
if (isMain if (isMain
|| functionDescriptor.getModality().isOverridable() || ModalityKt.isOverridable(functionDescriptor)
|| !functionDescriptor.getOverriddenDescriptors().isEmpty() || !functionDescriptor.getOverriddenDescriptors().isEmpty()
|| "getValue".equals(functionName) || "setValue".equals(functionName) || "getValue".equals(functionName) || "setValue".equals(functionName)
|| "propertyDelegated".equals(functionName) || "propertyDelegated".equals(functionName)
@@ -84,7 +84,7 @@ class DelegationResolver<T : CallableMemberDescriptor> private constructor(
memberExtractor.getMembersByType(it) memberExtractor.getMembersByType(it)
} ?: emptyList<CallableMemberDescriptor>() } ?: emptyList<CallableMemberDescriptor>()
return memberExtractor.getMembersByType(interfaceType).filter { descriptor -> return memberExtractor.getMembersByType(interfaceType).filter { descriptor ->
descriptor.modality.isOverridable && !classSupertypeMembers.any { isOverridableBy(it, descriptor) } descriptor.isOverridable && !classSupertypeMembers.any { isOverridableBy(it, descriptor) }
} }
} }
@@ -884,7 +884,7 @@ public class OverrideResolver {
for (CallableMemberDescriptor overridden : overriddenDescriptors) { for (CallableMemberDescriptor overridden : overriddenDescriptors) {
if (overridden == null) continue; if (overridden == null) continue;
if (!overridden.getModality().isOverridable()) { if (!ModalityKt.isOverridable(overridden)) {
reportError.overridingFinalMember(memberDescriptor, overridden); reportError.overridingFinalMember(memberDescriptor, overridden);
} }
@@ -447,10 +447,10 @@ public class DataFlowValueFactory {
DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration(); DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration();
if (containingDeclaration instanceof ClassDescriptor) { if (containingDeclaration instanceof ClassDescriptor) {
ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration; ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration;
if (classDescriptor.getModality().isOverridable() && propertyDescriptor.getModality().isOverridable()) return false; if (classDescriptor.getModality().isOverridable() && ModalityKt.isOverridable(propertyDescriptor)) return false;
} }
else { else {
if (propertyDescriptor.getModality().isOverridable()) { if (ModalityKt.isOverridable(propertyDescriptor)) {
throw new IllegalStateException("Property outside a class must not be overridable: " + propertyDescriptor.getName()); throw new IllegalStateException("Property outside a class must not be overridable: " + propertyDescriptor.getName());
} }
} }
@@ -531,7 +531,7 @@ private class ConstantExpressionEvaluatorVisitor(
if (resolvedCall != null) { if (resolvedCall != null) {
val callableDescriptor = resolvedCall.resultingDescriptor val callableDescriptor = resolvedCall.resultingDescriptor
if (callableDescriptor is VariableDescriptor) { if (callableDescriptor is VariableDescriptor) {
if (callableDescriptor is PropertyDescriptor && callableDescriptor.modality.isOverridable) return null if (callableDescriptor is PropertyDescriptor && callableDescriptor.isOverridable) return null
val variableInitializer = callableDescriptor.compileTimeInitializer ?: return null val variableInitializer = callableDescriptor.compileTimeInitializer ?: return null
@@ -35,3 +35,7 @@ enum class Modality private constructor(val isOverridable: Boolean) {
} }
} }
} }
val CallableMemberDescriptor.isOverridable: Boolean
get() = modality != Modality.FINAL
@@ -180,7 +180,7 @@ class ChangeMemberFunctionSignatureFix private constructor(
val name = functionDescriptor.name val name = functionDescriptor.name
return containingClass.defaultType.supertypes() return containingClass.defaultType.supertypes()
.flatMap { supertype -> supertype.memberScope.getContributedFunctions(name, NoLookupLocation.FROM_IDE) } .flatMap { supertype -> supertype.memberScope.getContributedFunctions(name, NoLookupLocation.FROM_IDE) }
.filter { it.kind.isReal && it.modality.isOverridable } .filter { it.kind.isReal && it.isOverridable }
} }
} }
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATIO
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED
import org.jetbrains.kotlin.descriptors.isOverridable
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil
@@ -110,7 +111,7 @@ public class MakeOverriddenMemberOpenFix(declaration: KtDeclaration) : KotlinQui
private fun retainNonOverridableMembers( private fun retainNonOverridableMembers(
callableMemberDescriptors: Collection<CallableMemberDescriptor>): Collection<CallableMemberDescriptor> { callableMemberDescriptors: Collection<CallableMemberDescriptor>): Collection<CallableMemberDescriptor> {
return callableMemberDescriptors.filter { !it.modality.isOverridable } return callableMemberDescriptors.filter { !it.isOverridable }
} }
override fun createAction(diagnostic: Diagnostic): IntentionAction? { override fun createAction(diagnostic: Diagnostic): IntentionAction? {
@@ -151,7 +151,7 @@ public final class JsDescriptorUtils {
return !isExtension(propertyDescriptor) && return !isExtension(propertyDescriptor) &&
isDefaultAccessor(propertyDescriptor.getGetter()) && isDefaultAccessor(propertyDescriptor.getGetter()) &&
isDefaultAccessor(propertyDescriptor.getSetter()) && isDefaultAccessor(propertyDescriptor.getSetter()) &&
!propertyDescriptor.getModality().isOverridable(); !ModalityKt.isOverridable(propertyDescriptor);
} }
public static boolean isBuiltin(@NotNull DeclarationDescriptor descriptor) { public static boolean isBuiltin(@NotNull DeclarationDescriptor descriptor) {
@@ -67,7 +67,7 @@ public final class TranslationUtils {
@NotNull @NotNull
private static JsPropertyInitializer translateExtensionFunctionAsEcma5DataDescriptor(@NotNull JsFunction function, private static JsPropertyInitializer translateExtensionFunctionAsEcma5DataDescriptor(@NotNull JsFunction function,
@NotNull FunctionDescriptor descriptor, @NotNull TranslationContext context) { @NotNull FunctionDescriptor descriptor, @NotNull TranslationContext context) {
JsObjectLiteral meta = createDataDescriptor(function, descriptor.getModality().isOverridable(), false); JsObjectLiteral meta = createDataDescriptor(function, ModalityKt.isOverridable(descriptor), false);
return new JsPropertyInitializer(context.getNameForDescriptor(descriptor).makeRef(), meta); return new JsPropertyInitializer(context.getNameForDescriptor(descriptor).makeRef(), meta);
} }