CallableMemberDescriptor.isOverridable / ClassDescriptor.isFinal refactoring
Extra JvmField and integer constants tests
This commit is contained in:
@@ -611,9 +611,10 @@ public class ControlFlowInformationProvider {
|
||||
assert descriptor instanceof FunctionDescriptor : owner.getText();
|
||||
FunctionDescriptor functionDescriptor = (FunctionDescriptor) descriptor;
|
||||
String functionName = functionDescriptor.getName().asString();
|
||||
KtFunction function = (KtFunction) owner;
|
||||
if (isMain
|
||||
|| ModalityKt.isOverridable(functionDescriptor)
|
||||
|| !functionDescriptor.getOverriddenDescriptors().isEmpty()
|
||||
|| ModalityKt.isOverridableOrOverrides(functionDescriptor)
|
||||
|| function.hasModifier(KtTokens.OVERRIDE_KEYWORD)
|
||||
|| "getValue".equals(functionName) || "setValue".equals(functionName)
|
||||
|| "propertyDelegated".equals(functionName)
|
||||
) {
|
||||
|
||||
@@ -483,13 +483,14 @@ public class BodyResolver {
|
||||
trace.report(SUPERTYPE_APPEARS_TWICE.on(typeReference));
|
||||
}
|
||||
|
||||
if (classDescriptor != null && classDescriptor.getKind().isSingleton()) {
|
||||
if (classDescriptor == null) return;
|
||||
if (classDescriptor.getKind().isSingleton()) {
|
||||
if (!DescriptorUtils.isEnumEntry(classDescriptor)) {
|
||||
trace.report(SINGLETON_IN_SUPERTYPE.on(typeReference));
|
||||
}
|
||||
}
|
||||
else if (!allowedFinalSupertypes.contains(constructor)) {
|
||||
if (classDescriptor != null && classDescriptor.getModality() == Modality.SEALED) {
|
||||
if (classDescriptor.getModality() == Modality.SEALED) {
|
||||
DeclarationDescriptor containingDescriptor = supertypeOwner.getContainingDeclaration();
|
||||
while (containingDescriptor != null && containingDescriptor != classDescriptor) {
|
||||
containingDescriptor = containingDescriptor.getContainingDeclaration();
|
||||
@@ -501,7 +502,7 @@ public class BodyResolver {
|
||||
trace.report(SEALED_SUPERTYPE_IN_LOCAL_CLASS.on(typeReference));
|
||||
}
|
||||
}
|
||||
else if (constructor.isFinal()) {
|
||||
else if (ModalityKt.isFinalOrEnum(classDescriptor)) {
|
||||
trace.report(FINAL_SUPERTYPE.on(typeReference));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -712,10 +712,7 @@ class DeclarationsChecker(
|
||||
reportVisibilityModifierDiagnostics(tokens.values, Errors.PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY)
|
||||
}
|
||||
else {
|
||||
val parentDescriptor = propertyDescriptor.containingDeclaration
|
||||
if (parentDescriptor !is ClassDescriptor || !parentDescriptor.isFinal) {
|
||||
reportVisibilityModifierDiagnostics(tokens.values, Errors.PRIVATE_SETTER_FOR_OPEN_PROPERTY)
|
||||
}
|
||||
reportVisibilityModifierDiagnostics(tokens.values, Errors.PRIVATE_SETTER_FOR_OPEN_PROPERTY)
|
||||
}
|
||||
}
|
||||
else if (propertyDescriptor.isLateInit && accessorDescriptor.visibility != propertyDescriptor.visibility) {
|
||||
|
||||
+1
-15
@@ -395,7 +395,7 @@ public class DataFlowValueFactory {
|
||||
|
||||
private static Kind propertyKind(@NotNull PropertyDescriptor propertyDescriptor, @Nullable ModuleDescriptor usageModule) {
|
||||
if (propertyDescriptor.isVar()) return MUTABLE_PROPERTY;
|
||||
if (!isFinal(propertyDescriptor)) return PROPERTY_WITH_GETTER;
|
||||
if (ModalityKt.isOverridable(propertyDescriptor)) return PROPERTY_WITH_GETTER;
|
||||
if (!hasDefaultGetter(propertyDescriptor)) return PROPERTY_WITH_GETTER;
|
||||
if (!invisibleFromOtherModules(propertyDescriptor)) {
|
||||
ModuleDescriptor declarationModule = DescriptorUtils.getContainingModule(propertyDescriptor);
|
||||
@@ -464,20 +464,6 @@ public class DataFlowValueFactory {
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean isFinal(PropertyDescriptor propertyDescriptor) {
|
||||
DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration();
|
||||
if (containingDeclaration instanceof ClassDescriptor) {
|
||||
ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration;
|
||||
if (!ModalityKt.isFinal(classDescriptor) && ModalityKt.isOverridable(propertyDescriptor)) return false;
|
||||
}
|
||||
else {
|
||||
if (ModalityKt.isOverridable(propertyDescriptor)) {
|
||||
throw new IllegalStateException("Property outside a class must not be overridable: " + propertyDescriptor.getName());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean invisibleFromOtherModules(@NotNull DeclarationDescriptorWithVisibility descriptor) {
|
||||
if (Visibilities.INVISIBLE_FROM_OTHER_MODULES.contains(descriptor.getVisibility())) return true;
|
||||
|
||||
|
||||
+2
-1
@@ -531,7 +531,8 @@ private class ConstantExpressionEvaluatorVisitor(
|
||||
if (resolvedCall != null) {
|
||||
val callableDescriptor = resolvedCall.resultingDescriptor
|
||||
if (callableDescriptor is VariableDescriptor) {
|
||||
if (callableDescriptor is PropertyDescriptor && callableDescriptor.isOverridable) return null
|
||||
// TODO: FIXME: see KT-10425
|
||||
if (callableDescriptor is PropertyDescriptor && callableDescriptor.modality != Modality.FINAL) return null
|
||||
|
||||
val variableInitializer = callableDescriptor.compileTimeInitializer ?: return null
|
||||
|
||||
|
||||
Reference in New Issue
Block a user