C/C++ plugin - added C support

This commit is contained in:
Gregory Bednov 2025-01-10 19:57:22 +03:00
commit ff8f68ec03
2 changed files with 103 additions and 0 deletions

View file

@ -0,0 +1,65 @@
package org.gregorybednov.clsp
import com.intellij.execution.configurations.GeneralCommandLine
import com.intellij.lang.Language
import com.intellij.notification.NotificationGroupManager
import com.intellij.notification.NotificationType
import com.intellij.openapi.fileTypes.LanguageFileType
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.IconLoader.getIcon
import com.intellij.util.EnvironmentUtil
import com.redhat.devtools.lsp4ij.LanguageServerFactory
import com.redhat.devtools.lsp4ij.LanguageServerManager
import com.redhat.devtools.lsp4ij.server.OSProcessStreamConnectionProvider
import com.redhat.devtools.lsp4ij.server.StreamConnectionProvider
import javax.swing.Icon
import org.jetbrains.annotations.NotNull
import java.io.File
import java.nio.file.Paths
import kotlin.io.path.pathString
object CLanguage : Language("C") {
private fun readResolve(): Any = CLanguage
val INSTANCE: CLanguage = CLanguage
}
object CIcon {
val FILE: Icon = getIcon("/icons/clogo.svg", CIcon::class.java)
}
class CFileType private constructor() : LanguageFileType(CLanguage.INSTANCE) {
override fun getName(): String { return "C File" }
override fun getDescription(): String { return "C language file" }
override fun getDefaultExtension(): String { return "c" }
override fun getIcon(): Icon { return CIcon.FILE }
companion object { val INSTANCE: CFileType = CFileType() }
}
class CLanguageServer(project: Project) : OSProcessStreamConnectionProvider() {
private fun findExecutableInPATH(executable: String) =
EnvironmentUtil.getEnvironmentMap().values.flatMap { it.split(File.pathSeparator) }
.map { File(Paths.get(it, executable).pathString) }.find { it.exists() && it.canExecute() }?.path
init {
val clangdPath = findExecutableInPATH("clangd")
if (clangdPath.isNullOrEmpty()) {
NotificationGroupManager.getInstance().getNotificationGroup("C/C++ notifications").createNotification(
"C LSP",
"LSP server clangd not found. Make sure it is installed properly (and is available in PATH)," +
"and restart the IDE.",
NotificationType.ERROR).notify(project)
LanguageServerManager.getInstance(project).stop("CLanguageServer")
} else {
val commandLine = GeneralCommandLine("clangd")
commandLine.setWorkDirectory(project.basePath)
super.setCommandLine(commandLine)
}
}
}
class CLanguageServerFactory : LanguageServerFactory {
@NotNull
override fun createConnectionProvider(project: Project): StreamConnectionProvider {
return CLanguageServer(project)
}
}

View file

@ -0,0 +1,38 @@
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 38.000089 42.000031"
width="16"
height="16"
version="1.1"
id="svg10"
>
<defs
id="defs14" />
<path
fill="#283593"
fill-rule="evenodd"
d="m 17.903,0.28628166 c 0.679,-0.381 1.515,-0.381 2.193,0 C 23.451,2.1692817 33.547,7.8372817 36.903,9.7202817 37.582,10.100282 38,10.804282 38,11.566282 c 0,3.766 0,15.101 0,18.867 0,0.762 -0.418,1.466 -1.097,1.847 -3.355,1.883 -13.451,7.551 -16.807,9.434 -0.679,0.381 -1.515,0.381 -2.193,0 -3.355,-1.883 -13.451,-7.551 -16.807,-9.434 -0.678,-0.381 -1.096,-1.084 -1.096,-1.846 0,-3.766 0,-15.101 0,-18.867 0,-0.762 0.418,-1.466 1.097,-1.8470003 3.354,-1.883 13.452,-7.551 16.806,-9.43400004 z"
clip-rule="evenodd"
id="path2"
style="fill:#004482;fill-opacity:1" />
<path
fill="#5c6bc0"
fill-rule="evenodd"
d="m 0.304,31.404282 c -0.266,-0.356 -0.304,-0.694 -0.304,-1.149 0,-3.744 0,-15.014 0,-18.759 0,-0.758 0.417,-1.458 1.094,-1.8360003 3.343,-1.872 13.405,-7.507 16.748,-9.38000004 0.677,-0.379 1.594,-0.371 2.271,0.008 3.343,1.87200004 13.371,7.45900004 16.714,9.33100004 0.27,0.152 0.476,0.335 0.66,0.5760003 z"
clip-rule="evenodd"
id="path4"
style="fill:#659ad2;fill-opacity:1" />
<path
fill="#ffffff"
fill-rule="evenodd"
d="m 19,7.0002817 c 7.727,0 14,6.2730003 14,14.0000003 0,7.727 -6.273,14 -14,14 -7.727,0 -14,-6.273 -14,-14 0,-7.727 6.273,-14.0000003 14,-14.0000003 z m 0,7.0000003 c 3.863,0 7,3.136 7,7 0,3.863 -3.137,7 -7,7 -3.863,0 -7,-3.137 -7,-7 0,-3.864 3.136,-7 7,-7 z"
clip-rule="evenodd"
id="path6" />
<path
fill="#3949ab"
fill-rule="evenodd"
d="m 37.485,10.205282 c 0.516,0.483 0.506,1.211 0.506,1.784 0,3.795 -0.032,14.589 0.009,18.384 0.004,0.396 -0.127,0.813 -0.323,1.127 l -19.084,-10.5 z"
clip-rule="evenodd"
id="path8"
style="fill:#00599c;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB