diff --git a/java/java-analysis-api/resources/messages/JavaAnalysisBundle.properties b/java/java-analysis-api/resources/messages/JavaAnalysisBundle.properties index 11d536d6f5ad..d69eb924bbd0 100644 --- a/java/java-analysis-api/resources/messages/JavaAnalysisBundle.properties +++ b/java/java-analysis-api/resources/messages/JavaAnalysisBundle.properties @@ -349,7 +349,7 @@ inspection.visibility.compose.suggestion=Can be {0} inspection.visibility.option.constants=Suggest weaker visibility for constants inspection.visibility.option.package.private.members=Suggest package-private visibility level for class members inspection.visibility.package.private.top.level.classes=Suggest package-private visibility level for top-level classes -inspection.visibility.private.inner.members=Suggest private for inner class members when referenced from outer class only +inspection.visibility.private.inner.members=Suggest private for inner class members when referenced from outer class only instance.member.guarded.by.static.0.loc=Instance member guarded by static "{0}" #loc instance.member.guarded.by.static.ref.loc=Instance member guarded by static #ref #loc make.0.default.annotation=Make "{0}" default annotation diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/visibility/VisibilityInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/visibility/VisibilityInspection.java index 137100c06e9e..e9d55407f53a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/visibility/VisibilityInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/visibility/VisibilityInspection.java @@ -6,8 +6,9 @@ import com.intellij.codeInsight.daemon.impl.IdentifierUtil; import com.intellij.codeInspection.*; import com.intellij.codeInspection.ex.EntryPointsManager; import com.intellij.codeInspection.ex.EntryPointsManagerBase; +import com.intellij.codeInspection.options.OptComponent; +import com.intellij.codeInspection.options.OptPane; import com.intellij.codeInspection.reference.*; -import com.intellij.codeInspection.ui.InspectionOptionsPanel; import com.intellij.codeInspection.util.IntentionName; import com.intellij.java.analysis.JavaAnalysisBundle; import com.intellij.lang.java.JavaLanguage; @@ -24,6 +25,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.usageView.UsageViewTypeLocation; import com.intellij.util.ObjectUtils; import com.intellij.util.VisibilityUtil; +import com.intellij.util.containers.ContainerUtil; import one.util.streamex.StreamEx; import org.jdom.Element; import org.jetbrains.annotations.NonNls; @@ -31,11 +33,13 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import javax.swing.*; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; +import static com.intellij.codeInspection.options.OptPane.checkbox; + public final class VisibilityInspection extends GlobalJavaBatchInspectionTool { private static final ExtensionPointName EP_NAME = new ExtensionPointName<>("com.intellij.visibility"); @@ -47,55 +51,46 @@ public final class VisibilityInspection extends GlobalJavaBatchInspectionTool { private final Map myExtensions = new TreeMap<>(); @NonNls public static final String SHORT_NAME = "WeakerAccess"; - private final class OptionsPanel extends InspectionOptionsPanel { - private final JCheckBox myPackageLocalForMembersCheckbox; - private final JCheckBox myPrivateForInnersCheckbox; - private final JCheckBox myPackageLocalForTopClassesCheckbox; - private final JCheckBox mySuggestForConstantsCheckbox; - - private OptionsPanel() { - myPackageLocalForMembersCheckbox = new JCheckBox(JavaAnalysisBundle.message("inspection.visibility.option.package.private.members")); - myPackageLocalForMembersCheckbox.setSelected(SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS); - myPackageLocalForMembersCheckbox.getModel().addItemListener( - e -> SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = myPackageLocalForMembersCheckbox.isSelected()); - - add(myPackageLocalForMembersCheckbox); - - myPackageLocalForTopClassesCheckbox = new JCheckBox(JavaAnalysisBundle.message( - "inspection.visibility.package.private.top.level.classes")); - myPackageLocalForTopClassesCheckbox.setSelected(SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES); - myPackageLocalForTopClassesCheckbox.getModel().addItemListener( - e -> SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = myPackageLocalForTopClassesCheckbox.isSelected()); - - add(myPackageLocalForTopClassesCheckbox); - - myPrivateForInnersCheckbox = new JCheckBox(JavaAnalysisBundle.message("inspection.visibility.private.inner.members")); - myPrivateForInnersCheckbox.setSelected(SUGGEST_PRIVATE_FOR_INNERS); - myPrivateForInnersCheckbox.getModel().addItemListener(e -> SUGGEST_PRIVATE_FOR_INNERS = myPrivateForInnersCheckbox.isSelected()); - - add(myPrivateForInnersCheckbox); - - mySuggestForConstantsCheckbox = new JCheckBox(JavaAnalysisBundle.message("inspection.visibility.option.constants")); - mySuggestForConstantsCheckbox.setSelected(SUGGEST_FOR_CONSTANTS); - mySuggestForConstantsCheckbox.getModel().addItemListener( - e -> SUGGEST_FOR_CONSTANTS = mySuggestForConstantsCheckbox.isSelected()); - - add(mySuggestForConstantsCheckbox); - - for (EntryPoint entryPoint : EntryPointsManagerBase.DEAD_CODE_EP_NAME.getExtensions()) { - if (entryPoint instanceof EntryPointWithVisibilityLevel) { - final JCheckBox checkBox = new JCheckBox(((EntryPointWithVisibilityLevel)entryPoint).getTitle()); - checkBox.setSelected(isEntryPointEnabled((EntryPointWithVisibilityLevel)entryPoint)); - checkBox.addActionListener(e -> myExtensions.put(((EntryPointWithVisibilityLevel)entryPoint).getId(), checkBox.isSelected())); - add(checkBox); - } + @Override + public @NotNull OptPane getOptionsPane() { + List checkboxes = new ArrayList<>(List.of( + checkbox("SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS", JavaAnalysisBundle.message("inspection.visibility.option.package.private.members")), + checkbox("SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES", JavaAnalysisBundle.message( + "inspection.visibility.package.private.top.level.classes")), + checkbox("SUGGEST_PRIVATE_FOR_INNERS", JavaAnalysisBundle.message("inspection.visibility.private.inner.members")), + checkbox("SUGGEST_FOR_CONSTANTS", JavaAnalysisBundle.message("inspection.visibility.option.constants")) + )); + for (EntryPoint entryPoint : EntryPointsManagerBase.DEAD_CODE_EP_NAME.getExtensions()) { + if (entryPoint instanceof EntryPointWithVisibilityLevel epWithLevel) { + checkboxes.add(checkbox(epWithLevel.getId(), epWithLevel.getTitle())); } } + return new OptPane(checkboxes); + } + + private static @Nullable EntryPointWithVisibilityLevel findById(@NotNull String bindId) { + return (EntryPointWithVisibilityLevel)ContainerUtil.find(EntryPointsManagerBase.DEAD_CODE_EP_NAME.getExtensionList(), + entryPoint -> entryPoint instanceof EntryPointWithVisibilityLevel epWithLevel && + epWithLevel.getId().equals(bindId)); } @Override - public JComponent createOptionsPanel() { - return new OptionsPanel(); + public Object getOption(@NotNull String bindId) { + EntryPointWithVisibilityLevel ep = findById(bindId); + if (ep != null) { + return isEntryPointEnabled(ep); + } + return super.getOption(bindId); + } + + @Override + public void setOption(@NotNull String bindId, Object value) { + EntryPointWithVisibilityLevel ep = findById(bindId); + if (ep != null) { + myExtensions.put(bindId, (Boolean)value); + } else { + super.setOption(bindId, value); + } } @NotNull