blob: 628853e6412c72df9ef05bced15f091c11ff7acf [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.ig.errorhandling;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.util.FileTypeUtils;
import com.intellij.psi.util.PsiUtil;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
import com.siyeh.ig.InspectionGadgetsFix;
import com.siyeh.ig.psiutils.TestUtils;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
public class EmptyCatchBlockInspectionBase extends BaseInspection {
/**
* @noinspection PublicField
*/
public boolean m_includeComments = true;
/**
* @noinspection PublicField
*/
public boolean m_ignoreTestCases = true; // keep for compatibility
/**
* @noinspection PublicField
*/
public boolean m_ignoreIgnoreParameter = true;
@Override
@NotNull
public String getDisplayName() {
return InspectionGadgetsBundle.message("empty.catch.block.display.name");
}
@Override
@NotNull
protected String buildErrorString(Object... infos) {
return InspectionGadgetsBundle.message("empty.catch.block.problem.descriptor");
}
@Override
public boolean isEnabledByDefault() {
return true;
}
@Override
public JComponent createOptionsPanel() {
final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this);
optionsPanel.addCheckbox(InspectionGadgetsBundle.message("empty.catch.block.comments.option"), "m_includeComments");
optionsPanel.addCheckbox(InspectionGadgetsBundle.message("empty.catch.block.ignore.ignore.option"), "m_ignoreIgnoreParameter");
return optionsPanel;
}
@Override
@Nullable
protected InspectionGadgetsFix buildFix(Object... infos) {
return new EmptyCatchBlockFix();
}
private static class EmptyCatchBlockFix extends InspectionGadgetsFix {
@Override
@NotNull
public String getFamilyName() {
return getName();
}
@Override
@NotNull
public String getName() {
return InspectionGadgetsBundle.message("rename.catch.parameter.to.ignored");
}
@Override
protected void doFix(Project project, ProblemDescriptor descriptor) {
final PsiElement element = descriptor.getPsiElement();
final PsiElement parent = element.getParent();
if (!(parent instanceof PsiCatchSection)) {
return;
}
final PsiCatchSection catchSection = (PsiCatchSection)parent;
final PsiParameter parameter = catchSection.getParameter();
if (parameter == null) {
return;
}
final PsiIdentifier identifier = parameter.getNameIdentifier();
if (identifier == null) {
return;
}
final PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory();
final PsiIdentifier newIdentifier = factory.createIdentifier("ignored");
identifier.replace(newIdentifier);
}
}
@Override
public BaseInspectionVisitor buildVisitor() {
return new EmptyCatchBlockVisitor();
}
private class EmptyCatchBlockVisitor extends BaseInspectionVisitor {
@Override
public void visitTryStatement(@NotNull PsiTryStatement statement) {
super.visitTryStatement(statement);
if (FileTypeUtils.isInServerPageFile(statement.getContainingFile())) {
return;
}
final PsiCatchSection[] catchSections = statement.getCatchSections();
for (final PsiCatchSection section : catchSections) {
checkCatchSection(section);
}
}
private void checkCatchSection(PsiCatchSection section) {
final PsiCodeBlock block = section.getCatchBlock();
if (block == null || !isEmpty(block)) {
return;
}
final PsiParameter parameter = section.getParameter();
if (parameter == null) {
return;
}
final PsiIdentifier identifier = parameter.getNameIdentifier();
if (identifier == null) {
return;
}
@NonNls final String parameterName = parameter.getName();
if (m_ignoreIgnoreParameter && PsiUtil.isIgnoredName(parameterName)) {
return;
}
final PsiElement catchToken = section.getFirstChild();
if (catchToken == null) {
return;
}
registerError(catchToken, catchToken);
}
private boolean isEmpty(PsiElement element) {
if (!m_includeComments && element instanceof PsiComment) {
return true;
} else if (element instanceof PsiEmptyStatement) {
if (m_includeComments) {
final PsiElement[] children = element.getChildren();
for (PsiElement child : children) {
if (child instanceof PsiComment) {
return false;
}
}
}
return true;
} else if (element instanceof PsiWhiteSpace) {
return true;
} else if (element instanceof PsiBlockStatement) {
final PsiBlockStatement block = (PsiBlockStatement)element;
return isEmpty(block.getCodeBlock());
} else if (element instanceof PsiCodeBlock) {
final PsiCodeBlock codeBlock = (PsiCodeBlock)element;
PsiElement bodyElement = codeBlock.getFirstBodyElement();
final PsiElement lastBodyElement = codeBlock.getLastBodyElement();
while (bodyElement != null) {
if (!isEmpty(bodyElement)) {
return false;
}
if (bodyElement == lastBodyElement) {
break;
}
bodyElement = bodyElement.getNextSibling();
}
return true;
}
return false;
}
}
}