delegateConstructor function

String delegateConstructor(
  1. String concreteName,
  2. ConstructorElement ctr
)

Implementation

String delegateConstructor(String concreteName, ConstructorElement ctr) {
  var sup = "super";
  var str = "  $concreteName";
  if (ctr.name.isNotEmpty == true) {
    str += ".";
    sup += ".";
  }
  if (ctr.name.isNotEmpty == true) {
    str += ctr.name;
    sup += ctr.name;
  }
  str += "(";
  bool hitNamed = false;
  bool hitOptional = false;
  final delegated = <String, DelegatedType>{};

  DartParameters(ctr.parameters.expand((p) {
    final isFlattened = p.metadata.firstWhereOrNull((element) {
      return element.element!.enclosingElement!.name == "flatten";
    });
    if (isFlattened != null) {
      final factoryMethod = isFlattened
          .computeConstantValue()
          ?.getField('factory')
          ?.toStringValue();
      var del = DelegatedType(p.type, factoryMethod);
      if (del.type.element is ClassElement) {
        delegated[p.name] = del;
        final cls = del.type.element as ClassElement;
        final ctr = cls.unnamedConstructor;
        assert(ctr != null, "Must have unnamed constructor for ${del}");
        return ctr!.parameters;
      } else {
        return [p];
      }
    } else {
      return [p];
    }
  }));
  for (final p in ctr.parameters) {
    var m = p.metadata;
    final isFlattened = m.firstWhereOrNull((element) {
      return element.element!.enclosingElement!.name == "flatten";
    });
    if (isFlattened != null) {
      final factoryMethod = isFlattened
          .computeConstantValue()
          ?.getField('factory')
          ?.toStringValue();

      continue;
    }
    if (p.isOptionalPositional && !hitOptional) {
      hitOptional = true;
      str += "[";
    }
    if (p.isNamed && !hitNamed) {
      str += "{";

      /// Now add all delegate parameters
      for (var del in delegated.values) {}
      hitNamed = true;
    } else if (!p.isNamed && hitNamed) {
      hitNamed = false;
      str += "},";
    } else if (!p.isOptionalPositional && hitOptional) {
      hitOptional = false;
      str += "],";
    }
    str += "${p.redeclare},";
  }
  if (hitNamed) {
    str += "}";
  } else if (hitOptional) {
    str += "]";
  } else {
    str = str.substring(0, str.length - 1);
  }

  str += "): $sup(";
  for (final p in ctr.parameters) {
    final delegate = delegated[p.name];
    if (delegate != null) {
      // Construct an instance of delegate
      /// pass all constructor parameters
      if (delegate.type.element is ClassElement) {
        str += "${delegate.factory}(";
        final dlgCls = delegate.type.element as ClassElement;
        final dlgCtr = dlgCls.unnamedConstructor;
        dlgCtr?.parameters.forEach((element) {
          str += "${element.passthrough},";
        });
        str += "),";
      }
    } else {
      str += "${p.passthrough},";
    }
  }
  str = str.substring(0, str.length - 1);
  str += ");";
  return str;
}