protected void addReturnTypeDetails(AbstractResolvedOperation overriding, AbstractResolvedOperation overridden,
EnumSet<OverrideCheckDetails> result) {
LightweightTypeReference overridingReturnType = overriding.getResolvedReturnType();
LightweightTypeReference overriddenReturnType = overridden.getResolvedReturnType();
TypeConformanceComputationArgument conformanceArgument = new TypeConformanceComputationArgument(false, false, false, false, false, false);
if (!overriddenReturnType.isAssignableFrom(overridingReturnType, conformanceArgument)) {
if (overriding.getTypeParameters().isEmpty() && !overridden.getTypeParameters().isEmpty()) {
TypeConformanceComputationArgument rawConformanceArgument = new TypeConformanceComputationArgument(true, false, false, false, false, false);
if (!overriddenReturnType.isAssignableFrom(overridingReturnType, rawConformanceArgument)) {
result.add(OverrideCheckDetails.RETURN_MISMATCH);
} else {
result.add(OverrideCheckDetails.UNCHECKED_CONVERSION_REQUIRED);
if (overridingReturnType.getRawTypeReference().getType() != overriddenReturnType.getRawTypeReference().getType()) {
result.add(OverrideCheckDetails.COVARIANT_RETURN);
}
}
} else {
result.add(OverrideCheckDetails.RETURN_MISMATCH);
}
} else if (!overriddenReturnType.getJavaIdentifier().equals(overridingReturnType.getJavaIdentifier())) {
if (!overridden.isRawTypeInheritance() && overriding.getTypeParameters().isEmpty() && !overridden.getTypeParameters().isEmpty()) {
if (overridden.getTypeParameters().contains(overridden.getDeclaration().getReturnType().getType())) {
result.add(OverrideCheckDetails.UNCHECKED_CONVERSION_REQUIRED);
}
}
result.add(OverrideCheckDetails.COVARIANT_RETURN);
}
}