in lib/src/util/dart_type_utilities.dart [35:89]
static EnumLikeClassDescription? asEnumLikeClass(ClassElement classElement) {
// See discussion: https://github.com/dart-lang/linter/issues/2083
//
// Must be concrete.
if (classElement.isAbstract) {
return null;
}
// With only private non-factory constructors.
for (var cons in classElement.constructors) {
if (!cons.isPrivate || cons.isFactory) {
return null;
}
}
var type = classElement.thisType;
// And 2 or more static const fields whose type is the enclosing class.
var enumConstantCount = 0;
var enumConstants = <DartObject, Set<FieldElement>>{};
for (var field in classElement.fields) {
// Ensure static const.
if (field.isSynthetic || !field.isConst || !field.isStatic) {
continue;
}
// Check for type equality.
if (field.type != type) {
continue;
}
var fieldValue = field.computeConstantValue();
if (fieldValue == null) {
continue;
}
enumConstantCount++;
enumConstants.putIfAbsent(fieldValue, () => {}).add(field);
}
if (enumConstantCount < 2) {
return null;
}
// And no subclasses in the defining library.
var compilationUnit = classElement.library.definingCompilationUnit;
for (var cls in compilationUnit.classes) {
InterfaceType? classType = cls.thisType;
do {
classType = classType?.superclass;
if (classType == type) {
return null;
}
} while (classType != null && !classType.isDartCoreObject);
}
return EnumLikeClassDescription(enumConstants);
}