Skip to content

Commit ac41bb1

Browse files
committed
feat(build): add support for detecting package files in build systems #316
Add `isDeclarePackageFile` method to `BuildSystemProvider` to identify package files (e.g., `requirements.txt`, `package.json`, `go.mod`). This enables proper UI handling and tooling for dependency management across various build systems.
1 parent 16f8bdc commit ac41bb1

File tree

11 files changed

+122
-24
lines changed

11 files changed

+122
-24
lines changed

core/src/223/main/resources/META-INF/autodev-core.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,11 @@
336336
<add-to-group group-id="EditorPopupMenu" anchor="first"/>
337337
</action>
338338

339+
<group id="AutoDev.ToolWindow.Snippet.DependenciesToolbar">
340+
<action id="AutoDev.ToolWindow.Snippet.DependenciesLabelAction"
341+
class="cc.unitmesh.devti.gui.snippet.AutoDevDependenciesLabelAction"/>
342+
</group>
343+
339344
<group id="AutoDev.ToolWindow.Snippet.Toolbar">
340345
<action id="AutoDev.ToolWindow.Snippet.LanguageLabelAction"
341346
class="cc.unitmesh.devti.gui.snippet.AutoDevLanguageLabelAction"/>

core/src/233/main/resources/META-INF/autodev-core.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,10 @@
336336

337337
<add-to-group group-id="EditorPopupMenu" anchor="first"/>
338338
</action>
339+
<group id="AutoDev.ToolWindow.Snippet.DependenciesToolbar">
340+
<action id="AutoDev.ToolWindow.Snippet.DependenciesLabelAction"
341+
class="cc.unitmesh.devti.gui.snippet.AutoDevDependenciesLabelAction"/>
342+
</group>
339343

340344
<group id="AutoDev.ToolWindow.Snippet.Toolbar">
341345
<action id="AutoDev.ToolWindow.Snippet.LanguageLabelAction"
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package cc.unitmesh.devti.gui.snippet
2+
3+
import com.intellij.openapi.actionSystem.ActionUpdateThread
4+
import com.intellij.openapi.actionSystem.AnActionEvent
5+
import com.intellij.openapi.actionSystem.CommonDataKeys
6+
import com.intellij.openapi.actionSystem.Presentation
7+
import com.intellij.openapi.actionSystem.ex.CustomComponentAction
8+
import com.intellij.openapi.fileEditor.FileDocumentManager
9+
import com.intellij.openapi.project.DumbAwareAction
10+
import com.intellij.openapi.util.Key
11+
import com.intellij.testFramework.LightVirtualFile
12+
import com.intellij.ui.components.JBLabel
13+
import com.intellij.util.ui.UIUtil
14+
import javax.swing.JComponent
15+
16+
class AutoDevDependenciesLabelAction : DumbAwareAction(), CustomComponentAction {
17+
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
18+
19+
override fun createCustomComponent(presentation: Presentation, place: String): JComponent {
20+
val languageId = presentation.getClientProperty(DEPENDENCIES_PRESENTATION_KEY) ?: ""
21+
val jBLabel: JComponent = JBLabel(languageId)
22+
jBLabel.setOpaque(false)
23+
jBLabel.setForeground(UIUtil.getLabelInfoForeground())
24+
return jBLabel
25+
}
26+
27+
override fun updateCustomComponent(component: JComponent, presentation: Presentation) {
28+
if (component !is JBLabel) return
29+
30+
val filename = presentation.getClientProperty(DEPENDENCIES_PRESENTATION_KEY) ?: ""
31+
if (filename.isNotBlank()) {
32+
component.text = "SCA: $filename"
33+
}
34+
}
35+
36+
override fun actionPerformed(e: AnActionEvent) {
37+
38+
}
39+
40+
override fun update(e: AnActionEvent) {
41+
val editor = e.dataContext.getData(CommonDataKeys.EDITOR) ?: return
42+
val lightVirtualFile = FileDocumentManager.getInstance().getFile(editor.document) as? LightVirtualFile ?: return
43+
e.presentation.putClientProperty(DEPENDENCIES_PRESENTATION_KEY, lightVirtualFile.name)
44+
}
45+
46+
companion object {
47+
val DEPENDENCIES_PRESENTATION_KEY: Key<String> = Key.create("DependenciesPresentationKey")
48+
}
49+
}

