Exclude warning "Remove final upper bound" for functions with override modifier

^KT-25105 Fixed
This commit is contained in:
Victor Petukhov
2019-03-23 10:41:31 +03:00
parent 9cd005fbae
commit 568506e5c1
7 changed files with 220 additions and 6 deletions
@@ -369,7 +369,7 @@ class DeclarationsChecker(
upperBoundCheckRequests.add(DescriptorResolver.UpperBoundCheckRequest(name, typeReference, type))
}
DescriptorResolver.checkUpperBoundTypes(trace, upperBoundCheckRequests)
DescriptorResolver.checkUpperBoundTypes(trace, upperBoundCheckRequests, false)
for (request in upperBoundCheckRequests) {
DescriptorResolver.checkBounds(request.upperBound, request.upperBoundType, trace)
@@ -560,12 +560,16 @@ public class DescriptorResolver {
}
if (!(declaration instanceof KtClass)) {
checkUpperBoundTypes(trace, upperBoundCheckRequests);
checkUpperBoundTypes(trace, upperBoundCheckRequests, declaration.hasModifier(KtTokens.OVERRIDE_KEYWORD));
checkNamesInConstraints(declaration, descriptor, scope, trace);
}
}
public static void checkUpperBoundTypes(@NotNull BindingTrace trace, @NotNull List<UpperBoundCheckRequest> requests) {
public static void checkUpperBoundTypes(
@NotNull BindingTrace trace,
@NotNull List<UpperBoundCheckRequest> requests,
boolean hasOverrideModifier
) {
if (requests.isEmpty()) return;
Set<Name> classBoundEncountered = new HashSet<>();
@@ -593,7 +597,7 @@ public class DescriptorResolver {
}
}
checkUpperBoundType(upperBoundElement, upperBound, trace);
checkUpperBoundType(upperBoundElement, upperBound, trace, hasOverrideModifier);
}
}
@@ -641,9 +645,10 @@ public class DescriptorResolver {
public static void checkUpperBoundType(
KtTypeReference upperBound,
@NotNull KotlinType upperBoundType,
BindingTrace trace
BindingTrace trace,
boolean hasOverrideModifier
) {
if (!TypeUtils.canHaveSubtypes(KotlinTypeChecker.DEFAULT, upperBoundType)) {
if (!hasOverrideModifier && !TypeUtils.canHaveSubtypes(KotlinTypeChecker.DEFAULT, upperBoundType)) {
trace.report(FINAL_UPPER_BOUND.on(upperBound, upperBoundType));
}
if (DynamicTypesKt.isDynamic(upperBoundType)) {