[debugger] IDEA-361922 Extract debugger settings to a separate module so that it can be used in the frontend

GitOrigin-RevId: 5e42886a5f5642581b36397ad3fcb30b8fe57e83
This commit is contained in:
Maksim Zuev
2024-11-08 12:32:19 +01:00
committed by intellij-monorepo-bot
parent 15d6bbc33b
commit 0abb3ae300
26 changed files with 155 additions and 49 deletions

1
.idea/modules.xml generated
View File

@@ -432,6 +432,7 @@
<module fileurl="file://$PROJECT_DIR$/java/debugger/openapi/intellij.java.debugger.iml" filepath="$PROJECT_DIR$/java/debugger/openapi/intellij.java.debugger.iml" />
<module fileurl="file://$PROJECT_DIR$/java/debugger/debugger-agent/intellij.java.debugger.agent.holder.iml" filepath="$PROJECT_DIR$/java/debugger/debugger-agent/intellij.java.debugger.agent.holder.iml" />
<module fileurl="file://$PROJECT_DIR$/java/debugger/impl/intellij.java.debugger.impl.iml" filepath="$PROJECT_DIR$/java/debugger/impl/intellij.java.debugger.impl.iml" />
<module fileurl="file://$PROJECT_DIR$/java/debugger/shared/intellij.java.debugger.impl.shared.iml" filepath="$PROJECT_DIR$/java/debugger/shared/intellij.java.debugger.impl.shared.iml" />
<module fileurl="file://$PROJECT_DIR$/java/debugger/memory-agent/intellij.java.debugger.memory.agent.iml" filepath="$PROJECT_DIR$/java/debugger/memory-agent/intellij.java.debugger.memory.agent.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/stream-debugger/intellij.java.debugger.streams.iml" filepath="$PROJECT_DIR$/plugins/stream-debugger/intellij.java.debugger.streams.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/java-decompiler/plugin/intellij.java.decompiler.iml" filepath="$PROJECT_DIR$/plugins/java-decompiler/plugin/intellij.java.decompiler.iml" />

View File

@@ -80,6 +80,7 @@
<orderEntry type="library" name="kotlinx-serialization-json" level="project" />
<orderEntry type="module" module-name="intellij.platform.util.coroutines" />
<orderEntry type="module" module-name="intellij.platform.threadDumpParser" />
<orderEntry type="module" module-name="intellij.java.debugger.impl.shared" />
</component>
<component name="copyright">
<Base>

View File

@@ -88,7 +88,6 @@
serviceImplementation="com.intellij.debugger.impl.DebuggerUtilsImpl"/>
<applicationService serviceImplementation="com.intellij.debugger.settings.NodeRendererSettings"/>
<applicationService serviceImplementation="com.intellij.debugger.settings.ViewsGeneralSettings"/>
<applicationService serviceImplementation="com.intellij.debugger.settings.DebuggerSettings"/>
<projectService serviceImplementation="com.intellij.debugger.settings.DebuggerProjectSettings"/>
<applicationService serviceImplementation="com.intellij.debugger.settings.ThreadsViewSettings"/>
<applicationService serviceImplementation="com.intellij.debugger.settings.TraceSettings"/>

View File