core/src/main/kotlin/cc/unitmesh/devti/provider/BuildSystemProvider.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ import com.intellij.util.xmlb.annotations.Attribute
1616
abstract class BuildSystemProvider : LazyExtensionInstance<BuildSystemProvider>() {
1717
abstract fun collect(project: Project): DockerfileContext?
1818

19+
/**
20+
* the DeclarePackageFile means `build.gradle`, `pom.xml`, `build.sbt`, `package.json` etc.
21+
*/
22+
abstract fun isDeclarePackageFile(filename: String): Boolean
23+
1924
/**
2025
* For PsiFile only for resolve in Sketch and Bridge mode
2126
* the BuildFilePsiFile means `build.gradle`, `pom.xml`, `build.sbt`, `package.json` etc.
@@ -40,6 +45,14 @@ abstract class BuildSystemProvider : LazyExtensionInstance<BuildSystemProvider>(
4045
it.collect(project)
4146
}
4247
}
48+
49+
fun isDeclarePackageFile(filename: String?): Boolean {
50+
if (filename == null) return false
51+
52+
return EP_NAME.extensionList.any {
53+
it.isDeclarePackageFile(filename)
54+
}
55+
}
4356
}
4457
}
4558

core/src/main/kotlin/cc/unitmesh/devti/sketch/ui/LangSketch.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.intellij.openapi.actionSystem.ActionGroup
66
import com.intellij.openapi.actionSystem.ActionManager
77
import com.intellij.openapi.actionSystem.ActionPlaces
88
import com.intellij.openapi.actionSystem.ActionToolbar
9+
import com.intellij.openapi.actionSystem.DefaultActionGroup
910
import com.intellij.openapi.editor.Editor
1011
import com.intellij.openapi.editor.colors.EditorColorsListener
1112
import com.intellij.openapi.editor.colors.EditorColorsManager
@@ -25,12 +26,13 @@ interface LangSketch : Disposable {
2526
*/
2627
fun onDoneStream(allText: String) {}
2728

28-
fun setupActionBar(project: Project, editor: Editor) {
29-
val toolbar = actionToolbar() ?: return
29+
fun setupActionBar(project: Project, editor: Editor, isDeclarePackageFile: Boolean) {
30+
val toolbar = collectActionBar(isDeclarePackageFile) ?: return
3031

3132
if (editor is EditorEx) {
3233
toolbar.component.setBackground(editor.backgroundColor)
3334
}
35+
3436
toolbar.component.setOpaque(true)
3537
toolbar.targetComponent = editor.contentComponent
3638
editor.headerComponent = toolbar.component
@@ -44,9 +46,14 @@ interface LangSketch : Disposable {
4446
})
4547
}
4648

47-
fun actionToolbar(): ActionToolbar? {
48-
val toolbarActionGroup = ActionManager.getInstance().getAction("AutoDev.ToolWindow.Snippet.Toolbar") as? ActionGroup
49-
?: return null
49+
fun collectActionBar(isDeclarePackageFile: Boolean): ActionToolbar? {
50+
val toolbarActionGroup = if (isDeclarePackageFile) {
51+
ActionManager.getInstance().getAction("AutoDev.ToolWindow.Snippet.DependenciesToolbar") as? ActionGroup
52+
?: return null
53+
} else {
54+
ActionManager.getInstance().getAction("AutoDev.ToolWindow.Snippet.Toolbar") as? ActionGroup
55+
?: return null
56+
}
5057

5158
val toolbar = ActionManager.getInstance()
5259
.createActionToolbar(ActionPlaces.MAIN_TOOLBAR, toolbarActionGroup, true)

core/src/main/kotlin/cc/unitmesh/devti/sketch/ui/code/CodeHighlightSketch.kt

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@ package cc.unitmesh.devti.sketch.ui.code
22

33
import cc.unitmesh.devti.AutoDevNotifications
44
import cc.unitmesh.devti.devin.dataprovider.BuiltinCommand
5+
import cc.unitmesh.devti.provider.BuildSystemProvider
56
import cc.unitmesh.devti.provider.RunService
7+
import cc.unitmesh.devti.sketch.ui.LangSketch
8+
import cc.unitmesh.devti.sketch.ui.LanguageSketchProvider
69
import cc.unitmesh.devti.util.parser.CodeFence
10+
import com.intellij.ide.scratch.ScratchRootType
711
import com.intellij.lang.Language
812
import com.intellij.openapi.Disposable
913
import com.intellij.openapi.actionSystem.DataProvider
@@ -20,24 +24,21 @@ import com.intellij.openapi.editor.ex.FocusChangeListener
2024
import com.intellij.openapi.editor.ex.MarkupModelEx
2125
import com.intellij.openapi.editor.highlighter.EditorHighlighterFactory
2226
import com.intellij.openapi.fileEditor.FileDocumentManager
27+
import com.intellij.openapi.fileEditor.FileEditor
28+
import com.intellij.openapi.fileEditor.FileEditorProvider
29+
import com.intellij.openapi.fileEditor.TextEditorWithPreview
2330
import com.intellij.openapi.fileTypes.PlainTextLanguage
2431
import com.intellij.openapi.project.Project
32+
import com.intellij.openapi.util.text.StringUtil
2533
import com.intellij.openapi.vfs.VirtualFile
34+
import com.intellij.psi.PsiManager
35+
import com.intellij.temporary.gui.block.whenDisposed
2636
import com.intellij.testFramework.LightVirtualFile
2737
import com.intellij.ui.JBColor
2838
import com.intellij.ui.components.JBPanel
2939
import com.intellij.util.concurrency.annotations.RequiresReadLock
30-
import com.intellij.util.ui.JBUI
31-
import cc.unitmesh.devti.sketch.ui.LangSketch
32-
import cc.unitmesh.devti.sketch.ui.LanguageSketchProvider
33-
import com.intellij.ide.scratch.ScratchRootType
34-
import com.intellij.openapi.fileEditor.FileEditor
35-
import com.intellij.openapi.fileEditor.FileEditorProvider
36-
import com.intellij.openapi.fileEditor.TextEditorWithPreview
37-
import com.intellij.openapi.util.text.StringUtil
38-
import com.intellij.psi.PsiManager
39-
import com.intellij.temporary.gui.block.whenDisposed
4040
import com.intellij.util.ui.JBEmptyBorder
41+
import com.intellij.util.ui.JBUI
4142
import java.awt.BorderLayout
4243
import javax.swing.BoxLayout
4344
import javax.swing.JButton
@@ -95,8 +96,9 @@ open class CodeHighlightSketch(
9596

9697
add(editorFragment!!.getContent(), BorderLayout.CENTER)
9798

99+
val isDeclarePackageFile = BuildSystemProvider.isDeclarePackageFile(fileName)
98100
if (textLanguage != null && textLanguage?.lowercase() != "markdown" && ideaLanguage != PlainTextLanguage.INSTANCE) {
99-
setupActionBar(project, editor)
101+
setupActionBar(project, editor, isDeclarePackageFile)
100102
} else {
101103
editor.backgroundColor = JBColor.PanelBackground
102104
}
@@ -161,15 +163,17 @@ open class CodeHighlightSketch(
161163

162164
val currentText = getViewText()
163165
if (currentText.startsWith("/" + BuiltinCommand.WRITE.commandName + ":")) {
164-
/// get fileName after : and before \n
165166
processWriteCommand(currentText)
167+
/// get fileName after : and before \n
166168
val fileName = currentText.lines().firstOrNull()?.substringAfter(":")
167-
val ext = fileName?.substringAfterLast(".")
168-
val parse = CodeFence.parse(editorFragment!!.editor.document.text)
169-
val language = if (ext != null) CodeFence.findLanguage(ext) else ideaLanguage
170-
val sketch = CodeHighlightSketch(project, parse.text, language, editorLineThreshold, fileName)
171-
add(sketch, BorderLayout.SOUTH)
172-
return
169+
if (BuildSystemProvider.isDeclarePackageFile(fileName)) {
170+
val ext = fileName?.substringAfterLast(".")
171+
val parse = CodeFence.parse(editorFragment!!.editor.document.text)
172+
val language = if (ext != null) CodeFence.findLanguage(ext) else ideaLanguage
173+
val sketch = CodeHighlightSketch(project, parse.text, language, editorLineThreshold, fileName)
174+
add(sketch, BorderLayout.SOUTH)
175+
return
176+
}
173177
}
174178

175179
val parse = CodeFence.parse(editorFragment!!.editor.document.text)

exts/ext-dependencies/src/233/main/resources/cc.unitmesh.dependencies.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
icon="AllIcons.Actions.DependencyAnalyzer"
1010
class="cc.unitmesh.dependencies.AutoDevDependenciesCheck">
1111

12-
<add-to-group group-id="AutoDev.ToolWindow.Snippet.Toolbar" />
12+
<add-to-group group-id="AutoDev.ToolWindow.Snippet.DependenciesToolbar" />
1313
</action>
1414
</actions>
1515

goland/src/main/kotlin/cc/unitmesh/go/provider/GoBuildSystemProvider.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ class GoBuildSystemProvider : BuildSystemProvider() {
2020
return null
2121
}
2222

23+
override fun isDeclarePackageFile(filename: String): Boolean {
24+
return filename == "go.mod"
25+
}
26+
2327
override fun collectDependencies(
2428
project: Project,
2529
buildFilePsi: PsiFile

java/src/main/kotlin/cc/unitmesh/idea/provider/JavaBuildSystemProvider.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ open class JavaBuildSystemProvider : BuildSystemProvider() {
5555
)
5656
}
5757

58+
override fun isDeclarePackageFile(filename: String): Boolean {
59+
return filename == "build.gradle" || filename == "pom.xml" || filename == "build.gradle.kts"
60+
}
61+
5862
override fun collectDependencies(
5963
project: Project,
6064
buildFilePsi: PsiFile

javascript/src/main/kotlin/cc/unitmesh/ide/javascript/provider/JavaScriptBuildSystemProvider.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ class JavaScriptBuildSystemProvider : BuildSystemProvider() {
8787
)
8888
}
8989

90+
override fun isDeclarePackageFile(filename: String): Boolean {
91+
return filename == "package.json"
92+
}
93+
9094
override fun collectDependencies(project: Project, buildFilePsi: PsiFile): List<DevPackage> {
9195
val packageJson = buildFilePsi as? JsonFile ?: return emptyList()
9296
return PackageJsonUtil.getDependencies(packageJson, PackageJsonUtil.PROD_DEV_DEPENDENCIES)

pycharm/src/main/kotlin/cc/unitmesh/python/provider/PythonBuildSystemProvider.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ import com.jetbrains.python.packaging.PyRequirementParser
1111
class PythonBuildSystemProvider : BuildSystemProvider() {
1212
override fun collect(project: Project): DockerfileContext? = null
1313

14+
override fun isDeclarePackageFile(filename: String): Boolean {
15+
return filename == "requirements.txt" || filename == "Pipfile" || filename == "pyproject.toml"
16+
}
17+
1418
override fun collectDependencies(project: Project, buildFilePsi: PsiFile): List<DevPackage> {
1519
val reqs: List<PyRequirement> = PyRequirementParser.fromFile(buildFilePsi.virtualFile)
1620

0 commit comments

Comments
 (0)