private static boolean switchLabelStatementsAreEquivalent( @NotNull PsiSwitchLabelStatement statement1, @NotNull PsiSwitchLabelStatement statement2) { if (statement1.isDefaultCase()) { return statement2.isDefaultCase(); } if (statement2.isDefaultCase()) { return false; } final PsiExpression caseExpression1 = statement1.getCaseValue(); final PsiExpression caseExpression2 = statement2.getCaseValue(); return expressionsAreEquivalent(caseExpression1, caseExpression2); }
public boolean satisfiedBy(PsiElement element) { if (!(element instanceof PsiSwitchStatement)) { return false; } final PsiSwitchStatement switchStatement = (PsiSwitchStatement) element; final PsiCodeBlock body = switchStatement.getBody(); if (body == null) { return false; } final PsiExpression expression = switchStatement.getExpression(); if (expression == null) { return false; } final PsiType type = expression.getType(); if (!(type instanceof PsiClassType)) { return false; } final PsiClass enumClass = ((PsiClassType) type).resolve(); if (enumClass == null || !enumClass.isEnum()) { return false; } final PsiField[] fields = enumClass.getFields(); final Set<String> enumElements = new HashSet<String>(fields.length); for (final PsiField field : fields) { final PsiType fieldType = field.getType(); if (fieldType.equals(type)) { final String fieldName = field.getName(); enumElements.add(fieldName); } } final PsiStatement[] statements = body.getStatements(); for (PsiStatement statement : statements) { if (statement instanceof PsiSwitchLabelStatement) { final PsiSwitchLabelStatement labelStatement = (PsiSwitchLabelStatement) statement; final PsiExpression value = labelStatement.getCaseValue(); if (value != null) { final String valueText = value.getText(); enumElements.remove(valueText); } } } if (enumElements.isEmpty()) { return false; } return !ErrorUtil.containsError(element); }