mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
actual parameter is the same value inspection: add option to ignore method by visibility
This commit is contained in:
+22
-1
@@ -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);
|
||||
|
||||
+22
-124
@@ -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() {
|
||||
|
||||
+143
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user