CallableMemberDescriptor.isOverridable / ClassDescriptor.isFinal refactoring

Extra JvmField and integer constants tests
This commit is contained in:
Mikhail Glukhikh
2015-12-11 19:17:15 +03:00
parent 91621704a2
commit f5989aa4f2
12 changed files with 64 additions and 32 deletions
@@ -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) {
@@ -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;
@@ -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