blob: 6ea35f076f1bbcb2e82c529a39cc654dd6b0291b [file] [log] [blame]
/*
* Copyright 2003-2013 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.siyeh.ipp.enumswitch;
import com.intellij.psi.*;
import com.siyeh.ipp.base.PsiElementPredicate;
import com.siyeh.ipp.psiutils.ErrorUtil;
import java.util.HashSet;
import java.util.Set;
class EnumSwitchPredicate implements PsiElementPredicate {
public boolean satisfiedBy(PsiElement element) {
if (element instanceof PsiWhiteSpace) {
PsiElement prevSibling = element.getPrevSibling();
if (prevSibling instanceof PsiSwitchStatement && ErrorUtil.containsError(prevSibling)) {
element = prevSibling;
}
}
if (!(element instanceof PsiSwitchStatement)) {
return false;
}
final PsiSwitchStatement switchStatement = (PsiSwitchStatement)element;
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();
if (fields.length == 0) {
return false;
}
final PsiCodeBlock body = switchStatement.getBody();
if (body == null) {
return true;
}
final Set<String> enumElements = new HashSet<String>(fields.length);
for (final PsiField field : fields) {
final PsiType fieldType = field.getType();
if (!fieldType.equals(type)) {
continue;
}
final String fieldName = field.getName();
enumElements.add(fieldName);
}
final PsiStatement[] statements = body.getStatements();
for (PsiStatement statement : statements) {
if (!(statement instanceof PsiSwitchLabelStatement)) {
continue;
}
final PsiSwitchLabelStatement labelStatement = (PsiSwitchLabelStatement)statement;
final PsiExpression value = labelStatement.getCaseValue();
if (value == null) {
continue;
}
final String valueText = value.getText();
enumElements.remove(valueText);
}
return !enumElements.isEmpty();
}
}