diff --git a/.idea/modules.xml b/.idea/modules.xml
index b8b2f1273f36..80335fd6fc9d 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -405,6 +405,7 @@
+
diff --git a/build/bazel-generated-file-list.txt b/build/bazel-generated-file-list.txt
index 432c4e2154d0..7ea0f6480309 100644
--- a/build/bazel-generated-file-list.txt
+++ b/build/bazel-generated-file-list.txt
@@ -919,6 +919,7 @@ plugins/devkit/intellij.devkit.scaffolding
plugins/devkit/intellij.devkit.smartupdate
plugins/devkit/intellij.devkit.stacktrace
plugins/devkit/intellij.devkit.themes
+plugins/devkit/intellij.devkit.threading
plugins/devkit/intellij.devkit.uiDesigner
plugins/devkit/intellij.devkit.workspaceModel
plugins/devkit/intellij.devkit.workspaceModel/k1
diff --git a/plugins/devkit/intellij.devkit.compose/gen/com/intellij/devkit/compose/icons/DevkitComposeIcons.java b/plugins/devkit/intellij.devkit.compose/gen/com/intellij/devkit/compose/icons/DevkitComposeIcons.java
index d8f5d4543949..3f0602dce29c 100644
--- a/plugins/devkit/intellij.devkit.compose/gen/com/intellij/devkit/compose/icons/DevkitComposeIcons.java
+++ b/plugins/devkit/intellij.devkit.compose/gen/com/intellij/devkit/compose/icons/DevkitComposeIcons.java
@@ -18,5 +18,4 @@ public final class DevkitComposeIcons {
/** 16x16 */ public static final @NotNull Icon ComposeToolWindow = load("icons/composeToolWindow.svg", 542147654, 2);
/** 16x16 */ public static final @NotNull Icon Github = load("icons/github.svg", 2052536327, 2);
/** 16x16 */ public static final @NotNull Icon JewelToolWindow = load("icons/jewelToolWindow.svg", -219486260, 2);
- /** 16x16 */ public static final @NotNull Icon LockReqs = load("icons/lock-reqs.svg", 1816243125, 2);
}
diff --git a/plugins/devkit/intellij.devkit.compose/resources/intellij.devkit.compose.xml b/plugins/devkit/intellij.devkit.compose/resources/intellij.devkit.compose.xml
index 04bfe603263c..61fb51e5e4b6 100644
--- a/plugins/devkit/intellij.devkit.compose/resources/intellij.devkit.compose.xml
+++ b/plugins/devkit/intellij.devkit.compose/resources/intellij.devkit.compose.xml
@@ -68,8 +68,6 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-compose-compiler-plugin/2.3.0/kotlin-compose-compiler-plugin-2.3.0.jar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/devkit/intellij.devkit.compose/resources/icons/lock-reqs.svg b/plugins/devkit/intellij.devkit.threading/resources/icons/lockRequirements.svg
similarity index 100%
rename from plugins/devkit/intellij.devkit.compose/resources/icons/lock-reqs.svg
rename to plugins/devkit/intellij.devkit.threading/resources/icons/lockRequirements.svg
diff --git a/plugins/devkit/intellij.devkit.compose/resources/icons/lock-reqs_dark.svg b/plugins/devkit/intellij.devkit.threading/resources/icons/lockRequirements_dark.svg
similarity index 100%
rename from plugins/devkit/intellij.devkit.compose/resources/icons/lock-reqs_dark.svg
rename to plugins/devkit/intellij.devkit.threading/resources/icons/lockRequirements_dark.svg
diff --git a/plugins/devkit/intellij.devkit.threading/resources/intellij.devkit.threading.xml b/plugins/devkit/intellij.devkit.threading/resources/intellij.devkit.threading.xml
new file mode 100644
index 000000000000..59f5efb7facb
--- /dev/null
+++ b/plugins/devkit/intellij.devkit.threading/resources/intellij.devkit.threading.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ messages.DevkitThreadingBundle
+
+
+
+
+
diff --git a/plugins/devkit/intellij.devkit.threading/resources/messages/DevkitThreadingBundle.properties b/plugins/devkit/intellij.devkit.threading/resources/messages/DevkitThreadingBundle.properties
new file mode 100644
index 000000000000..468cdc1bfb7c
--- /dev/null
+++ b/plugins/devkit/intellij.devkit.threading/resources/messages/DevkitThreadingBundle.properties
@@ -0,0 +1,3 @@
+action.LockReqAnalysis.text=Analyze Lock Requirements
+progress.title.analyzing.lock.requirements=Analyzing lock requirements
+tab.title.locking.requirements=Locking Requirements
\ No newline at end of file
diff --git a/plugins/devkit/intellij.devkit.threading/src/DevkitThreadingBundle.kt b/plugins/devkit/intellij.devkit.threading/src/DevkitThreadingBundle.kt
new file mode 100644
index 000000000000..06978ec38f35
--- /dev/null
+++ b/plugins/devkit/intellij.devkit.threading/src/DevkitThreadingBundle.kt
@@ -0,0 +1,23 @@
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+package com.intellij.devkit.threading
+
+import com.intellij.DynamicBundle
+import org.jetbrains.annotations.Nls
+import org.jetbrains.annotations.PropertyKey
+import java.util.function.Supplier
+
+private const val BUNDLE = "messages.DevkitThreadingBundle"
+
+internal object DevkitThreadingBundle {
+ private val instance = DynamicBundle(DevkitThreadingBundle::class.java, BUNDLE)
+
+ @JvmStatic
+ fun message(key: @PropertyKey(resourceBundle = BUNDLE) String, vararg params: Any?): @Nls String {
+ return instance.getMessage(key, *params)
+ }
+
+ @JvmStatic
+ fun messagePointer(@PropertyKey(resourceBundle = BUNDLE) key: String, vararg params: Any?): Supplier<@Nls String> {
+ return instance.getLazyMessage(key, *params)
+ }
+}
\ No newline at end of file
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/LockReqAction.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/LockReqAction.kt
similarity index 72%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/LockReqAction.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/LockReqAction.kt
index 985d2bf21182..52a319626455 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/LockReqAction.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/LockReqAction.kt
@@ -1,8 +1,12 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper
+package com.intellij.devkit.threading.threadingModelHelper
-import com.intellij.devkit.compose.DevkitComposeBundle
-import com.intellij.openapi.actionSystem.*
+import com.intellij.devkit.threading.DevkitThreadingBundle
+import com.intellij.devkit.threading.icons.DevkitThreadingIcons
+import com.intellij.openapi.actionSystem.ActionUpdateThread
+import com.intellij.openapi.actionSystem.AnAction
+import com.intellij.openapi.actionSystem.AnActionEvent
+import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.readAction
import com.intellij.openapi.components.service
@@ -17,11 +21,11 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.jetbrains.idea.devkit.threadingModelHelper.LockReqPsiOps
-class LockReqAction : AnAction() {
+private const val TOOLWINDOW_ID: String = "LockReqs"
- companion object {
- private const val TOOLWINDOW_ID: String = "LockReqs"
- }
+internal class LockReqAction : AnAction() {
+
+ override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
override fun actionPerformed(e: AnActionEvent) {
e.coroutineScope.launch(Dispatchers.Default) {
@@ -39,19 +43,16 @@ class LockReqAction : AnAction() {
toolWindow.activate { }
}
}
+
val target = readAction {
-
val psiFile = e.getData(CommonDataKeys.PSI_FILE) ?: return@readAction null
+ val element = LockReqPsiOps.forLanguage(psiFile.language).extractTargetElement(psiFile, editor.caretModel.offset)
+ ?: return@readAction null
- val smartPointerManager = SmartPointerManager.getInstance(project)
-
- val element = LockReqPsiOps.forLanguage(psiFile.language).extractTargetElement(psiFile, editor.caretModel.offset) ?: return@readAction null
-
- smartPointerManager.createSmartPsiElementPointer(element)
+ SmartPointerManager.getInstance(project).createSmartPsiElementPointer(element)
} ?: return@launch
- val service = project.service()
- service.analyzeMethod(target)
+ project.service().analyzeMethod(target)
}
}
@@ -61,9 +62,9 @@ class LockReqAction : AnAction() {
id = TOOLWINDOW_ID,
anchor = ToolWindowAnchor.BOTTOM,
component = null,
- icon = LockReqIcons.LockReqIcon,
+ icon = DevkitThreadingIcons.LockRequirements,
contentFactory = LockReqsToolWindowFactory(),
- stripeTitle = DevkitComposeBundle.messagePointer("tab.title.locking.requirements"),
+ stripeTitle = DevkitThreadingBundle.messagePointer("tab.title.locking.requirements"),
)
)
return toolWindow
@@ -71,7 +72,6 @@ class LockReqAction : AnAction() {
override fun update(e: AnActionEvent) {
e.presentation.isEnabledAndVisible = shouldBeEnabled(e)
- e.presentation.icon = LockReqIcons.LockReqIcon
}
private fun shouldBeEnabled(e: AnActionEvent): Boolean {
@@ -79,6 +79,4 @@ class LockReqAction : AnAction() {
val caretOffset = e.getData(CommonDataKeys.EDITOR)?.caretModel?.offset ?: return false
return LockReqPsiOps.forLanguageOrNull(psiFile.language)?.extractTargetElement(psiFile, caretOffset) != null
}
-
- override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
}
\ No newline at end of file
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/LockReqService.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/LockReqService.kt
similarity index 83%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/LockReqService.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/LockReqService.kt
index c6855558adec..a5fd5e2a4168 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/LockReqService.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/LockReqService.kt
@@ -1,5 +1,5 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper
+package com.intellij.devkit.threading.threadingModelHelper
import com.intellij.openapi.components.Service
import com.intellij.openapi.project.Project
@@ -9,7 +9,7 @@ import com.intellij.psi.SmartPsiElementPointer
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
-import com.intellij.devkit.compose.DevkitComposeBundle
+import com.intellij.devkit.threading.DevkitThreadingBundle
import com.intellij.openapi.application.ApplicationManager
import org.jetbrains.idea.devkit.threadingModelHelper.AnalysisConfig
import org.jetbrains.idea.devkit.threadingModelHelper.AnalysisResult
@@ -17,9 +17,8 @@ import org.jetbrains.idea.devkit.threadingModelHelper.DefaultLockReqConsumer
import org.jetbrains.idea.devkit.threadingModelHelper.LOCK_REQUIREMENTS
import org.jetbrains.idea.devkit.threadingModelHelper.LockReqAnalyzerParallelBFS
-
@Service(Service.Level.PROJECT)
-class LockReqsService(private val project: Project) {
+internal class LockReqsService(private val project: Project) {
private var _currentResults by mutableStateOf>(emptyList())
val currentResults: List
@@ -28,7 +27,7 @@ class LockReqsService(private val project: Project) {
suspend fun analyzeMethod(methodPtr: SmartPsiElementPointer) {
val analyzer = LockReqAnalyzerParallelBFS()
val config = AnalysisConfig.forProject(project, LOCK_REQUIREMENTS)
- withBackgroundProgress(project, DevkitComposeBundle.message("progress.title.analyzing.lock.requirements"), true) {
+ withBackgroundProgress(project, DevkitThreadingBundle.message("progress.title.analyzing.lock.requirements"), true) {
val consumer = DefaultLockReqConsumer(methodPtr) { snapshot ->
ApplicationManager.getApplication().invokeLater {
_currentResults = listOf(snapshot)
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/LockReqsToolWindowFactory.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/LockReqsToolWindowFactory.kt
similarity index 64%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/LockReqsToolWindowFactory.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/LockReqsToolWindowFactory.kt
index 1f48ac0b2588..7710e13a578f 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/LockReqsToolWindowFactory.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/LockReqsToolWindowFactory.kt
@@ -1,17 +1,17 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper
+package com.intellij.devkit.threading.threadingModelHelper
-import com.intellij.devkit.compose.threadingModelHelper.ui.LockReqsToolWindow
+import com.intellij.devkit.threading.threadingModelHelper.ui.LockReqsToolWindow
import com.intellij.openapi.project.Project
import com.intellij.openapi.wm.ToolWindow
import com.intellij.openapi.wm.ToolWindowFactory
import com.intellij.ui.content.ContentFactory
-import org.jetbrains.jewel.bridge.JewelComposePanel
+import org.jetbrains.jewel.bridge.compose
-class LockReqsToolWindowFactory : ToolWindowFactory {
+internal class LockReqsToolWindowFactory : ToolWindowFactory {
override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) {
val contentFactory = ContentFactory.getInstance()
- val panel = JewelComposePanel { LockReqsToolWindow(project) }
+ val panel = compose { LockReqsToolWindow(project) }
val content = contentFactory.createContent(panel, null, false)
toolWindow.contentManager.addContent(content)
}
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/EmptyStateView.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/EmptyStateView.kt
similarity index 87%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/EmptyStateView.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/EmptyStateView.kt
index ae69bfeb8400..c9ed462f6cfe 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/EmptyStateView.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/EmptyStateView.kt
@@ -1,22 +1,18 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper.ui
+package com.intellij.devkit.threading.threadingModelHelper.ui
-import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.unit.dp
import org.jetbrains.jewel.foundation.theme.JewelTheme
import org.jetbrains.jewel.ui.component.Icon
import org.jetbrains.jewel.ui.component.Text
import org.jetbrains.jewel.ui.icons.AllIconsKeys
-
@Composable
internal fun EmptyStateView() {
Box(
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/FilterChips.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/FilterChips.kt
similarity index 96%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/FilterChips.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/FilterChips.kt
index 55fd0309b467..350764a7af1c 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/FilterChips.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/FilterChips.kt
@@ -1,5 +1,5 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper.ui
+package com.intellij.devkit.threading.threadingModelHelper.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.border
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/LockReqsState.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/LockReqsState.kt
similarity index 94%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/LockReqsState.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/LockReqsState.kt
index acba981cb2ff..9ebc6c109243 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/LockReqsState.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/LockReqsState.kt
@@ -1,9 +1,9 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper.ui
+package com.intellij.devkit.threading.threadingModelHelper.ui
import androidx.compose.runtime.Immutable
-import org.jetbrains.idea.devkit.threadingModelHelper.ExecutionPath
import org.jetbrains.idea.devkit.threadingModelHelper.ConstraintType
+import org.jetbrains.idea.devkit.threadingModelHelper.ExecutionPath
@Immutable
internal data class LockReqsViewState(
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/LockReqsToolWindow.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/LockReqsToolWindow.kt
similarity index 79%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/LockReqsToolWindow.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/LockReqsToolWindow.kt
index b3b4128ea5af..3c35c3989470 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/LockReqsToolWindow.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/LockReqsToolWindow.kt
@@ -1,20 +1,12 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper.ui
+package com.intellij.devkit.threading.threadingModelHelper.ui
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.padding
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
+import androidx.compose.foundation.layout.*
+import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
-import com.intellij.devkit.compose.threadingModelHelper.LockReqsService
+import com.intellij.devkit.threading.threadingModelHelper.LockReqsService
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import org.jetbrains.idea.devkit.threadingModelHelper.AnalysisResult
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/LockRequirementChip.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/LockRequirementChip.kt
similarity index 98%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/LockRequirementChip.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/LockRequirementChip.kt
index e961b8523fdb..1ede67ff8d07 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/LockRequirementChip.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/LockRequirementChip.kt
@@ -1,5 +1,5 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper.ui
+package com.intellij.devkit.threading.threadingModelHelper.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.border
@@ -12,8 +12,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
-import org.jetbrains.idea.devkit.threadingModelHelper.LockRequirement
import org.jetbrains.idea.devkit.threadingModelHelper.ConstraintType
+import org.jetbrains.idea.devkit.threadingModelHelper.LockRequirement
import org.jetbrains.idea.devkit.threadingModelHelper.RequirementReason
import org.jetbrains.jewel.foundation.theme.JewelTheme
import org.jetbrains.jewel.ui.component.Icon
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/NoPathsFoundView.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/NoPathsFoundView.kt
similarity index 80%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/NoPathsFoundView.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/NoPathsFoundView.kt
index 443bd45ff33a..b2970c7a26cb 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/NoPathsFoundView.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/NoPathsFoundView.kt
@@ -1,17 +1,12 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper.ui
+package com.intellij.devkit.threading.threadingModelHelper.ui
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
-import com.intellij.psi.PsiMethod
import org.jetbrains.jewel.foundation.theme.JewelTheme
import org.jetbrains.jewel.ui.component.Icon
import org.jetbrains.jewel.ui.component.Text
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/PathDetailsView.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/PathDetailsView.kt
similarity index 89%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/PathDetailsView.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/PathDetailsView.kt
index 289846b78387..a8cade23d312 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/PathDetailsView.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/PathDetailsView.kt
@@ -1,18 +1,9 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper.ui
+package com.intellij.devkit.threading.threadingModelHelper.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.border
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.runtime.Composable
@@ -25,16 +16,12 @@ import com.intellij.openapi.fileEditor.OpenFileDescriptor
import com.intellij.openapi.ide.CopyPasteManager
import com.intellij.openapi.project.Project
import com.intellij.util.ui.JBUI
-import org.jetbrains.idea.devkit.threadingModelHelper.ExecutionPath
import org.jetbrains.idea.devkit.threadingModelHelper.ConstraintType
+import org.jetbrains.idea.devkit.threadingModelHelper.ExecutionPath
import org.jetbrains.jewel.bridge.toComposeColor
import org.jetbrains.jewel.foundation.theme.JewelTheme
import org.jetbrains.jewel.ui.Orientation
-import org.jetbrains.jewel.ui.component.DefaultButton
-import org.jetbrains.jewel.ui.component.Divider
-import org.jetbrains.jewel.ui.component.Icon
-import org.jetbrains.jewel.ui.component.OutlinedButton
-import org.jetbrains.jewel.ui.component.Text
+import org.jetbrains.jewel.ui.component.*
import org.jetbrains.jewel.ui.icons.AllIconsKeys
import java.awt.datatransfer.StringSelection
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/PathListItem.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/PathListItem.kt
similarity index 85%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/PathListItem.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/PathListItem.kt
index 85c90e4f763f..1e2a9ccf4457 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/PathListItem.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/PathListItem.kt
@@ -1,13 +1,8 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper.ui
+package com.intellij.devkit.threading.threadingModelHelper.ui
import androidx.compose.foundation.background
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.FlowRow
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/PathListView.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/PathListView.kt
similarity index 97%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/PathListView.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/PathListView.kt
index 1dafab68c1ee..8c7729f83337 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/PathListView.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/PathListView.kt
@@ -1,5 +1,5 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper.ui
+package com.intellij.devkit.threading.threadingModelHelper.ui
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
diff --git a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/ToolWindowHeader.kt b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/ToolWindowHeader.kt
similarity index 86%
rename from plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/ToolWindowHeader.kt
rename to plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/ToolWindowHeader.kt
index 71e0bf60bcf6..e399c49df3b6 100644
--- a/plugins/devkit/intellij.devkit.compose/src/threadingModelHelper/ui/ToolWindowHeader.kt
+++ b/plugins/devkit/intellij.devkit.threading/src/threadingModelHelper/ui/ToolWindowHeader.kt
@@ -1,12 +1,7 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.devkit.compose.threadingModelHelper.ui
+package com.intellij.devkit.threading.threadingModelHelper.ui
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
diff --git a/plugins/devkit/plugin-content.yaml b/plugins/devkit/plugin-content.yaml
index 2baeaa1be75b..54c3ff28f21b 100644
--- a/plugins/devkit/plugin-content.yaml
+++ b/plugins/devkit/plugin-content.yaml
@@ -38,6 +38,9 @@
- name: lib/modules/intellij.devkit.scaffolding.jar
contentModules:
- name: intellij.devkit.scaffolding
+- name: lib/modules/intellij.devkit.threading.jar
+ contentModules:
+ - name: intellij.devkit.threading
- name: lib/modules/intellij.platform.jewel.samples.showcase.jar
contentModules:
- name: intellij.platform.jewel.samples.showcase
diff --git a/plugins/devkit/resources/META-INF/plugin.xml b/plugins/devkit/resources/META-INF/plugin.xml
index 6b3346ef85de..c14b65ba5d27 100644
--- a/plugins/devkit/resources/META-INF/plugin.xml
+++ b/plugins/devkit/resources/META-INF/plugin.xml
@@ -47,6 +47,7 @@
+