getCodecClasses function
Given an Api, return the enumerated classes that must exist in the codec where the enumeration should be the key used in the buffer.
Implementation
Iterable<EnumeratedClass> getCodecClasses(Api api, Root root) sync* {
final Set<String> enumNames = root.enums.map((Enum e) => e.name).toSet();
final Map<TypeDeclaration, List<int>> referencedTypes =
getReferencedTypes(<Api>[api], root.classes);
final Iterable<String> allTypeNames =
referencedTypes.keys.any(_isConcreteTypeAmbiguous)
? root.classes.map((Class aClass) => aClass.name)
: referencedTypes.keys.map((TypeDeclaration e) => e.baseName);
final List<String> sortedNames = allTypeNames
.where((String element) =>
element != 'void' &&
!validTypes.contains(element) &&
!enumNames.contains(element))
.toList();
sortedNames.sort();
int enumeration = _minimumCodecFieldKey;
const int maxCustomClassesPerApi = 255 - _minimumCodecFieldKey;
if (sortedNames.length > maxCustomClassesPerApi) {
throw Exception(
"Pigeon doesn't support more than $maxCustomClassesPerApi referenced custom classes per API, try splitting up your APIs.");
}
for (final String name in sortedNames) {
yield EnumeratedClass(name, enumeration);
enumeration += 1;
}
}