From 0a47e3e278870267fa47c8db30275cf91796eee6 Mon Sep 17 00:00:00 2001 From: Nikolay Egorov Date: Thu, 12 Feb 2026 18:18:12 +0200 Subject: [PATCH] IJPL-211960: Introduce HotSwapSourceFileFilterProvider to enable custom filtering of source files staged for HotSwap - custom plugins could influence this decision - precise filtering could be implemented upon this logic GitOrigin-RevId: 2abba919ca41b29d4ed34d7405eae30c59c4e595 --- .../impl/resources/META-INF/java-debugger.xml | 2 ++ .../HotSwapSourceFileFilterProvider.kt | 30 +++++++++++++++++++ .../impl/hotswap/JvmHotSwapProvider.kt | 2 ++ 3 files changed, 34 insertions(+) create mode 100644 java/debugger/impl/src/com/intellij/debugger/impl/hotswap/HotSwapSourceFileFilterProvider.kt 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(), ) }