Example #1
0
  /** 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();
    }
  }
Example #2
0
  @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();
  }