[codeInspection.ui] Decouple custom inspection logic from SSR plugin

#IDEA-335948 Fixed

GitOrigin-RevId: dff86a1b7edb287851590ea5d573362629dd8931
This commit is contained in:
Louis Vignier
2023-10-23 15:56:35 +02:00
committed by intellij-monorepo-bot
parent 8059da5afb
commit 14259dc0e0
13 changed files with 243 additions and 170 deletions

View File

@@ -29,6 +29,7 @@
<lang.parserDefinition language="JSUnicodeRegexp" implementationClass="org.intellij.lang.regexp.ecmascript.EcmaScriptUnicodeRegexpParserDefinition"/>
<lang.syntaxHighlighterFactory language="JSRegexp"
implementationClass="org.intellij.lang.regexp.ecmascript.EcmaScriptRegExpSyntaxHighlighterFactory"/>
<inspectionProfileActionProvider implementation="org.intellij.lang.regexp.inspection.custom.RegExpProfileActionProvider" />
<intentionAction>
<className>org.intellij.lang.regexp.intention.CheckRegExpIntentionAction</className>

View File

@@ -1,6 +1,8 @@
action.add.pattern.text=Add Pattern\u2026
action.add.regexp.replace.template.text=Add RegExp Replace Template\u2026
action.add.regexp.search.template.text=Add RegExp Search Template\u2026
action.add.regexp.replace.inspection.text=Add RegExp Replace Inspection\u2026
action.add.regexp.search.inspection.text=Add RegExp Search Inspection\u2026
button.enable.replace=Enable Replace
button.search.only=Search Only
checker.sample.text=Sample Text

View File

