mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-90329 (Constructor with too many parameters shall have an option to be ignored according to its accessesibility)
This commit is contained in:
@@ -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
|
||||
|
||||
+104
-8
@@ -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>
|
||||
Reference in New Issue
Block a user