/** Does not check names. */ public static OverloadCompatibilityInfo isOverloadable( CallableDescriptor a, CallableDescriptor b) { int abc = braceCount(a); int bbc = braceCount(b); if (abc != bbc) { return OverloadCompatibilityInfo.success(); } OverridingUtil.OverrideCompatibilityInfo overrideCompatibilityInfo = isOverloadableBy(a, b); switch (overrideCompatibilityInfo.getResult()) { case OVERRIDABLE: case CONFLICT: return OverloadCompatibilityInfo.someError(); case INCOMPATIBLE: return OverloadCompatibilityInfo.success(); default: throw new IllegalStateException(); } }
@NotNull private static OverridingUtil.OverrideCompatibilityInfo isOverloadableBy( @NotNull CallableDescriptor superDescriptor, @NotNull CallableDescriptor subDescriptor) { OverridingUtil.OverrideCompatibilityInfo receiverAndParameterResult = OverridingUtil.checkReceiverAndParameterCount(superDescriptor, subDescriptor); if (receiverAndParameterResult != null) { return receiverAndParameterResult; } List<JetType> superValueParameters = OverridingUtil.compiledValueParameters(superDescriptor); List<JetType> subValueParameters = OverridingUtil.compiledValueParameters(subDescriptor); for (int i = 0; i < superValueParameters.size(); ++i) { JetType superValueParameterType = OverridingUtil.getUpperBound(superValueParameters.get(i)); JetType subValueParameterType = OverridingUtil.getUpperBound(subValueParameters.get(i)); // TODO: compare erasure if (!JetTypeChecker.DEFAULT.equalTypes(superValueParameterType, subValueParameterType)) { return OverridingUtil.OverrideCompatibilityInfo.valueParameterTypeMismatch( superValueParameterType, subValueParameterType, INCOMPATIBLE); } } return OverridingUtil.OverrideCompatibilityInfo.success(); }