@@ -19,6 +19,7 @@ import com.intellij.debugger.jdi.JvmtiError;
import com.intellij.debugger.jdi.VirtualMachineProxyImpl;
import com.intellij.debugger.memory.ui.CollectionHistoryView;
import com.intellij.debugger.requests.Requestor;
import com.intellij.debugger.settings.DebuggerSettingsUtils;
import com.intellij.debugger.ui.breakpoints.Breakpoint;
import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl;
import com.intellij.debugger.ui.tree.FieldDescriptor;
@@ -177,9 +178,7 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils {
}
public static ClassFilter create(Element element) throws InvalidDataException {
ClassFilter filter = new ClassFilter();
DefaultJDOMExternalizer.readExternal(filter, element);
return filter;
return DebuggerSettingsUtils.create(element);
}
private static boolean isFiltered(ClassFilter classFilter, String qName) {
@@ -213,43 +212,30 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils {
return (int)Arrays.stream(classFilters).filter(ClassFilter::isEnabled).count();
}
/**
* @deprecated Use {@link DebuggerSettingsUtils#readFilters} directly
*/
@Deprecated
public static ClassFilter[] readFilters(List<? extends Element> children) {
if (ContainerUtil.isEmpty(children)) {
return ClassFilter.EMPTY_ARRAY;
}
//do not leave null elements in the resulting array in case of read errors
List<ClassFilter> filters = new ArrayList<>(children.size());
for (Element child : children) {
try {
filters.add(create(child));
}
catch (InvalidDataException e) {
LOG.error(e);
}
}
return filters.toArray(ClassFilter.EMPTY_ARRAY);
return DebuggerSettingsUtils.readFilters(children);
}
/**
* @deprecated Use {@link DebuggerSettingsUtils#writeFilters} directly
*/
@Deprecated
public static void writeFilters(@NotNull Element parentNode,
@NonNls String tagName,
ClassFilter[] filters) throws WriteExternalException {
for (ClassFilter filter : filters) {
Element element = new Element(tagName);
parentNode.addContent(element);
DefaultJDOMExternalizer.writeExternal(filter, element);
}
DebuggerSettingsUtils.writeFilters(parentNode, tagName, filters);
}
/**
* @deprecated Use {@link DebuggerSettingsUtils#filterEquals} directly
*/
@Deprecated
public static boolean filterEquals(ClassFilter[] filters1, ClassFilter[] filters2) {
if (filters1.length != filters2.length) {
return false;
}
final Set<ClassFilter> f1 = new HashSet<>(Math.max((int)(filters1.length / .75f) + 1, 16));
final Set<ClassFilter> f2 = new HashSet<>(Math.max((int)(filters2.length / .75f) + 1, 16));
Collections.addAll(f1, filters1);
Collections.addAll(f2, filters2);
return f2.equals(f1);
return DebuggerSettingsUtils.filterEquals(filters1, filters2);
}
private static boolean elementListsEqual(List<? extends Element> l1, List<? extends Element> l2) {

View File

@@ -2,7 +2,6 @@
package com.intellij.debugger.settings;
import com.intellij.debugger.JavaDebuggerBundle;
import com.intellij.debugger.impl.DebuggerUtilsEx;
import com.intellij.debugger.ui.JavaDebuggerSupport;
import com.intellij.debugger.ui.tree.render.ClassRenderer;
import com.intellij.debugger.ui.tree.render.PrimitiveRenderer;
@@ -301,7 +300,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
final boolean isToStringRendererModified =
(toStringRenderer.isOnDemand() == myCbEnableToString.isSelected()) ||
(toStringRenderer.isUseClassFilters() != myRbFromList.isSelected()) ||
(!DebuggerUtilsEx.filterEquals(toStringRenderer.getClassFilters(), myToStringFilterEditor.getFilters()));
(!DebuggerSettingsUtils.filterEquals(toStringRenderer.getClassFilters(), myToStringFilterEditor.getFilters()));
if (isToStringRendererModified) {
return true;
}

View File

@@ -7,8 +7,8 @@ import com.intellij.debugger.engine.evaluation.CodeFragmentKind;
import com.intellij.debugger.engine.evaluation.TextWithImports;
import com.intellij.debugger.engine.evaluation.TextWithImportsImpl;
import com.intellij.debugger.engine.events.SuspendContextCommandImpl;
import com.intellij.debugger.impl.DebuggerUtilsEx;
import com.intellij.debugger.settings.DebuggerSettings;
import com.intellij.debugger.settings.DebuggerSettingsUtils;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.*;
import com.intellij.ui.classFilter.ClassFilter;
@@ -125,10 +125,10 @@ public class FilteredRequestorImpl implements JDOMExternalizable, FilteredReques
setCondition(new TextWithImportsImpl(CodeFragmentKind.EXPRESSION, condition));
}
myClassFilters = DebuggerUtilsEx.readFilters(parentNode.getChildren(FILTER_OPTION_NAME));
myClassExclusionFilters = DebuggerUtilsEx.readFilters(parentNode.getChildren(EXCLUSION_FILTER_OPTION_NAME));
myClassFilters = DebuggerSettingsUtils.readFilters(parentNode.getChildren(FILTER_OPTION_NAME));
myClassExclusionFilters = DebuggerSettingsUtils.readFilters(parentNode.getChildren(EXCLUSION_FILTER_OPTION_NAME));
final ClassFilter[] instanceFilters = DebuggerUtilsEx.readFilters(parentNode.getChildren(INSTANCE_ID_OPTION_NAME));
final ClassFilter[] instanceFilters = DebuggerSettingsUtils.readFilters(parentNode.getChildren(INSTANCE_ID_OPTION_NAME));
final List<InstanceFilter> iFilters = new ArrayList<>(instanceFilters.length);
for (ClassFilter instanceFilter : instanceFilters) {
@@ -145,9 +145,9 @@ public class FilteredRequestorImpl implements JDOMExternalizable, FilteredReques
public void writeExternal(Element parentNode) throws WriteExternalException {
DefaultJDOMExternalizer.writeExternal(this, parentNode);
JDOMExternalizerUtil.writeField(parentNode, CONDITION_OPTION_NAME, getCondition().toExternalForm());
DebuggerUtilsEx.writeFilters(parentNode, FILTER_OPTION_NAME, myClassFilters);
DebuggerUtilsEx.writeFilters(parentNode, EXCLUSION_FILTER_OPTION_NAME, myClassExclusionFilters);
DebuggerUtilsEx.writeFilters(parentNode, INSTANCE_ID_OPTION_NAME, InstanceFilter.createClassFilters(myInstanceFilters));
DebuggerSettingsUtils.writeFilters(parentNode, FILTER_OPTION_NAME, myClassFilters);
DebuggerSettingsUtils.writeFilters(parentNode, EXCLUSION_FILTER_OPTION_NAME, myClassExclusionFilters);
DebuggerSettingsUtils.writeFilters(parentNode, INSTANCE_ID_OPTION_NAME, InstanceFilter.createClassFilters(myInstanceFilters));
}
public TextWithImports getCondition() {

View File

@@ -9,6 +9,7 @@ import com.intellij.debugger.engine.evaluation.EvaluateException;
import com.intellij.debugger.engine.evaluation.EvaluationContext;
import com.intellij.debugger.impl.DebuggerUtilsAsync;
import com.intellij.debugger.impl.DebuggerUtilsEx;
import com.intellij.debugger.settings.DebuggerSettingsUtils;
import com.intellij.debugger.ui.tree.DebuggerTreeNode;
import com.intellij.debugger.ui.tree.NodeDescriptor;
import com.intellij.debugger.ui.tree.ValueDescriptor;
@@ -173,7 +174,7 @@ public class ToStringRenderer extends NodeRendererImpl implements OnDemandRender
ON_DEMAND = Boolean.parseBoolean(JDOMExternalizerUtil.readField(element, "ON_DEMAND"));
USE_CLASS_FILTERS = Boolean.parseBoolean(JDOMExternalizerUtil.readField(element, "USE_CLASS_FILTERS"));
myClassFilters = DebuggerUtilsEx.readFilters(element.getChildren("filter"));
myClassFilters = DebuggerSettingsUtils.readFilters(element.getChildren("filter"));
}
@Override
@@ -186,7 +187,7 @@ public class ToStringRenderer extends NodeRendererImpl implements OnDemandRender
if (USE_CLASS_FILTERS) {
JDOMExternalizerUtil.writeField(element, "USE_CLASS_FILTERS", "true");
}
DebuggerUtilsEx.writeFilters(element, "filter", myClassFilters);
DebuggerSettingsUtils.writeFilters(element, "filter", myClassFilters);
}
public ClassFilter[] getClassFilters() {

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="intellij.platform.util.jdom" />
<orderEntry type="module" module-name="intellij.platform.projectModel" />
</component>
</module>

View File

@@ -0,0 +1,5 @@
<idea-plugin>
<extensions defaultExtensionNs="com.intellij">
<applicationService serviceImplementation="com.intellij.debugger.settings.DebuggerSettings"/>
</extensions>
</idea-plugin>

View File

@@ -2,7 +2,6 @@
package com.intellij.debugger.settings;
import com.intellij.configurationStore.XmlSerializer;
import com.intellij.debugger.impl.DebuggerUtilsEx;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PersistentStateComponent;
@@ -131,7 +130,7 @@ public final class DebuggerSettings implements Cloneable, PersistentStateCompone
}
if (!Arrays.equals(DEFAULT_STEPPING_FILTERS, mySteppingFilters)) {
DebuggerUtilsEx.writeFilters(state, "filter", mySteppingFilters);
DebuggerSettingsUtils.writeFilters(state, "filter", mySteppingFilters);
}
for (ContentState eachState : myContentStates.values()) {
@@ -152,7 +151,7 @@ public final class DebuggerSettings implements Cloneable, PersistentStateCompone
setSteppingFilters(DEFAULT_STEPPING_FILTERS);
}
else {
setSteppingFilters(DebuggerUtilsEx.readFilters(steppingFiltersElement));
setSteppingFilters(DebuggerSettingsUtils.readFilters(steppingFiltersElement));
}
myContentStates.clear();
@@ -185,7 +184,7 @@ public final class DebuggerSettings implements Cloneable, PersistentStateCompone
HOTSWAP_HANG_WARNING_ENABLED == secondSettings.HOTSWAP_HANG_WARNING_ENABLED &&
HOTSWAP_SHOW_FLOATING_BUTTON == secondSettings.HOTSWAP_SHOW_FLOATING_BUTTON &&
Objects.equals(RUN_HOTSWAP_AFTER_COMPILE, secondSettings.RUN_HOTSWAP_AFTER_COMPILE) &&
DebuggerUtilsEx.filterEquals(mySteppingFilters, secondSettings.mySteppingFilters) &&
DebuggerSettingsUtils.filterEquals(mySteppingFilters, secondSettings.mySteppingFilters) &&
myCapturePoints.equals(secondSettings.myCapturePoints);
}

