writeTypeSpec method
TypeSpecIndex
writeTypeSpec({
- required String namespace,
- required String name,
- 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;
}