getAccessibleTypes method
Implementation
Map<int, int> getAccessibleTypes(Map<int, LookupValue> definitions) {
final Set<int> types = {};
void collectTypesFromId(int id) {
if (types.contains(id)) return;
final def = definitions[id]!.def;
switch (def.tag) {
case 'composite':
if (def.value.isEmpty) break;
types.add(id);
for (var v in def.value) {
collectTypesFromId(v.type);
}
break;
case 'variant':
if (def.value.isEmpty) break;
types.add(id);
for (var v in def.value) {
for (var f in v.fields) {
collectTypesFromId(f.type);
}
}
break;
case 'tuple':
if (def.value.isEmpty) break;
types.add(id);
for (var type in def.value) {
collectTypesFromId(type);
}
break;
case 'sequence':
types.add(id);
collectTypesFromId(def.value);
break;
case 'array':
types.add(id);
collectTypesFromId(def.value.type);
break;
case 'bitSequence':
types.add(id);
break;
}
}
collectTypesFromId(metadata.extrinsic.callType);
collectTypesFromId(metadata.extrinsic.addressType);
collectTypesFromId(metadata.extrinsic.signatureType);
for (var ext in metadata.extrinsic.signedExtensions) {
collectTypesFromId(ext.type);
collectTypesFromId(ext.additionalSigned);
}
final List<int> sorted = types.toList()..sort();
return sorted.asMap().map((key, value) => MapEntry(value, key));
}