View File

@@ -0,0 +1,65 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.debugger.settings;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.DefaultJDOMExternalizer;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.ui.classFilter.ClassFilter;
import com.intellij.util.containers.ContainerUtil;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.*;
public final class DebuggerSettingsUtils {
private static final Logger LOG = Logger.getInstance(DebuggerSettingsUtils.class);
private DebuggerSettingsUtils() { }
public static ClassFilter[] readFilters(List<? extends Element> children) {
if (ContainerUtil.isEmpty(children)) {
return ClassFilter.EMPTY_ARRAY;
}
//do not leave null elements in the resulting array in case of read errors
List<ClassFilter> filters = new ArrayList<>(children.size());
for (Element child : children) {
try {
filters.add(create(child));
}
catch (InvalidDataException e) {
LOG.error(e);
}
}
return filters.toArray(ClassFilter.EMPTY_ARRAY);
}
public static void writeFilters(@NotNull Element parentNode,
@NonNls String tagName,
ClassFilter[] filters) throws WriteExternalException {
for (ClassFilter filter : filters) {
Element element = new Element(tagName);
parentNode.addContent(element);
DefaultJDOMExternalizer.writeExternal(filter, element);
}
}
public static ClassFilter create(Element element) throws InvalidDataException {
ClassFilter filter = new ClassFilter();
DefaultJDOMExternalizer.readExternal(filter, element);
return filter;
}
public static boolean filterEquals(ClassFilter[] filters1, ClassFilter[] filters2) {
if (filters1.length != filters2.length) {
return false;
}
final Set<ClassFilter> f1 = new HashSet<>(Math.max((int)(filters1.length / .75f) + 1, 16));
final Set<ClassFilter> f2 = new HashSet<>(Math.max((int)(filters2.length / .75f) + 1, 16));
Collections.addAll(f1, filters1);
Collections.addAll(f2, filters2);
return f2.equals(f1);
}
}

