static EnumLikeClassDescription? asEnumLikeClass()

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);
  }