diff --git a/java/debugger/impl/resources/META-INF/java-debugger.xml b/java/debugger/impl/resources/META-INF/java-debugger.xml
index 3eda792cab4e..5c6ac73e343a 100644
--- a/java/debugger/impl/resources/META-INF/java-debugger.xml
+++ b/java/debugger/impl/resources/META-INF/java-debugger.xml
@@ -65,6 +65,8 @@
interface="com.intellij.debugger.impl.ThreadDumpItemsProviderFactory" dynamic="true"/>
+
diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/hotswap/HotSwapSourceFileFilterProvider.kt b/java/debugger/impl/src/com/intellij/debugger/impl/hotswap/HotSwapSourceFileFilterProvider.kt
new file mode 100644
index 000000000000..cc01c6ca1c7d
--- /dev/null
+++ b/java/debugger/impl/src/com/intellij/debugger/impl/hotswap/HotSwapSourceFileFilterProvider.kt
@@ -0,0 +1,30 @@
+// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+package com.intellij.debugger.impl.hotswap
+
+import com.intellij.debugger.impl.DebuggerSession
+import com.intellij.openapi.extensions.ExtensionPointName
+import com.intellij.openapi.vfs.VirtualFile
+import com.intellij.xdebugger.hotswap.HotSwapProvider
+import com.intellij.xdebugger.hotswap.SourceFileChangesCollector
+import com.intellij.xdebugger.impl.hotswap.SourceFileChangeFilter
+import org.jetbrains.annotations.ApiStatus
+
+/**
+ * The aim of this interface is to allow different plugins to provide custom filtering of changes staged for HotSwap.
+ *
+ * Implementations of [HotSwapProvider] should call EPs of this interface upon
+ * creation of [SourceFileChangesCollector] to propagate filters.
+ */
+@ApiStatus.Experimental
+@ApiStatus.Internal
+interface HotSwapSourceFileFilterProvider {
+ fun provideFiltersForSession(debuggerSession: DebuggerSession): List>
+
+ companion object {
+ private val EP_NAME: ExtensionPointName = ExtensionPointName("com.intellij.debugger.hotSwapSourceFileFilterProvider")
+
+ fun findSourceFiltersForSession(debuggerSession: DebuggerSession): List> {
+ return EP_NAME.extensionsIfPointIsRegistered.flatMap { it.provideFiltersForSession(debuggerSession) }
+ }
+ }
+}
diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/hotswap/JvmHotSwapProvider.kt b/java/debugger/impl/src/com/intellij/debugger/impl/hotswap/JvmHotSwapProvider.kt
index f9f0fc579e7f..00f4cc90b286 100644
--- a/java/debugger/impl/src/com/intellij/debugger/impl/hotswap/JvmHotSwapProvider.kt
+++ b/java/debugger/impl/src/com/intellij/debugger/impl/hotswap/JvmHotSwapProvider.kt
@@ -25,10 +25,12 @@ internal class JvmHotSwapProvider(private val debuggerSession: DebuggerSession)
): SourceFileChangesCollector {
val jvmExtensions = Language.findInstance(JvmMetaLanguage::class.java).getMatchingLanguages()
.mapNotNull { it.associatedFileType?.defaultExtension }
+ val filtersFromProviders = HotSwapSourceFileFilterProvider.findSourceFiltersForSession(debuggerSession)
return SourceFileChangesCollectorImpl(
coroutineScope, listener,
FileExtensionFilter(jvmExtensions),
InProjectFilter(session.project),
+ *filtersFromProviders.toTypedArray(),
)
}