View File

@@ -46,6 +46,7 @@
<orderEntry type="module" module-name="intellij.platform.threadDumpParser" />
<orderEntry type="module" module-name="intellij.platform.eel.provider" />
<orderEntry type="module" module-name="intellij.platform.eel" />
<orderEntry type="module" module-name="intellij.java.debugger.impl.shared" />
</component>
<component name="copyright">
<Base>

View File

@@ -23,5 +23,6 @@
<orderEntry type="library" name="kotlinx-serialization-json" level="project" />
<orderEntry type="module" module-name="intellij.platform.testFramework" scope="TEST" />
<orderEntry type="module" module-name="intellij.java.execution.impl" />
<orderEntry type="module" module-name="intellij.java.debugger.impl.shared" />
</component>
</module>

View File

@@ -8,6 +8,7 @@
<xi:include href="intellij.java.frontback.psi.impl.xml"/>
<xi:include href="intellij.java.frontback.impl.xml"/>
<xi:include href="intellij.java.debugger.impl.shared.xml"/>
<xi:include href="/META-INF/JavaIndexingPlugin.xml"/>
<xi:include href="/META-INF/JavaPsiPlugin.xml"/>
<xi:include href="/META-INF/JavaAnalysisPlugin.xml"/>

View File

@@ -10,6 +10,7 @@
<orderEntry type="module" module-name="intellij.java.compiler.impl" scope="RUNTIME" />
<orderEntry type="module" module-name="intellij.java.compiler.charts" />
<orderEntry type="module" module-name="intellij.java.debugger.impl" scope="RUNTIME" />
<orderEntry type="module" module-name="intellij.java.debugger.impl.shared" scope="RUNTIME" />
<orderEntry type="module" module-name="intellij.xml.dom.impl" scope="RUNTIME" />
<orderEntry type="module" module-name="intellij.java.debugger.memory.agent" scope="RUNTIME" />
<orderEntry type="module" module-name="intellij.java.execution.impl" scope="RUNTIME" />

View File

