String? _tryRequiresForbidden()

in lib/src/solver/incompatibility.dart [357:432]


  String? _tryRequiresForbidden(Incompatibility other,
      [Map<String, PackageDetail>? details, int? thisLine, int? otherLine]) {
    if (terms.length != 1 && other.terms.length != 1) return null;

    Incompatibility prior;
    Incompatibility latter;
    int? priorLine;
    int? latterLine;
    if (terms.length == 1) {
      prior = other;
      latter = this;
      priorLine = otherLine;
      latterLine = thisLine;
    } else {
      prior = this;
      latter = other;
      priorLine = thisLine;
      latterLine = otherLine;
    }

    var negative = prior._singleTermWhere((term) => !term.isPositive);
    if (negative == null) return null;
    if (!negative.inverse.satisfies(latter.terms.first)) return null;

    var positives = prior.terms.where((term) => term.isPositive);

    var buffer = StringBuffer();
    if (positives.length > 1) {
      var priorString =
          positives.map((term) => _terse(term, details)).join(' or ');
      buffer.write('if $priorString then ');
    } else {
      buffer.write(_terse(positives.first, details, allowEvery: true));
      buffer.write(prior.cause == IncompatibilityCause.dependency
          ? ' depends on '
          : ' requires ');
    }

    if (latter.cause == IncompatibilityCause.unknownSource) {
      var package = latter.terms.first.package;
      buffer.write('${package.name} ');
      if (priorLine != null) buffer.write('($priorLine) ');
      buffer.write('from unknown source "${package.source}"');
      if (latterLine != null) buffer.write(' ($latterLine)');
      return buffer.toString();
    }

    buffer.write('${_terse(latter.terms.first, details)} ');
    if (priorLine != null) buffer.write('($priorLine) ');

    if (latter.cause == IncompatibilityCause.useLatest) {
      var latest =
          VersionConstraint.any.difference(latter.terms.single.constraint);
      buffer.write('but the latest version ($latest) is required');
    } else if (latter.cause is SdkCause) {
      var cause = latter.cause as SdkCause;
      buffer.write('which requires ');
      if (!cause.sdk.isAvailable) {
        buffer.write('the ${cause.sdk.name} SDK');
      } else {
        if (cause.sdk.name != 'Dart') buffer.write(cause.sdk.name + ' ');
        buffer.write('SDK version ${cause.constraint}');
      }
    } else if (latter.cause == IncompatibilityCause.noVersions) {
      buffer.write("which doesn't match any versions");
    } else if (cause is PackageNotFoundCause) {
      buffer.write("which doesn't exist "
          '(${(cause as PackageNotFoundCause).exception.message})');
    } else {
      buffer.write('which is forbidden');
    }

    if (latterLine != null) buffer.write(' ($latterLine)');

    return buffer.toString();
  }