Skip to content

Commit cd6ccae

Browse files
committed
feat(cpp): add CMakefileUtil and CppBuildSystemProvider
- Add CMakefileUtil to collect CMake-related config files in a project. - Add CppBuildSystemProvider to collect Dockerfile context for C++ projects using CMake. - Update plugin XML files to include the new providers.
1 parent bb56c70 commit cd6ccae

File tree

6 files changed

+75
-22
lines changed

6 files changed

+75
-22
lines changed

cpp/src/main/kotlin/cc/unitmesh/cpp/provider/CLionWorkspaceContextProvider.kt

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,11 @@ import cc.unitmesh.devti.provider.context.ChatCreationContext
66
import com.intellij.execution.wsl.WslPath
77
import com.intellij.openapi.diagnostic.logger
88
import com.intellij.openapi.project.Project
9-
import com.intellij.openapi.project.guessProjectDir
10-
import com.intellij.openapi.roots.ProjectRootManager
11-
import com.intellij.openapi.vfs.VirtualFile
12-
import com.jetbrains.cidr.cpp.cmake.workspace.CMakeWorkspace
139
import com.jetbrains.cidr.lang.OCLanguage
1410
import com.jetbrains.cidr.project.workspace.CidrWorkspace
1511
import java.io.File
1612

1713
class CLionWorkspaceContextProvider : ChatContextProvider {
18-
private val configFiles = listOf(
19-
"CMakeLists.txt", "meson.build", "Makefile", "ninja.build",
20-
"vcpkg.json", "BUILD", "sln", "vcxproj", "vcproj"
21-
)
2214

2315
override fun isApplicable(project: Project, creationContext: ChatCreationContext): Boolean {
2416
return creationContext.sourceFile?.language is OCLanguage
@@ -44,7 +36,7 @@ class CLionWorkspaceContextProvider : ChatContextProvider {
4436
}
4537

4638
private fun createConfigFilesItem(project: Project): ChatContextItem {
47-
val configFiles = collectConfigFiles(project)
39+
val configFiles = CMakefileUtil.collectConfigFiles(project)
4840
val configFileNames = configFiles.joinToString(", ") { it.name }
4941
return ChatContextItem(
5042
CLionWorkspaceContextProvider::class,
@@ -110,14 +102,4 @@ class CLionWorkspaceContextProvider : ChatContextProvider {
110102
}
111103
}
112104

113-
private fun collectConfigFiles(project: Project): Collection<VirtualFile> =
114-
ProjectRootManager.getInstance(project).contentRoots
115-
.asSequence()
116-
.filter { it.isDirectory }
117-
.map { it.children }
118-
.map { file ->
119-
file.filter { configFiles.contains(it.name) || configFiles.contains(it.extension) }
120-
}
121-
.flatten()
122-
.toList()
123105
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package cc.unitmesh.cpp.provider
2+
3+
import com.intellij.openapi.project.Project
4+
import com.intellij.openapi.roots.ProjectRootManager
5+
import com.intellij.openapi.vfs.VirtualFile
6+
7+
object CMakefileUtil {
8+
val configFiles = listOf(
9+
"CMakeLists.txt", "meson.build", "Makefile", "ninja.build",
10+
"vcpkg.json", "BUILD", "sln", "vcxproj", "vcproj"
11+
)
12+
13+
fun collectConfigFiles(project: Project): Collection<VirtualFile> =
14+
ProjectRootManager.getInstance(project).contentRoots
15+
.asSequence()
16+
.filter { it.isDirectory }
17+
.map { it.children }
18+
.map { file ->
19+
file.filter { configFiles.contains(it.name) || configFiles.contains(it.extension) }
20+
}
21+
.flatten()
22+
.toList()
23+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package cc.unitmesh.cpp.provider
2+
3+
import cc.unitmesh.devti.provider.BuildSystemProvider
4+
import cc.unitmesh.devti.template.context.DockerfileContext
5+
import com.intellij.openapi.project.Project
6+
import com.intellij.openapi.vfs.VirtualFile
7+
import com.jetbrains.cidr.cpp.cmake.workspace.CMakeWorkspace
8+
9+
class CppBuildSystemProvider : BuildSystemProvider() {
10+
override fun collect(project: Project): DockerfileContext? {
11+
val config = CMakefileUtil.collectConfigFiles(project)
12+
if (config.isEmpty()) {
13+
return null
14+
}
15+
16+
if (config.any { it.name == "CMakeLists.txt" }) {
17+
return buildCMakefileContext(config.filter { it.name == "CMakeLists.txt" }, project)
18+
}
19+
20+
return null
21+
}
22+
23+
val cmakeMinimumRequiredRegex = Regex("""\bcmake_minimum_required\s*\(\s*VERSION\s*(\d+(\.\d+)*)\s*\)""")
24+
private fun buildCMakefileContext(config: Collection<VirtualFile>, project: Project): DockerfileContext? {
25+
val buildToolName = "CMake"
26+
val buildToolVersion = config.firstOrNull()?.let {
27+
val content = it.inputStream.bufferedReader().readText()
28+
val version = cmakeMinimumRequiredRegex.find(content)?.groupValues?.get(1)
29+
version
30+
} ?: "unknown"
31+
32+
val cMakeWorkspace = CMakeWorkspace.getInstance(project)
33+
if (cMakeWorkspace.isInitialized) {
34+
// todo :load version from cmakefile
35+
}
36+
37+
return DockerfileContext(
38+
buildToolName = buildToolName,
39+
buildToolVersion = buildToolVersion,
40+
languageName = "C++",
41+
languageVersion = "unknown",
42+
taskString = config.firstOrNull()?.contentsToByteArray()?.let { String(it) } ?: ""
43+
)
44+
45+
}
46+
}

cpp/src/main/resources/cc.unitmesh.cpp.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,9 @@
1919
<codeModifier
2020
language="ObjectiveC"
2121
implementationClass="cc.unitmesh.cpp.provider.CppCodeModifier"/>
22+
23+
24+
<buildSystemProvider
25+
implementation="cc.unitmesh.cpp.provider.CppBuildSystemProvider"/>
2226
</extensions>
2327
</idea-plugin>

kotlin/src/main/resources/cc.unitmesh.kotlin.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,5 @@
4242
<customPromptProvider
4343
language="kotlin"
4444
implementationClass="cc.unitmesh.kotlin.provider.KotlinCustomPromptProvider" />
45-
46-
<!-- <buildSystemProvider-->
47-
<!-- implementation="cc.unitmesh.kotlin.provider.KotlinBuildSystemProvider"/>-->
4845
</extensions>
4946
</idea-plugin>

rust/src/main/resources/cc.unitmesh.rust.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@
2323
<livingDocumentation language="Rust"
2424
implementationClass="cc.unitmesh.rust.provider.RustLivingDocumentation"/>
2525

26+
<testContextProvider implementation="cc.unitmesh.rust.provider.RustTestContextProvider"/>
2627
</extensions>
2728
</idea-plugin>

0 commit comments

Comments
 (0)