@@ -16,6 +16,7 @@
- name: intellij.java.frontback.impl
- name: intellij.java.frontback.psi
- name: intellij.java.frontback.psi.impl
- name: intellij.java.debugger.impl.shared
- name: lib/java-impl.jar
modules:
- name: intellij.java.compiler

View File

@@ -35,6 +35,7 @@
<orderEntry type="module" module-name="intellij.java.impl.refactorings" />
<orderEntry type="module" module-name="intellij.platform.debugger.impl" />
<orderEntry type="module" module-name="intellij.platform.backend.observation" />
<orderEntry type="module" module-name="intellij.java.debugger.impl.shared" />
</component>
<component name="copyright">
<Base>

View File

@@ -53,6 +53,7 @@ object JavaPluginLayout {
"intellij.java.frontback.impl",
"intellij.java.frontback.psi",
"intellij.java.frontback.psi.impl",
"intellij.java.debugger.impl.shared",
)) {
spec.withModule(moduleName, "java-frontback.jar")
}

View File

@@ -1945,6 +1945,28 @@ f:com.intellij.ui.NewUiValue
- s:initialize(java.util.function.Supplier):V
- s:isEnabled():Z
- s:overrideNewUiForOneRemDevSession(Z):V
c:com.intellij.ui.classFilter.ClassFilter
- com.intellij.openapi.util.JDOMExternalizable
- java.lang.Cloneable
- sf:EMPTY_ARRAY:com.intellij.ui.classFilter.ClassFilter[]
- ENABLED:Z
- INCLUDE:Z
- PATTERN:java.lang.String
- <init>():V
- <init>(java.lang.String):V
- clone():com.intellij.ui.classFilter.ClassFilter
- s:deepCopyOf(com.intellij.ui.classFilter.ClassFilter[]):com.intellij.ui.classFilter.ClassFilter[]
- equals(java.lang.Object):Z
- getPattern():java.lang.String
- hashCode():I
- isEnabled():Z
- isInclude():Z
- matches(java.lang.String):Z
- readExternal(org.jdom.Element):V
- setEnabled(Z):V
- setInclude(Z):V
- setPattern(java.lang.String):V
- writeExternal(org.jdom.Element):V
com.intellij.ui.icons.CompositeIcon
- com.intellij.ui.icons.ReplaceableIcon
- javax.swing.Icon

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ui.classFilter;
@@ -88,7 +88,8 @@ public class ClassFilter implements JDOMExternalizable, Cloneable{
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof ClassFilter classFilter)) return false;
if (!(o instanceof ClassFilter)) return false;
ClassFilter classFilter = (ClassFilter)o;
return isEnabled() == classFilter.isEnabled() && getPattern().equals(classFilter.getPattern());
}

View File

@@ -49,5 +49,6 @@
<orderEntry type="library" name="hash4j" level="project" />
<orderEntry type="library" name="fastutil-min" level="project" />
<orderEntry type="module" module-name="intellij.platform.ide.ui" />
<orderEntry type="module" module-name="intellij.java.debugger.impl.shared" />
</component>
</module>

View File

@@ -61,5 +61,6 @@
<orderEntry type="library" name="kotlinc.analysis-api-impl-base" level="project" />
<orderEntry type="module" module-name="kotlin.code-insight.utils" />
<orderEntry type="module" module-name="intellij.platform.util" />
<orderEntry type="module" module-name="intellij.java.debugger.impl.shared" />
</component>
</module>

View File

@@ -56,5 +56,7 @@
<orderEntry type="module" module-name="intellij.platform.statistics" />
<orderEntry type="module" module-name="intellij.platform.util" />
<orderEntry type="module" module-name="kotlin.base.resources" />
<orderEntry type="module" module-name="intellij.java.debugger.impl.shared" />
<orderEntry type="module" module-name="intellij.platform.util.jdom" />
</component>
</module>

View File

@@ -54,5 +54,6 @@
<orderEntry type="module" module-name="intellij.java.analysis" scope="TEST" />
<orderEntry type="module" module-name="intellij.platform.scriptDebugger.ui" scope="TEST" />
<orderEntry type="module" module-name="intellij.platform.util.jdom" scope="TEST" />
<orderEntry type="module" module-name="intellij.java.debugger.impl.shared" scope="TEST" />
</component>
</module>

View File

@@ -112,6 +112,7 @@
<orderEntry type="module" module-name="intellij.platform.eel" />
<orderEntry type="module" module-name="intellij.platform.ijent" />
<orderEntry type="library" name="opentelemetry" level="project" />
<orderEntry type="module" module-name="intellij.java.debugger.impl.shared" />
</component>
<component name="copyright">
<Base>