@@ -19,6 +19,7 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.profile.codeInspection.InspectionProfileManager;
import com.intellij.profile.codeInspection.ui.CustomInspectionActions;
import com.intellij.profile.codeInspection.ui.InspectionMetaDataDialog;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
@@ -42,32 +43,8 @@ public class CustomRegExpInspection extends LocalInspectionTool implements Dynam
public final List<RegExpInspectionConfiguration> myConfigurations = new SmartList<>();
private InspectionProfileImpl mySessionProfile;
public CustomRegExpInspection() {
/*
final FileType javaFileType = FileTypeManager.getInstance().getStdFileType("JAVA");
final RegExpInspectionConfiguration one = new RegExpInspectionConfiguration("No spaces within parentheses");
one.patterns.add(new RegExpInspectionConfiguration.InspectionPattern("(\\()\\s+|\\s+(\\))", null, FindModel.SearchContext.EXCEPT_COMMENTS_AND_STRING_LITERALS, "$1"));
one.suppressId = "NoSpaces";
one.description = "We don't like spaces within parentheses in our code style";
myConfigurations.add(one);
final RegExpInspectionConfiguration two = new RegExpInspectionConfiguration("No more than one empty line in Java");
two.patterns.add(new RegExpInspectionConfiguration.InspectionPattern("\\n\\n\\n+", javaFileType, FindModel.SearchContext.EXCEPT_STRING_LITERALS, "\n\n"));
two.suppressId = "EmptyLines";
two.description = "One empty line should be enough for everybody";
myConfigurations.add(two);
final RegExpInspectionConfiguration three = new RegExpInspectionConfiguration("Trailing whitespace");
three.patterns.add(new RegExpInspectionConfiguration.InspectionPattern(" +\\n", PlainTextFileType.INSTANCE, FindModel.SearchContext.ANY, ""));
three.patterns.add(new RegExpInspectionConfiguration.InspectionPattern("\t+\\n", PlainTextFileType.INSTANCE, FindModel.SearchContext.ANY, ""));
three.description = "Trailing whitespace is unnecessary";
myConfigurations.add(three);
final RegExpInspectionConfiguration four = new RegExpInspectionConfiguration("Multiple spaces in Java");
four.patterns.add(new RegExpInspectionConfiguration.InspectionPattern("(?<=\\S) {2,}", javaFileType, FindModel.SearchContext.EXCEPT_COMMENTS, " "));
four.description = "Double spaced";
myConfigurations.add(four);
*/
public static CustomRegExpInspection getCustomRegExpInspection(@NotNull InspectionProfile profile) {
return (CustomRegExpInspection)CustomInspectionActions.getInspection(profile, SHORT_NAME);
}
@Override

View File

@@ -0,0 +1,82 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.intellij.lang.regexp.inspection.custom;
import com.intellij.codeInspection.InspectionProfileEntry;
import com.intellij.codeInspection.ex.InspectionProfileModifiableModel;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NlsActions;
import com.intellij.profile.codeInspection.ui.InspectionMetaDataDialog;
import com.intellij.profile.codeInspection.ui.InspectionProfileActionProvider;
import com.intellij.profile.codeInspection.ui.SingleInspectionProfilePanel;
import org.intellij.lang.regexp.RegExpBundle;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class RegExpProfileActionProvider extends InspectionProfileActionProvider {
@Override
public @NotNull List<AnAction> getAddActions(@NotNull SingleInspectionProfilePanel panel) {
return List.of(
new AddCustomRegExpInspectionAction(panel, RegExpBundle.message("action.add.regexp.search.inspection.text"), false),
new AddCustomRegExpInspectionAction(panel, RegExpBundle.message("action.add.regexp.replace.inspection.text"), true)
);
}
static final class AddCustomRegExpInspectionAction extends DumbAwareAction {
private final SingleInspectionProfilePanel myPanel;
private final boolean myReplace;
AddCustomRegExpInspectionAction(@NotNull SingleInspectionProfilePanel panel, @NlsActions.ActionText String text, boolean replace) {
super(text);
myPanel = panel;
myReplace = replace;
}
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
final RegExpDialog dialog = new RegExpDialog(e.getProject(), true, myReplace ? RegExpInspectionConfiguration.InspectionPattern.EMPTY_REPLACE_PATTERN : null);
if (!dialog.showAndGet()) return;
final RegExpInspectionConfiguration.InspectionPattern pattern = dialog.getPattern();
final InspectionProfileModifiableModel profile = myPanel.getProfile();
final CustomRegExpInspection inspection = CustomRegExpInspection.getCustomRegExpInspection(profile);
final Project project = e.getData(CommonDataKeys.PROJECT);
if (project == null) return;
final InspectionMetaDataDialog metaDataDialog = inspection.createMetaDataDialog(project, null);
if (pattern.replacement() != null) {
metaDataDialog.showCleanupOption(false);
}
if (!metaDataDialog.showAndGet()) return;
final RegExpInspectionConfiguration configuration = new RegExpInspectionConfiguration(metaDataDialog.getName());
configuration.addPattern(pattern);
configuration.setDescription(metaDataDialog.getDescription());
configuration.setSuppressId(metaDataDialog.getSuppressId());
configuration.setProblemDescriptor(metaDataDialog.getProblemDescriptor());
configuration.setCleanup(metaDataDialog.isCleanup());
configuration.setUuid(null);
inspection.addConfiguration(configuration);
CustomRegExpInspection.addInspectionToProfile(project, profile, configuration);
profile.setModified(true);
profile.getProfileManager().fireProfileChanged(profile);
myPanel.selectInspectionTool(configuration.getUuid());
}
}
@Override
public boolean canDeleteInspection(InspectionProfileEntry entry) {
return entry instanceof CustomRegExpInspection;
}
@Override
public void deleteInspection(InspectionProfileEntry entry, String shortName) {
if (entry instanceof CustomRegExpInspection regExpInspection) {
regExpInspection.removeConfigurationWithUuid(shortName);
}
}
}

View File

