Delegation and overrides:

- Tests.
- No need for a separate diagnostic message regarding
return/property type conflict on override by delegation:
it is always a conflict of inherited signatures.
This commit is contained in:
Dmitry Petrov
2015-12-07 13:31:07 +03:00
parent 84824b1024
commit 594039ac42
17 changed files with 628 additions and 49 deletions
@@ -331,10 +331,6 @@ public interface Errors {
DiagnosticFactory2<KtClassOrObject, CallableMemberDescriptor, CallableMemberDescriptor> OVERRIDING_FINAL_MEMBER_BY_DELEGATION =
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
DiagnosticFactory2<KtClassOrObject, CallableMemberDescriptor, CallableMemberDescriptor> RETURN_TYPE_MISMATCH_ON_OVERRIDE_BY_DELEGATION =
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
DiagnosticFactory2<KtClassOrObject, CallableMemberDescriptor, CallableMemberDescriptor> PROPERTY_TYPE_MISMATCH_ON_OVERRIDE_BY_DELEGATION =
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
DiagnosticFactory2<KtClassOrObject, CallableMemberDescriptor, CallableMemberDescriptor> VAR_OVERRIDDEN_BY_VAL_BY_DELEGATION =
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
@@ -565,10 +565,6 @@ public class DefaultErrorMessages {
MAP.put(OVERRIDING_FINAL_MEMBER_BY_DELEGATION, "''{0}'' implicitly overrides a final member ''{1}'' by delegation",
SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE_BY_DELEGATION, "Return type of ''{0}'' doesn't match ''{1}'' implicitly overridden by delegation",
SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
MAP.put(PROPERTY_TYPE_MISMATCH_ON_OVERRIDE_BY_DELEGATION, "Property type of ''{0}'' doesn't match ''{1}'' implicitly overridden by delegation",
SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
MAP.put(VAR_OVERRIDDEN_BY_VAL_BY_DELEGATION, "val-property ''{0}'' implicitly overrides a var-property ''{1}'' by delegation",
SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
@@ -290,7 +290,7 @@ public class OverrideResolver {
}
private static class CollectMissingImplementationsStrategy implements CheckInheritedSignaturesReportStrategy {
private Set<CallableMemberDescriptor> shouldImplement = new LinkedHashSet<CallableMemberDescriptor>();
private final Set<CallableMemberDescriptor> shouldImplement = new LinkedHashSet<CallableMemberDescriptor>();
@Override
public void abstractMemberNotImplemented(CallableMemberDescriptor descriptor) {
@@ -401,8 +401,7 @@ public class OverrideResolver {
@NotNull CallableMemberDescriptor overriding,
@NotNull CallableMemberDescriptor overridden
) {
conflictingReturnTypes.add(overridden);
reportDelegationProblemIfRequired(RETURN_TYPE_MISMATCH_ON_OVERRIDE_BY_DELEGATION, overriding, overridden);
// Always reported as RETURN_TYPE_MISMATCH_ON_INHERITANCE
}
@Override
@@ -410,8 +409,7 @@ public class OverrideResolver {
@NotNull CallableMemberDescriptor overriding,
@NotNull CallableMemberDescriptor overridden
) {
conflictingReturnTypes.add(overridden);
reportDelegationProblemIfRequired(PROPERTY_TYPE_MISMATCH_ON_OVERRIDE_BY_DELEGATION, overriding, overridden);
// Always reported as PROPERTY_TYPE_MISMATCH_ON_INHERITANCE
}
@Override
@@ -487,9 +485,7 @@ public class OverrideResolver {
if (descriptor.getVisibility() == Visibilities.INVISIBLE_FAKE) return;
Collection<? extends CallableMemberDescriptor> directOverridden = descriptor.getOverriddenDescriptors();
if (directOverridden.size() == 0) {
throw new IllegalStateException(kind + " " + descriptor.getName().asString() + " must override something");
}
assert !directOverridden.isEmpty() : kind + " " + descriptor.getName().asString() + " must override something";
// collects map from the directly overridden descriptor to the set of declarations:
// -- if directly overridden is not fake, the set consists of one element: this directly overridden
@@ -505,14 +501,12 @@ public class OverrideResolver {
checkInheritedDescriptorsGroup(relevantDirectlyOverridden, reportingStrategy);
if (kind == DELEGATION) {
if (overrideReportStrategyForDelegates != null) {
checkOverridesForMember(descriptor, relevantDirectlyOverridden, overrideReportStrategyForDelegates);
}
if (kind == DELEGATION && overrideReportStrategyForDelegates != null) {
checkOverridesForMember(descriptor, relevantDirectlyOverridden, overrideReportStrategyForDelegates);
}
if (kind != DELEGATION) {
checkMissingOverridesByJava8Restrictions(descriptor, relevantDirectlyOverridden, reportingStrategy);
checkMissingOverridesByJava8Restrictions(relevantDirectlyOverridden, reportingStrategy);
}
List<CallableMemberDescriptor> implementations = collectImplementations(relevantDirectlyOverridden);
@@ -549,7 +543,6 @@ public class OverrideResolver {
}
private static void checkMissingOverridesByJava8Restrictions(
@NotNull CallableMemberDescriptor descriptor,
@NotNull Set<CallableMemberDescriptor> relevantDirectlyOverridden,
@NotNull CheckInheritedSignaturesReportStrategy reportingStrategy
) {
@@ -874,8 +867,8 @@ public class OverrideResolver {
}
private static void checkOverridesForMember(
CallableMemberDescriptor memberDescriptor,
Collection<? extends CallableMemberDescriptor> overriddenDescriptors,
@NotNull CallableMemberDescriptor memberDescriptor,
@NotNull Collection<? extends CallableMemberDescriptor> overriddenDescriptors,
@NotNull CheckOverrideReportStrategy reportError
) {
for (CallableMemberDescriptor overridden : overriddenDescriptors) {