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