@@ -334,6 +334,8 @@ label.description=&Description:
label.problem.tool.tip=Problem &tool tip (use macro #ref to insert highlighted code):
label.suppress.id=&Suppress ID:
unnamed.inspection=Unnamed inspection
add.inspection.button=Add Custom Inspection
remove.inspection.button=Remove Custom Inspection
long.range.set.presentation.empty=unknown
long.range.set.presentation.any=any value

View File

@@ -0,0 +1,91 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.profile.codeInspection.ui;
import com.intellij.codeInspection.InspectionProfile;
import com.intellij.codeInspection.InspectionProfileEntry;
import com.intellij.codeInspection.InspectionsBundle;
import com.intellij.codeInspection.ex.InspectionProfileImpl;
import com.intellij.codeInspection.ex.InspectionProfileModifiableModel;
import com.intellij.codeInspection.ex.InspectionToolWrapper;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class CustomInspectionActions {
@Nullable
public static ActionGroup getAddActionGroup(SingleInspectionProfilePanel panel) {
final DefaultActionGroup actionGroup = new DefaultActionGroup();
var addActions = ContainerUtil.flatMap(
InspectionProfileActionProvider.EP_NAME.getExtensionList(),
provider -> provider.getAddActions(panel)
);
if (addActions.isEmpty()) return null;
actionGroup.addAll(addActions);
actionGroup.setPopup(true);
actionGroup.registerCustomShortcutSet(CommonShortcuts.getNew(), panel);
final Presentation presentation = actionGroup.getTemplatePresentation();
presentation.setIcon(AllIcons.General.Add);
presentation.setText(InspectionsBundle.messagePointer("add.inspection.button"));
return actionGroup;
}
public static final class RemoveInspectionAction extends DumbAwareAction {
private final SingleInspectionProfilePanel myPanel;
RemoveInspectionAction(@NotNull SingleInspectionProfilePanel panel) {
super(InspectionsBundle.message("remove.inspection.button"), null, AllIcons.General.Remove);
myPanel = panel;
registerCustomShortcutSet(CommonShortcuts.getDelete(), myPanel);
}
@Override
public void update(@NotNull AnActionEvent e) {
final InspectionToolWrapper<?, ?> selectedTool = myPanel.getSelectedTool();
e.getPresentation().setEnabled(
selectedTool != null &&
selectedTool.getMainToolId() != null &&
ContainerUtil.exists(InspectionProfileActionProvider.EP_NAME.getExtensionList(),
actionProvider -> actionProvider.canDeleteInspection(getInspection(myPanel.getProfile(),
selectedTool.getMainToolId())))
);
}
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.EDT;
}
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
final InspectionToolWrapper<?, ?> selectedTool = myPanel.getSelectedTool();
final String shortName = selectedTool.getShortName();
final String mainToolId = selectedTool.getMainToolId();
myPanel.removeSelectedRow();
final InspectionProfileModifiableModel profile = myPanel.getProfile();
final InspectionProfileEntry inspection = getInspection(profile, mainToolId);
InspectionProfileActionProvider.EP_NAME.getExtensionList().forEach(actionProvider -> {
if (actionProvider.canDeleteInspection(inspection)) {
actionProvider.deleteInspection(inspection, shortName);
}
});
profile.removeTool(selectedTool);
profile.setModified(true);
fireProfileChanged(profile);
}
}
public static InspectionProfileEntry getInspection(@NotNull InspectionProfile profile, @NonNls String shortName) {
final InspectionToolWrapper<?, ?> wrapper = profile.getInspectionTool(shortName, (Project)null);
assert wrapper != null;
return wrapper.getTool();
}
public static void fireProfileChanged(@NotNull InspectionProfileImpl profile) {
profile.getProfileManager().fireProfileChanged(profile);
}
}

View File

@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.profile.codeInspection.ui;
import com.intellij.codeInspection.InspectionProfileEntry;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.extensions.ExtensionPointName;
import org.jetbrains.annotations.NotNull;
@@ -20,8 +21,30 @@ public abstract class InspectionProfileActionProvider {
ExtensionPointName.create("com.intellij.inspectionProfileActionProvider");
/**
* @return additional actions to render in the given inspection profile panel
* @return additional actions to render in the given inspection profile panel.
*/
@NotNull
public abstract List<AnAction> getActions(@NotNull SingleInspectionProfilePanel panel);
public List<AnAction> getActions(@NotNull SingleInspectionProfilePanel panel) {
return List.of();
}
/**
* @return actions to add custom inspections in the given inspection profile panel.
*/
@NotNull
public List<AnAction> getAddActions(@NotNull SingleInspectionProfilePanel panel) {
return List.of();
}
/**
* @return true if this extension can delete the inspection corresponding to the given entry.
*/
public boolean canDeleteInspection(InspectionProfileEntry entry) {
return false;
}
/**
* Called when an inspection entry has been deleted.
*/
public void deleteInspection(InspectionProfileEntry entry, String shortName) {}
}

