actual parameter is the same value inspection: add option to ignore method by visibility

This commit is contained in:
Dmitry Batkovich
2017-04-07 15:50:59 +03:00
parent 21036c0ba1
commit 44be97d396
3 changed files with 187 additions and 125 deletions
@@ -18,9 +18,11 @@ package com.intellij.codeInspection.sameParameterValue;
import com.intellij.codeInspection.InspectionsBundle;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.unusedSymbol.VisibilityModifierChooser;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.LabeledComponent;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
@@ -35,8 +37,12 @@ import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.refactoring.util.InlineUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.MultiMap;
import com.intellij.util.ui.JBUI;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -45,7 +51,22 @@ import java.util.List;
* @author max
*/
public class SameParameterValueInspection extends SameParameterValueInspectionBase {
private static final Logger LOG = Logger.getInstance("#" + SameParameterValueInspectionBase.class.getName());
private static final Logger LOG = Logger.getInstance(SameParameterValueInspectionBase.class);
@Nullable
@Override
public JComponent createOptionsPanel() {
LabeledComponent<VisibilityModifierChooser> component = LabeledComponent.create(new VisibilityModifierChooser(() -> true,
highestModifier,
(newModifier) -> highestModifier = newModifier),
"Methods to report:",
BorderLayout.WEST);
JPanel panel = new JPanel(new GridBagLayout());
panel.add(component, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NORTHEAST, JBUI.emptyInsets(), 0, 0));
return panel;
}
protected LocalQuickFix createFix(String paramName, String value) {
return new InlineParameterValueFix(paramName, value);
@@ -16,37 +16,13 @@
package com.intellij.codeInspection.unusedSymbol;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.openapi.ui.popup.JBPopupAdapter;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.ui.popup.LightweightWindowEvent;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiModifier;
import com.intellij.ui.ClickListener;
import com.intellij.ui.UI;
import com.intellij.ui.UserActivityProviderComponent;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Consumer;
import com.intellij.util.Producer;
import com.intellij.util.VisibilityUtil;
import com.intellij.util.containers.HashSet;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.util.Hashtable;
import java.util.Set;
import java.util.function.Supplier;
/**
* User: anna
@@ -107,13 +83,7 @@ public class UnusedSymbolLocalInspection extends UnusedSymbolLocalInspectionBase
myCheckParametersCheckBox.addActionListener(listener);
myInnerClassesCheckBox.addActionListener(listener);
myAccessors.addActionListener(listener);
((MyLabel)myClassVisibilityCb).setupVisibilityLabel(() -> myClassVisibility, modifier -> setClassVisibility(modifier), new String[]{PsiModifier.PACKAGE_LOCAL, PsiModifier.PUBLIC});
((MyLabel)myInnerClassVisibilityCb).setupVisibilityLabel(() -> myInnerClassVisibility, modifier -> setInnerClassVisibility(modifier));
((MyLabel)myFieldVisibilityCb).setupVisibilityLabel(() -> myFieldVisibility, modifier -> setFieldVisibility(modifier));
((MyLabel)myMethodVisibilityCb).setupVisibilityLabel(() -> myMethodVisibility, modifier -> setMethodVisibility(modifier));
((MyLabel)myMethodParameterVisibilityCb).setupVisibilityLabel(() -> myParameterVisibility, modifier -> setParameterVisibility(modifier));
}
}
private void updateEnableState() {
UIUtil.setEnabled(myClassVisibilityCb, CLASS, true);
@@ -129,11 +99,27 @@ public class UnusedSymbolLocalInspection extends UnusedSymbolLocalInspectionBase
}
private void createUIComponents() {
myClassVisibilityCb = new MyLabel(() -> CLASS);
myInnerClassVisibilityCb = new MyLabel(() -> INNER_CLASS);
myFieldVisibilityCb = new MyLabel(() -> FIELD);
myMethodVisibilityCb = new MyLabel(() -> METHOD);
myMethodParameterVisibilityCb = new MyLabel(() -> PARAMETER);
myClassVisibilityCb = new VisibilityModifierChooser(() -> CLASS,
myClassVisibility,
modifier -> setClassVisibility(modifier),
new String[]{PsiModifier.PACKAGE_LOCAL, PsiModifier.PUBLIC});
myInnerClassVisibilityCb = new VisibilityModifierChooser(() -> INNER_CLASS,
myInnerClassVisibility,
modifier -> setInnerClassVisibility(modifier));
myFieldVisibilityCb = new VisibilityModifierChooser(() -> FIELD,
myFieldVisibility,
modifier -> setFieldVisibility(modifier));
myMethodVisibilityCb = new VisibilityModifierChooser(() -> METHOD,
myMethodVisibility,
modifier -> setMethodVisibility(modifier));
myMethodParameterVisibilityCb = new VisibilityModifierChooser(() -> PARAMETER,
myParameterVisibility,
modifier -> setParameterVisibility(modifier));
myAccessors = new JCheckBox() {
@Override
public void setEnabled(boolean b) {
@@ -143,94 +129,6 @@ public class UnusedSymbolLocalInspection extends UnusedSymbolLocalInspectionBase
}
}
private static class MyLabel extends JLabel implements UserActivityProviderComponent {
@PsiModifier.ModifierConstant private static final String[] MODIFIERS =
new String[]{PsiModifier.PRIVATE, PsiModifier.PACKAGE_LOCAL, PsiModifier.PROTECTED, PsiModifier.PUBLIC};
private final Supplier<Boolean> myCanBeEnabled;
private Set<ChangeListener> myListeners = new HashSet<>();
public MyLabel(Supplier<Boolean> canBeEnabled) {
myCanBeEnabled = canBeEnabled;
setIcon(AllIcons.General.Combo2);
setDisabledIcon(AllIcons.General.Combo2);
setIconTextGap(0);
setHorizontalTextPosition(SwingConstants.LEFT);
}
private void fireStateChanged() {
for (ChangeListener listener : myListeners) {
listener.stateChanged(new ChangeEvent(this));
}
}
private static String getPresentableText(String modifier) {
return StringUtil.capitalize(VisibilityUtil.toPresentableText(modifier));
}
private void setupVisibilityLabel(Producer<String> visibilityProducer, Consumer<String> setter) {
setupVisibilityLabel(visibilityProducer, setter, MODIFIERS);
}
private void setupVisibilityLabel(Producer<String> visibilityProducer, Consumer<String> setter, final String[] modifiers) {
setText(getPresentableText(visibilityProducer.produce()));
new ClickListener() {
@Override
public boolean onClick(@NotNull MouseEvent e, int clickCount) {
if (!isEnabled()) return true;
@SuppressWarnings("UseOfObsoleteCollectionType")
Hashtable<Integer, JComponent> sliderLabels = new Hashtable<>();
for (int i = 0; i < modifiers.length; i++) {
sliderLabels.put(i + 1, new JLabel(getPresentableText(modifiers[i])));
}
JSlider slider = new JSlider(SwingConstants.VERTICAL, 1, modifiers.length, 1);
slider.addChangeListener(val -> {
final String modifier = modifiers[slider.getValue() - 1];
setter.consume(modifier);
setText(getPresentableText(modifier));
fireStateChanged();
});
slider.setLabelTable(sliderLabels);
slider.putClientProperty(UIUtil.JSLIDER_ISFILLED, Boolean.TRUE);
slider.setPreferredSize(JBUI.size(150, modifiers.length * 25));
slider.setPaintLabels(true);
slider.setSnapToTicks(true);
slider.setValue(ArrayUtil.find(modifiers, visibilityProducer.produce()) + 1);
final JBPopup popup = JBPopupFactory.getInstance()
.createComponentPopupBuilder(slider, null)
.setTitle("Effective Visibility")
.setCancelOnClickOutside(true)
.setMovable(true)
.createPopup();
popup.show(new RelativePoint(MyLabel.this, new Point(getWidth(), 0)));
return true;
}
}.installOn(this);
}
@Override
public void setForeground(Color fg) {
super.setForeground(isEnabled() ? UI.getColor("link.foreground") : fg);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled && myCanBeEnabled.get());
}
@Override
public void addChangeListener(ChangeListener changeListener) {
myListeners.add(changeListener);
}
@Override
public void removeChangeListener(ChangeListener changeListener) {
myListeners.remove(changeListener);
}
}
@Override
@Nullable
public JComponent createOptionsPanel() {
@@ -0,0 +1,143 @@
/*
* Copyright 2000-2017 JetBrains s.r.o.
*
* 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.intellij.codeInspection.unusedSymbol;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiModifier;
import com.intellij.ui.ClickListener;
import com.intellij.ui.UI;
import com.intellij.ui.UserActivityProviderComponent;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Consumer;
import com.intellij.util.VisibilityUtil;
import com.intellij.util.containers.HashSet;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.util.Hashtable;
import java.util.Set;
import java.util.function.Supplier;
public class VisibilityModifierChooser extends JLabel implements UserActivityProviderComponent {
@PsiModifier.ModifierConstant private static final String[] MODIFIERS =
new String[]{PsiModifier.PRIVATE, PsiModifier.PACKAGE_LOCAL, PsiModifier.PROTECTED, PsiModifier.PUBLIC};
private final Supplier<Boolean> myCanBeEnabled;
private final Set<ChangeListener> myListeners = new HashSet<>();
private String myCurrentModifier;
public VisibilityModifierChooser(@NotNull Supplier<Boolean> canBeEnabled,
@NotNull String modifier,
@NotNull Consumer<String> modifierChangedConsumer) {
this(canBeEnabled, modifier, modifierChangedConsumer, MODIFIERS);
}
@Override
public void setText(String text) {
super.setText(text);
}
public VisibilityModifierChooser(@NotNull Supplier<Boolean> canBeEnabled,
@NotNull String modifier,
@NotNull Consumer<String> modifierChangedConsumer,
@NotNull String[] modifiers) {
myCanBeEnabled = canBeEnabled;
setIcon(AllIcons.General.Combo2);
setDisabledIcon(AllIcons.General.Combo2);
setIconTextGap(0);
setHorizontalTextPosition(SwingConstants.LEFT);
myCurrentModifier = modifier;
setText(getPresentableText(myCurrentModifier));
new ClickListener() {
@Override
public boolean onClick(@NotNull MouseEvent e, int clickCount) {
if (!isEnabled()) return true;
@SuppressWarnings("UseOfObsoleteCollectionType")
Hashtable<Integer, JComponent> sliderLabels = new Hashtable<>();
for (int i = 0; i < modifiers.length; i++) {
sliderLabels.put(i + 1, new JLabel(getPresentableText(modifiers[i])));
}
JSlider slider = new JSlider(SwingConstants.VERTICAL, 1, modifiers.length, 1);
slider.addChangeListener(val -> {
final String modifier = modifiers[slider.getValue() - 1];
if (myCurrentModifier != modifier) {
myCurrentModifier = modifier;
modifierChangedConsumer.consume(modifier);
setText(getPresentableText(modifier));
fireStateChanged();
}
});
slider.setLabelTable(sliderLabels);
slider.putClientProperty(UIUtil.JSLIDER_ISFILLED, Boolean.TRUE);
slider.setPreferredSize(JBUI.size(150, modifiers.length * 25));
slider.setPaintLabels(true);
slider.setSnapToTicks(true);
slider.setValue(ArrayUtil.find(modifiers, myCurrentModifier) + 1);
final JBPopup popup = JBPopupFactory.getInstance()
.createComponentPopupBuilder(slider, null)
.setTitle("Effective Visibility")
.setCancelOnClickOutside(true)
.setMovable(true)
.createPopup();
popup.show(new RelativePoint(VisibilityModifierChooser.this, new Point(getWidth(), 0)));
return true;
}
}.installOn(this);
}
private void fireStateChanged() {
for (ChangeListener listener : myListeners) {
listener.stateChanged(new ChangeEvent(this));
}
}
private static String getPresentableText(String modifier) {
return StringUtil.capitalize(VisibilityUtil.toPresentableText(modifier));
}
@Override
public void setForeground(Color fg) {
super.setForeground(isEnabled() ? UI.getColor("link.foreground") : fg);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled && myCanBeEnabled.get());
}
@Override
public void addChangeListener(ChangeListener changeListener) {
myListeners.add(changeListener);
}
@Override
public void removeChangeListener(ChangeListener changeListener) {
myListeners.remove(changeListener);
}
}