MetadataIndex.fromReaders constructor
MetadataIndex.fromReaders(
- List<
MetadataReader> readers
Creates a MetadataIndex from a list of MetadataReaders.
This constructor scans each reader and builds internal lookup structures for type definitions and nested types. If multiple readers are provided, they are indexed by order of appearance.
Implementation
factory MetadataIndex.fromReaders(List<MetadataReader> readers) {
final namespaceToTypeMap =
HashMap<String, HashMap<String, List<_ReaderAndTypeDefIndex>>>();
final nestedTypeMap = HashMap<_ReaderAndTypeDefIndex, List<int>>();
const nestedClassTable = MetadataTable.nestedClass;
const typeDefTable = MetadataTable.typeDef;
for (var readerIndex = 0; readerIndex < readers.length; readerIndex++) {
final reader = readers[readerIndex];
final tableStream = reader.tableStream;
for (final typeDefIndex in tableStream.typeDef) {
final namespace = reader.readString(typeDefIndex, typeDefTable, 2);
// Skips `<Module>` as well as nested types.
if (namespace.isEmpty) continue;
final name = reader.readString(typeDefIndex, typeDefTable, 1);
namespaceToTypeMap
.putIfAbsent(namespace, HashMap.new)
.putIfAbsent(name, () => [])
.add(_ReaderAndTypeDefIndex(readerIndex, typeDefIndex));
}
for (final nestedClass in tableStream.nestedClass) {
final inner = reader.readUint(nestedClass, nestedClassTable, 0) - 1;
final outer = reader.readUint(nestedClass, nestedClassTable, 1) - 1;
nestedTypeMap
.putIfAbsent(_ReaderAndTypeDefIndex(readerIndex, outer), () => [])
.add(inner);
}
}
return MetadataIndex._(
UnmodifiableListView(readers),
namespaceToTypeMap,
nestedTypeMap,
);
}