TypeEntity constructor
Implementation
factory TypeEntity(Object baseType, [List<Object> subTypes = const []]) {
final initialCleanBaseTypeString = _getTypeString(baseType);
String finalTypeString;
if (subTypes.isNotEmpty) {
final isSimpleIdentifier = !initialCleanBaseTypeString.contains(
RegExp(r'[<>,?]'),
);
if (isSimpleIdentifier) {
final subTypeStrings = subTypes
.map((st) => _getTypeString(st))
.join(',');
finalTypeString = '$initialCleanBaseTypeString<$subTypeStrings>';
} else {
final objectPlaceholder = _getTypeString(Object);
final objectNullablePlaceholder = "$objectPlaceholder?";
final dynamicPlaceholder = _getTypeString(dynamic);
var subTypeIndex = 0;
final buffer = StringBuffer();
var n = 0;
while (n < initialCleanBaseTypeString.length) {
var matched = false;
if (initialCleanBaseTypeString.startsWith(
objectNullablePlaceholder,
n,
)) {
if (subTypeIndex < subTypes.length) {
buffer.write(_getTypeString(subTypes[subTypeIndex]));
subTypeIndex++;
} else {
buffer.write(objectNullablePlaceholder);
}
n += objectNullablePlaceholder.length;
matched = true;
} else if (initialCleanBaseTypeString.startsWith(
objectPlaceholder,
n,
)) {
if (subTypeIndex < subTypes.length) {
buffer.write(_getTypeString(subTypes[subTypeIndex]));
subTypeIndex++;
} else {
buffer.write(objectPlaceholder);
}
n += objectPlaceholder.length;
matched = true;
} else if (initialCleanBaseTypeString.startsWith(
dynamicPlaceholder,
n,
)) {
if (subTypeIndex < subTypes.length) {
buffer.write(_getTypeString(subTypes[subTypeIndex]));
subTypeIndex++;
} else {
buffer.write(dynamicPlaceholder);
}
n += dynamicPlaceholder.length;
matched = true;
}
if (!matched) {
buffer.write(initialCleanBaseTypeString[n]);
n++;
}
}
finalTypeString = buffer.toString();
}
} else {
finalTypeString = initialCleanBaseTypeString;
}
return TypeEntity._obj(finalTypeString);
}