View File

@@ -495,6 +495,11 @@ public class SingleInspectionProfilePanel extends JPanel {
postProcessModification();
}
});
final var customAdd = CustomInspectionActions.getAddActionGroup(this);
if (customAdd != null) {
actions.add(customAdd);
actions.add(new CustomInspectionActions.RemoveInspectionAction(this));
}
for (InspectionProfileActionProvider provider : InspectionProfileActionProvider.EP_NAME.getExtensionList()) {
for (AnAction action : provider.getActions(this)) {
actions.add(action);

View File

@@ -296,8 +296,6 @@ structural.search.group.name=Structural search
edit.metadata.button=Edit Metadata\u2026
add.pattern.action=Add Template
templates.title=Templates:
add.inspection.button=Add Custom Inspection
remove.inspection.button=Remove Custom Inspection
meta.data.dialog.title=Structural Search Inspection
inspection.name.label=Inspection name:
@@ -339,5 +337,3 @@ inspection.tree.create.inspection.search.template=Using a Structural Search Temp
inspection.tree.create.inspection.replace.template=Using a Structural Replace Template\u2026
inspection.tree.group.description=Use the + button in the toolbar to create a new Structural Search inspection.<br>\
Structural Search inspections highlight code snippets matching the specified search template. A quick-fix can be provided by adding a replace template.
action.add.regexp.replace.inspection.text=Add RegExp Replace Inspection\u2026
action.add.regexp.search.inspection.text=Add RegExp Search Inspection\u2026

View File

@@ -1,18 +1,11 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.structuralsearch.inspection;
import com.intellij.codeInspection.InspectionProfile;
import com.intellij.codeInspection.InspectionProfileEntry;
import com.intellij.codeInspection.InspectionsBundle;
import com.intellij.codeInspection.ex.InspectionProfileImpl;
import com.intellij.codeInspection.ex.InspectionProfileModifiableModel;
import com.intellij.codeInspection.ex.InspectionToolWrapper;
import com.intellij.openapi.project.Project;
import com.intellij.profile.codeInspection.ui.SingleInspectionProfilePanel;
import com.intellij.structuralsearch.SSRBundle;
import com.intellij.util.ui.UIUtil;
import org.intellij.lang.regexp.inspection.custom.CustomRegExpInspection;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
@@ -24,21 +17,6 @@ public final class InspectionProfileUtil {
private InspectionProfileUtil() {}
@NotNull
public static SSBasedInspection getStructuralSearchInspection(@NotNull InspectionProfile profile) {
return (SSBasedInspection)getInspection(profile, SSBasedInspection.SHORT_NAME);
}
public static CustomRegExpInspection getCustomRegExpInspection(@NotNull InspectionProfile profile) {
return (CustomRegExpInspection)getInspection(profile, CustomRegExpInspection.SHORT_NAME);
}
public static InspectionProfileEntry getInspection(@NotNull InspectionProfile profile, @NonNls String shortName) {
final InspectionToolWrapper<?, ?> wrapper = profile.getInspectionTool(shortName, (Project)null);
assert wrapper != null;
return wrapper.getTool();
}
public static InspectionProfileModifiableModel getInspectionProfile(@NotNull Component c) {
final SingleInspectionProfilePanel panel = UIUtil.uiParents(c, true).filter(SingleInspectionProfilePanel.class).first();
if (panel == null) return null;
@@ -48,8 +26,4 @@ public final class InspectionProfileUtil {
public static String[] getGroup() {
return new String[] {InspectionsBundle.message("group.names.user.defined"), SSRBundle.message("structural.search.group.name")};
}
public static void fireProfileChanged(@NotNull InspectionProfileImpl profile) {
profile.getProfileManager().fireProfileChanged(profile);
}
}

View File

@@ -23,6 +23,7 @@ import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.util.text.NaturalComparator;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.profile.codeInspection.InspectionProfileManager;
import com.intellij.profile.codeInspection.ui.CustomInspectionActions;
import com.intellij.profile.codeInspection.ui.InspectionMetaDataDialog;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
@@ -77,6 +78,11 @@ public class SSBasedInspection extends LocalInspectionTool implements DynamicGro
private final Set<String> myProblemsReported = new HashSet<>(1);
private InspectionProfileImpl mySessionProfile;
@NotNull
public static SSBasedInspection getStructuralSearchInspection(@NotNull InspectionProfile profile) {
return (SSBasedInspection)CustomInspectionActions.getInspection(profile, SHORT_NAME);
}
@Override
public void writeSettings(@NotNull Element node) throws WriteExternalException {
if (myWriteSorted) {

View File

@@ -13,6 +13,7 @@ import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.profile.codeInspection.ui.CustomInspectionActions;
import com.intellij.profile.codeInspection.ui.InspectionMetaDataDialog;
import com.intellij.structuralsearch.SSRBundle;
import com.intellij.structuralsearch.plugin.replace.ui.ReplaceConfiguration;
@@ -180,7 +181,7 @@ public class StructuralSearchFakeInspection extends LocalInspectionTool {
if (profile == null) {
return;
}
final SSBasedInspection inspection = InspectionProfileUtil.getStructuralSearchInspection(profile);
final SSBasedInspection inspection = SSBasedInspection.getStructuralSearchInspection(profile);
final InspectionMetaDataDialog dialog = inspection.createMetaDataDialog(project, myMainConfiguration);
if (isCleanupAllowed()) {
dialog.showCleanupOption(myMainConfiguration.isCleanup());
@@ -199,7 +200,7 @@ public class StructuralSearchFakeInspection extends LocalInspectionTool {
inspection.removeConfigurationsWithUuid(myMainConfiguration.getUuid());
inspection.addConfigurations(myConfigurations);
profile.setModified(true);
InspectionProfileUtil.fireProfileChanged(profile);
CustomInspectionActions.fireProfileChanged(profile);
}
private void performMove(@NotNull JList<Configuration> list, boolean up) {
@@ -293,7 +294,7 @@ public class StructuralSearchFakeInspection extends LocalInspectionTool {
private void saveChangesToProfile(@NotNull JList<Configuration> list) {
final InspectionProfileModifiableModel profile = InspectionProfileUtil.getInspectionProfile(list);
if (profile == null) return;
final SSBasedInspection inspection = InspectionProfileUtil.getStructuralSearchInspection(profile);
final SSBasedInspection inspection = SSBasedInspection.getStructuralSearchInspection(profile);
inspection.removeConfigurationsWithUuid(myMainConfiguration.getUuid());
inspection.addConfigurations(myConfigurations);
profile.setModified(true);
@@ -331,7 +332,7 @@ public class StructuralSearchFakeInspection extends LocalInspectionTool {
final InspectionProfileModifiableModel profile = InspectionProfileUtil.getInspectionProfile(myList);
if (profile == null) return;
if (InspectionProfileUtil.getStructuralSearchInspection(profile).addConfiguration(configuration)) {
if (SSBasedInspection.getStructuralSearchInspection(profile).addConfiguration(configuration)) {
myConfigurations.add(configuration);
model.fireContentsChanged(myList);
myList.setSelectedIndex(size);

View File

@@ -7,13 +7,14 @@ import com.intellij.codeInspection.ex.InspectionProfileImpl;
import com.intellij.codeInspection.ex.InspectionProfileModifiableModel;
import com.intellij.codeInspection.ex.InspectionToolWrapper;
import com.intellij.codeInspection.ex.ScopeToolState;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NlsActions;
import com.intellij.profile.codeInspection.InspectionProfileManager;
import com.intellij.profile.codeInspection.ui.CustomInspectionActions;
import com.intellij.profile.codeInspection.ui.InspectionMetaDataDialog;
import com.intellij.profile.codeInspection.ui.InspectionProfileActionProvider;
import com.intellij.profile.codeInspection.ui.SingleInspectionProfilePanel;
@@ -22,13 +23,8 @@ import com.intellij.structuralsearch.plugin.replace.ui.ReplaceConfiguration;
import com.intellij.structuralsearch.plugin.ui.Configuration;
import com.intellij.structuralsearch.plugin.ui.SearchContext;
import com.intellij.structuralsearch.plugin.ui.StructuralSearchDialog;
import org.intellij.lang.regexp.inspection.custom.CustomRegExpInspection;
import org.intellij.lang.regexp.inspection.custom.CustomRegExpInspectionToolWrapper;
import org.intellij.lang.regexp.inspection.custom.RegExpDialog;
import org.intellij.lang.regexp.inspection.custom.RegExpInspectionConfiguration;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -37,24 +33,6 @@ import java.util.List;
*/
public class StructuralSearchProfileActionProvider extends InspectionProfileActionProvider {
@NotNull
@Override
public List<AnAction> getActions(@NotNull SingleInspectionProfilePanel panel) {
enableSSIfDisabled(panel.getProfile(), panel.getProject());
final DefaultActionGroup actionGroup = new DefaultActionGroup(
new AddInspectionAction(panel, SSRBundle.message("SSRInspection.add.search.template.button"), false),
new AddInspectionAction(panel, SSRBundle.message("SSRInspection.add.replace.template.button"), true),
new AddCustomRegExpInspectionAction(panel, SSRBundle.message("action.add.regexp.search.inspection.text"), false),
new AddCustomRegExpInspectionAction(panel, SSRBundle.message("action.add.regexp.replace.inspection.text"), true)
);
actionGroup.setPopup(true);
actionGroup.registerCustomShortcutSet(CommonShortcuts.getNew(), panel);
final Presentation presentation = actionGroup.getTemplatePresentation();
presentation.setIcon(AllIcons.General.Add);
presentation.setText(SSRBundle.messagePointer("add.inspection.button"));
return Arrays.asList(actionGroup, new RemoveInspectionAction(panel));
}
private static void enableSSIfDisabled(@NotNull InspectionProfileModifiableModel profile, @NotNull Project project) {
if (profile.getToolsOrNull(SSBasedInspection.SHORT_NAME, null) != null &&
!profile.isToolEnabled(HighlightDisplayKey.find(SSBasedInspection.SHORT_NAME))) {
@@ -69,90 +47,25 @@ public class StructuralSearchProfileActionProvider extends InspectionProfileActi
}
}
private static final class RemoveInspectionAction extends DumbAwareAction {
private final SingleInspectionProfilePanel myPanel;
private RemoveInspectionAction(@NotNull SingleInspectionProfilePanel panel) {
super(SSRBundle.message("remove.inspection.button"), null, AllIcons.General.Remove);
myPanel = panel;
registerCustomShortcutSet(CommonShortcuts.getDelete(), myPanel);
@Override
public @NotNull List<AnAction> getAddActions(@NotNull SingleInspectionProfilePanel panel) {
enableSSIfDisabled(panel.getProfile(), panel.getProject());
return List.of(
new AddInspectionAction(panel, SSRBundle.message("SSRInspection.add.search.template.button"), false),
new AddInspectionAction(panel, SSRBundle.message("SSRInspection.add.replace.template.button"), true)
);
}
@Override
public void update(@NotNull AnActionEvent e) {
final InspectionToolWrapper<?, ?> selectedTool = myPanel.getSelectedTool();
e.getPresentation().setEnabled(selectedTool instanceof CustomRegExpInspectionToolWrapper ||
selectedTool instanceof StructuralSearchInspectionToolWrapper);
public boolean canDeleteInspection(InspectionProfileEntry entry) {
return entry instanceof SSBasedInspection;
}
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.EDT;
}
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
final InspectionToolWrapper<?, ?> selectedTool = myPanel.getSelectedTool();
final String shortName = selectedTool.getShortName();
final String mainToolId = selectedTool.getMainToolId();
myPanel.removeSelectedRow();
final InspectionProfileModifiableModel profile = myPanel.getProfile();
final InspectionProfileEntry inspection = InspectionProfileUtil.getInspection(profile, mainToolId);
if (inspection instanceof SSBasedInspection ssBasedInspection) {
public void deleteInspection(InspectionProfileEntry entry, String shortName) {
if (entry instanceof SSBasedInspection ssBasedInspection) {
ssBasedInspection.removeConfigurationsWithUuid(shortName);
}
else if (inspection instanceof CustomRegExpInspection customRegExpInspection) {
customRegExpInspection.removeConfigurationWithUuid(shortName);
}
profile.removeTool(selectedTool);
profile.setModified(true);
InspectionProfileUtil.fireProfileChanged(profile);
}
}
static final class AddCustomRegExpInspectionAction extends DumbAwareAction {
private final SingleInspectionProfilePanel myPanel;
private final boolean myReplace;
AddCustomRegExpInspectionAction(@NotNull SingleInspectionProfilePanel panel, @NlsActions.ActionText String text, boolean replace) {
super(text);
myPanel = panel;
myReplace = replace;
}
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
final RegExpDialog dialog = new RegExpDialog(e.getProject(), true, myReplace ? RegExpInspectionConfiguration.InspectionPattern.EMPTY_REPLACE_PATTERN : null);
if (myReplace) {
// do something?
}
if (!dialog.showAndGet()) return;
final RegExpInspectionConfiguration.InspectionPattern pattern = dialog.getPattern();
final InspectionProfileModifiableModel profile = myPanel.getProfile();
final CustomRegExpInspection inspection = InspectionProfileUtil.getCustomRegExpInspection(profile);
final Project project = e.getData(CommonDataKeys.PROJECT);
if (project == null) return;
final InspectionMetaDataDialog metaDataDialog = inspection.createMetaDataDialog(project, null);
if (pattern.replacement() != null) {
metaDataDialog.showCleanupOption(false);
}
if (!metaDataDialog.showAndGet()) return;
final RegExpInspectionConfiguration configuration = new RegExpInspectionConfiguration(metaDataDialog.getName());
configuration.addPattern(pattern);
configuration.setDescription(metaDataDialog.getDescription());
configuration.setSuppressId(metaDataDialog.getSuppressId());
configuration.setProblemDescriptor(metaDataDialog.getProblemDescriptor());
configuration.setCleanup(metaDataDialog.isCleanup());
configuration.setUuid(null);
inspection.addConfiguration(configuration);
CustomRegExpInspection.addInspectionToProfile(project, profile, configuration);
profile.setModified(true);
InspectionProfileUtil.fireProfileChanged(profile);
myPanel.selectInspectionTool(configuration.getUuid());
}
}
static final class AddInspectionAction extends DumbAwareAction {
@@ -187,7 +100,7 @@ public class StructuralSearchProfileActionProvider extends InspectionProfileActi
public static boolean createNewInspection(@NotNull Configuration configuration,
@NotNull Project project,
@NotNull InspectionProfileImpl profile) {
final SSBasedInspection inspection = InspectionProfileUtil.getStructuralSearchInspection(profile);
final SSBasedInspection inspection = SSBasedInspection.getStructuralSearchInspection(profile);
if (!ApplicationManager.getApplication().isUnitTestMode()) {
InspectionMetaDataDialog dialog = inspection.createMetaDataDialog(project, null);
if (configuration instanceof ReplaceConfiguration) {
@@ -206,7 +119,7 @@ public class StructuralSearchProfileActionProvider extends InspectionProfileActi
if (profile instanceof InspectionProfileModifiableModel) {
((InspectionProfileModifiableModel)profile).setModified(true);
}
InspectionProfileUtil.fireProfileChanged(profile);
CustomInspectionActions.fireProfileChanged(profile);
return true;
}