compareTo method

List<ApiChange> compareTo(
  1. DocConstructor newConstructor, {
  2. required String componentName,
})

Compares this constructor with newConstructor and returns a list of ApiChanges that have been detected between the two constructors.

Implementation

List<ApiChange> compareTo(
  DocConstructor newConstructor, {
  required String componentName,
}) {
  final changes = <ApiChange>[];
  _addChange(DocParameter parameter, ApiChangeOperation operation) {
    changes.add(ConstructorParameterApiChange(
      component: componentName,
      constructor: this,
      operation: operation,
      parameter: parameter,
    ));
  }

  for (var i = 0; i < signature.length; i++) {
    final oldParam = signature[i];
    final newParam = newConstructor.signature
        .firstWhereOrNull((element) => element.name == oldParam.name);
    if (newParam == null) {
      _addChange(oldParam, ApiChangeOperation.removed);
      continue;
    }
    if (oldParam.required != newParam.required) {
      _addChange(
        oldParam,
        oldParam.required
            ? ApiChangeOperation.becameOptional
            : ApiChangeOperation.becameRequired,
      );
    }
    if (oldParam.named != newParam.named) {
      _addChange(
        oldParam,
        oldParam.named
            ? ApiChangeOperation.becamePositional
            : ApiChangeOperation.becameNamed,
      );
    }
    if (oldParam.type != newParam.type) {
      _addChange(oldParam, ApiChangeOperation.typeChanged);
    }
  }

  for (var i = 0; i < newConstructor.signature.length; i++) {
    final newParam = newConstructor.signature[i];
    final oldParam = signature
        .firstWhereOrNull((element) => element.name == newParam.name);
    if (oldParam == null) {
      _addChange(newParam, ApiChangeOperation.added);
    }
  }

  return changes;
}