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(), ) }