void visitSwitchStatement()

in lib/src/rules/exhaustive_cases.dart [105:159]


  void visitSwitchStatement(SwitchStatement statement) {
    var expressionType = statement.expression.staticType;
    if (expressionType is InterfaceType) {
      var classElement = expressionType.element;
      // Handled in analyzer.
      if (classElement.isEnum) {
        return;
      }
      var enumDescription = DartTypeUtilities.asEnumLikeClass(classElement);
      if (enumDescription == null) {
        return;
      }

      var enumConstants = enumDescription.enumConstants;
      for (var member in statement.members) {
        if (member is SwitchCase) {
          var expression = member.expression;
          if (expression is Identifier) {
            var element = expression.staticElement;
            if (element is PropertyAccessorElement) {
              enumConstants.remove(element.variable.computeConstantValue());
            } else if (element is VariableElement) {
              enumConstants.remove(element.computeConstantValue());
            }
          } else if (expression is PropertyAccess) {
            var element = expression.propertyName.staticElement;
            if (element is PropertyAccessorElement) {
              enumConstants.remove(element.variable.computeConstantValue());
            } else if (element is VariableElement) {
              enumConstants.remove(element.computeConstantValue());
            }
          }
        }
        if (member is SwitchDefault) {
          return;
        }
      }

      for (var constant in enumConstants.keys) {
        // Use the same offset as MISSING_ENUM_CONSTANT_IN_SWITCH.
        var offset = statement.offset;
        var end = statement.rightParenthesis.end;
        var elements = enumConstants[constant]!;
        var preferredElement = elements.firstWhere(
            (element) => !element.hasDeprecated,
            orElse: () => elements.first);
        rule.reportLintForOffset(
          offset,
          end - offset,
          arguments: [preferredElement.name],
          errorCode: lintCode,
        );
      }
    }
  }