Optimize external overridability conditions

- Skip ones that can lead only to success after first success
- And vice versa
This commit is contained in:
Denis Zharkov
2016-02-12 15:42:36 +03:00
parent 1b4b8ab5db
commit 9f22b17918
6 changed files with 52 additions and 10 deletions
@@ -46,15 +46,16 @@ public class SamAdapterOverridabilityCondition implements ExternalOverridability
return subOriginal == null ? Result.UNKNOWN : Result.INCOMPATIBLE; // DECLARATION can override anything
}
OverridingUtil.OverrideCompatibilityInfo basicResult = OverridingUtil.DEFAULT
.isOverridableByWithoutExternalConditions(superDescriptor, subDescriptor, /* checkReturnType = */ false);
if (basicResult.getResult() != OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE) return Result.UNKNOWN;
// inheritor if SYNTHESIZED can override inheritor of SYNTHESIZED if their originals have same erasure
return equalErasure(superOriginal, subOriginal) ? Result.UNKNOWN : Result.INCOMPATIBLE;
}
@NotNull
@Override
public Contract getContract() {
return Contract.CONFLICTS_ONLY;
}
private static boolean equalErasure(@NotNull FunctionDescriptor fun1, @NotNull FunctionDescriptor fun2) {
List<ValueParameterDescriptor> parameters1 = fun1.getValueParameters();
List<ValueParameterDescriptor> parameters2 = fun2.getValueParameters();