IDEA-90329 (Constructor with too many parameters shall have an option to be ignored according to its accessesibility)

This commit is contained in:
Bas Leijdekkers
2012-09-11 09:09:20 +02:00
parent 8ab800a71c
commit af6da9b13c
3 changed files with 112 additions and 8 deletions
@@ -1283,6 +1283,7 @@ non.comment.source.statements.problem.descriptor=<code>#ref</code> is too long (
parameters.per.method.problem.descriptor=<code>#ref()</code> has too many parameters (num parameters = {0}) #loc
parameters.per.constructor.problem.descriptor=<code>#ref()</code> has too many parameters (num parameters = {0}) #loc
parameter.limit.option=Parameter limit:
constructor.visibility.option=Ignore constructors with visibility
three.negations.per.method.ignore.option=Ignore negations in 'equals()' methods
three.negations.per.method.ignore.assert.option=Ignore negations in 'assert' statements
three.negations.per.method.problem.descriptor=<code>#ref</code> contains {0} negations #loc
@@ -1989,3 +1990,7 @@ public.constructor.problem.descriptor=Public constructor <code>#ref()</code>
public.constructor.quickfix=Replace constructor with factory method
junit3.style.test.method.in.junit4.class.display.name=Old style JUnit test method in JUnit 4 class
junit3.style.test.method.in.junit4.class.problem.descriptor=Old style JUnit test method <code>#ref</code> in JUnit 4 class
none=none
private=private
package.local.private=package local & private
protected.package.local.private=protected, package local & private
@@ -1,5 +1,5 @@
/*
* Copyright 2003-2007 Dave Griffith, Bas Leijdekkers
* Copyright 2003-2012 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.
@@ -16,44 +16,133 @@
package com.siyeh.ig.methodmetrics;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiParameterList;
import com.intellij.ui.ListCellRendererWrapper;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspectionVisitor;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ParametersPerConstructorInspection extends MethodMetricInspection {
private enum Scope {
NONE {
@Override
String getText() {
return InspectionGadgetsBundle.message("none");
}
},
PRIVATE {
@Override
String getText() {
return InspectionGadgetsBundle.message("private");
}
},
PACKAGE_LOCAL {
@Override
String getText() {
return InspectionGadgetsBundle.message("package.local.private");
}
},
PROTECTED {
@Override
String getText() {
return InspectionGadgetsBundle.message("protected.package.local.private");
}
};
abstract String getText();
}
@SuppressWarnings("PublicField") public Scope ignoreScope = Scope.NONE;
@Override
@NotNull
public String getID() {
return "ConstructorWithTooManyParameters";
}
@Override
@NotNull
public String getDisplayName() {
return InspectionGadgetsBundle.message(
"parameters.per.constructor.display.name");
return InspectionGadgetsBundle.message("parameters.per.constructor.display.name");
}
@Override
@NotNull
public String buildErrorString(Object... infos) {
final Integer parameterCount = (Integer)infos[0];
return InspectionGadgetsBundle.message(
"parameters.per.constructor.problem.descriptor", parameterCount);
return InspectionGadgetsBundle.message("parameters.per.constructor.problem.descriptor", parameterCount);
}
@Override
protected int getDefaultLimit() {
return 5;
}
@Override
protected String getConfigurationLabel() {
return InspectionGadgetsBundle.message("parameter.limit.option");
}
public BaseInspectionVisitor buildVisitor() {
return new ParametersPerMethodVisitor();
@Override
public JComponent createOptionsPanel() {
final JPanel panel = new JPanel();
final JLabel textFieldLabel = new JLabel(getConfigurationLabel());
final JFormattedTextField valueField = prepareNumberEditor("m_limit");
final JLabel comboBoxLabel = new JLabel(InspectionGadgetsBundle.message("constructor.visibility.option"));
final JComboBox comboBox = new JComboBox();
comboBox.addItem(Scope.NONE);
comboBox.addItem(Scope.PRIVATE);
comboBox.addItem(Scope.PACKAGE_LOCAL);
comboBox.addItem(Scope.PROTECTED);
comboBox.setRenderer(new ListCellRendererWrapper() {
@Override
public void customize(JList list, Object value, int index, boolean selected, boolean hasFocus) {
if (value instanceof Scope) setText(((Scope)value).getText());
}
});
comboBox.setSelectedItem(ignoreScope);
comboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ignoreScope = (Scope)comboBox.getSelectedItem();
}
});
comboBox.setPrototypeDisplayValue(Scope.PROTECTED);
final GroupLayout layout = new GroupLayout(panel);
layout.setAutoCreateGaps(true);
panel.setLayout(layout);
final GroupLayout.ParallelGroup horizontal = layout.createParallelGroup();
horizontal.addGroup(layout.createSequentialGroup()
.addComponent(textFieldLabel)
.addComponent(valueField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE));
horizontal.addGroup(layout.createSequentialGroup()
.addComponent(comboBoxLabel).addComponent(comboBox, 100, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE));
layout.setHorizontalGroup(horizontal);
final GroupLayout.SequentialGroup vertical = layout.createSequentialGroup();
vertical.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(textFieldLabel)
.addComponent(valueField));
vertical.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(comboBoxLabel)
.addComponent(comboBox));
layout.setVerticalGroup(vertical);
return panel;
}
private class ParametersPerMethodVisitor extends BaseInspectionVisitor {
@Override
public BaseInspectionVisitor buildVisitor() {
return new ParametersPerConstructorVisitor();
}
private class ParametersPerConstructorVisitor extends BaseInspectionVisitor {
@Override
public void visitMethod(@NotNull PsiMethod method) {
@@ -64,6 +153,13 @@ public class ParametersPerConstructorInspection extends MethodMetricInspection {
if (!method.isConstructor()) {
return;
}
if (ignoreScope != Scope.NONE) {
switch (ignoreScope.ordinal()) {
case 3: if (method.hasModifierProperty(PsiModifier.PROTECTED)) return;
case 2: if (method.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) return;
case 1: if (method.hasModifierProperty(PsiModifier.PRIVATE)) return;
}
}
final PsiParameterList parameterList = method.getParameterList();
final int parametersCount = parameterList.getParametersCount();
if (parametersCount <= getLimit()) {
@@ -6,6 +6,9 @@ with too many parameters can be a good sign that refactoring is necessary.
<p>
Use the field provided below to specify the maximum acceptable number of parameters a constructor might have.
<p>
Use the combobox below to specify if the inspection should ignore private, package local & private or protected, package local and
private constructors
<p>
<small>Powered by InspectionGadgets</small>
</body>
</html>