delegateConstructor function
String
delegateConstructor(
- String concreteName,
- 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;
}