writeTypeSpec method

TypeSpecIndex writeTypeSpec({
  1. required String namespace,
  2. required String name,
  3. List<MetadataType> generics = const [],
})

Writes a TypeSpec row, returning the corresponding index.

If a TypeSpec with the given namespace, name, and generics already exists, the cached index is returned.

Implementation

TypeSpecIndex writeTypeSpec({
  required String namespace,
  required String name,
  List<MetadataType> generics = const [],
}) {
  assert(
    generics.isNotEmpty,
    'TypeSpec requires at least one generic argument.',
  );

  final key = _TypeSpecKey(name, generics);

  // Return cached reference if it exists.
  if (_typeSpecs[namespace]?[key] case final typeSpec?) return typeSpec;

  final buffer = BytesBuilder(copy: false)
    ..addByte(ELEMENT_TYPE_GENERICINST)
    ..addByte(ELEMENT_TYPE_CLASS)
    ..add(
      CompressedInteger.encode(
        TypeDefOrRef.typeRef(
          writeTypeRef(namespace: namespace, name: name),
        ).encode(),
      ),
    )
    ..add(CompressedInteger.encode(generics.length));
  for (final genericType in generics) {
    _encodeType(genericType, buffer);
  }

  final table = _tableStream[MetadataTableId.typeSpec];
  final index = TypeSpecIndex(table.length);
  table.add(TypeSpec(signature: _blobHeap.insert(buffer.takeBytes())));
  _typeSpecs
      .putIfAbsent(namespace, HashMap.new)
      .putIfAbsent(key, () => index);

  return index;
}