TypeEntity constructor

TypeEntity(
  1. Object baseType, [
  2. List<Object> subTypes = const []
])

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);
}