Skip to content

Commit

Permalink
feat(cpp): add CMakefileUtil and CppBuildSystemProvider
Browse files Browse the repository at this point in the history
- 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.
  • Loading branch information
phodal committed Jan 17, 2024
1 parent bb56c70 commit cd6ccae
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 22 deletions.
Expand Up @@ -6,19 +6,11 @@ import cc.unitmesh.devti.provider.context.ChatCreationContext
import com.intellij.execution.wsl.WslPath
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.guessProjectDir
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.vfs.VirtualFile
import com.jetbrains.cidr.cpp.cmake.workspace.CMakeWorkspace
import com.jetbrains.cidr.lang.OCLanguage
import com.jetbrains.cidr.project.workspace.CidrWorkspace
import java.io.File

class CLionWorkspaceContextProvider : ChatContextProvider {
private val configFiles = listOf(
"CMakeLists.txt", "meson.build", "Makefile", "ninja.build",
"vcpkg.json", "BUILD", "sln", "vcxproj", "vcproj"
)

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

private fun createConfigFilesItem(project: Project): ChatContextItem {
val configFiles = collectConfigFiles(project)
val configFiles = CMakefileUtil.collectConfigFiles(project)
val configFileNames = configFiles.joinToString(", ") { it.name }
return ChatContextItem(
CLionWorkspaceContextProvider::class,
Expand Down Expand Up @@ -110,14 +102,4 @@ class CLionWorkspaceContextProvider : ChatContextProvider {
}
}

private fun collectConfigFiles(project: Project): Collection<VirtualFile> =
ProjectRootManager.getInstance(project).contentRoots
.asSequence()
.filter { it.isDirectory }
.map { it.children }
.map { file ->
file.filter { configFiles.contains(it.name) || configFiles.contains(it.extension) }
}
.flatten()
.toList()
}
23 changes: 23 additions & 0 deletions cpp/src/main/kotlin/cc/unitmesh/cpp/provider/CMakefileUtil.kt
@@ -0,0 +1,23 @@
package cc.unitmesh.cpp.provider

import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.vfs.VirtualFile

object CMakefileUtil {
val configFiles = listOf(
"CMakeLists.txt", "meson.build", "Makefile", "ninja.build",
"vcpkg.json", "BUILD", "sln", "vcxproj", "vcproj"
)

fun collectConfigFiles(project: Project): Collection<VirtualFile> =
ProjectRootManager.getInstance(project).contentRoots
.asSequence()
.filter { it.isDirectory }
.map { it.children }
.map { file ->
file.filter { configFiles.contains(it.name) || configFiles.contains(it.extension) }
}
.flatten()
.toList()
}
@@ -0,0 +1,46 @@
package cc.unitmesh.cpp.provider

import cc.unitmesh.devti.provider.BuildSystemProvider
import cc.unitmesh.devti.template.context.DockerfileContext
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.jetbrains.cidr.cpp.cmake.workspace.CMakeWorkspace

class CppBuildSystemProvider : BuildSystemProvider() {
override fun collect(project: Project): DockerfileContext? {
val config = CMakefileUtil.collectConfigFiles(project)
if (config.isEmpty()) {
return null
}

if (config.any { it.name == "CMakeLists.txt" }) {
return buildCMakefileContext(config.filter { it.name == "CMakeLists.txt" }, project)
}

return null
}

val cmakeMinimumRequiredRegex = Regex("""\bcmake_minimum_required\s*\(\s*VERSION\s*(\d+(\.\d+)*)\s*\)""")
private fun buildCMakefileContext(config: Collection<VirtualFile>, project: Project): DockerfileContext? {
val buildToolName = "CMake"
val buildToolVersion = config.firstOrNull()?.let {
val content = it.inputStream.bufferedReader().readText()
val version = cmakeMinimumRequiredRegex.find(content)?.groupValues?.get(1)
version
} ?: "unknown"

val cMakeWorkspace = CMakeWorkspace.getInstance(project)
if (cMakeWorkspace.isInitialized) {
// todo :load version from cmakefile
}

return DockerfileContext(
buildToolName = buildToolName,
buildToolVersion = buildToolVersion,
languageName = "C++",
languageVersion = "unknown",
taskString = config.firstOrNull()?.contentsToByteArray()?.let { String(it) } ?: ""
)

}
}
4 changes: 4 additions & 0 deletions cpp/src/main/resources/cc.unitmesh.cpp.xml
Expand Up @@ -19,5 +19,9 @@
<codeModifier
language="ObjectiveC"
implementationClass="cc.unitmesh.cpp.provider.CppCodeModifier"/>


<buildSystemProvider
implementation="cc.unitmesh.cpp.provider.CppBuildSystemProvider"/>
</extensions>
</idea-plugin>
3 changes: 0 additions & 3 deletions kotlin/src/main/resources/cc.unitmesh.kotlin.xml
Expand Up @@ -42,8 +42,5 @@
<customPromptProvider
language="kotlin"
implementationClass="cc.unitmesh.kotlin.provider.KotlinCustomPromptProvider" />

<!-- <buildSystemProvider-->
<!-- implementation="cc.unitmesh.kotlin.provider.KotlinBuildSystemProvider"/>-->
</extensions>
</idea-plugin>
1 change: 1 addition & 0 deletions rust/src/main/resources/cc.unitmesh.rust.xml
Expand Up @@ -23,5 +23,6 @@
<livingDocumentation language="Rust"
implementationClass="cc.unitmesh.rust.provider.RustLivingDocumentation"/>

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

0 comments on commit cd6ccae

Please sign in to comment.