Skip to content

Commit

Permalink
feat(clion): try with oc
Browse files Browse the repository at this point in the history
  • Loading branch information
phodal committed Aug 6, 2023
1 parent 0625702 commit 4593cb8
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 1 deletion.
2 changes: 1 addition & 1 deletion build.gradle.kts
Expand Up @@ -57,7 +57,7 @@ val pycharmPlugins = listOf("PythonCore")
val javaPlugins = listOf("com.intellij.java", "org.jetbrains.kotlin")
//val kotlinPlugins = listOf("org.jetbrains.kotlin")
val clionVersion = prop("clionVersion")
val clionPlugins = listOf("com.intellij.cidr.base", "com.intellij.clion", "org.rust.lang:0.4.186.5143-223", "org.toml.lang")
val clionPlugins = listOf("com.intellij.cidr.base", "com.intellij.cidr.lang", "com.intellij.clion", "org.rust.lang:0.4.186.5143-223", "org.toml.lang")

val pluginProjects: List<Project> get() = rootProject.allprojects.toList()
val ideaPlugins =
Expand Down
@@ -0,0 +1,48 @@
package cc.unitmesh.clion.oc.context

import cc.unitmesh.devti.context.ClassContext
import cc.unitmesh.devti.context.builder.ClassContextBuilder
import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil.getChildrenOfTypeAsList
import com.jetbrains.cidr.lang.psi.OCDeclaration
import com.jetbrains.cidr.lang.psi.OCFunctionDeclaration
import com.jetbrains.cidr.lang.psi.OCStructLike

class OcClassContextBuilder : ClassContextBuilder {
override fun getClassContext(psiElement: PsiElement, gatherUsages: Boolean): ClassContext? {

if (psiElement !is OCStructLike) return null

val symbol = psiElement.symbol ?: return null
val locateDefinition = symbol.locateDefinition(psiElement.project) ?: return null

if (locateDefinition !is OCStructLike) return null

val definitionSymbol = locateDefinition.symbol ?: return null
val text = locateDefinition.text
val name = locateDefinition.name!!

val functionDecls: List<PsiElement> =
getChildrenOfTypeAsList(locateDefinition, OCFunctionDeclaration::class.java)
val decls: List<*> = getChildrenOfTypeAsList(locateDefinition, OCDeclaration::class.java)

val fields: MutableList<PsiElement> = mutableListOf()
for (decl in decls) {
if ((decl as OCDeclaration).declarators.isNotEmpty()) {
fields.add(decl)
}
}

val superClasses: List<String> = definitionSymbol.getBaseCppClasses(locateDefinition).map { it.name }

return ClassContext(
locateDefinition,
text,
name,
functionDecls,
fields,
superClasses,
emptyList()
)
}
}
2 changes: 2 additions & 0 deletions clion/src/main/resources/cc.unitmesh.clion.xml
Expand Up @@ -8,6 +8,8 @@
</dependencies>

<extensions defaultExtensionNs="cc.unitmesh">
<classContextBuilder language="ObjectiveC"
implementationClass="cc.unitmesh.clion.oc.context.OcClassContextBuilder"/>
<classContextBuilder language="Rust"
implementationClass="cc.unitmesh.clion.context.RustClassContextBuilder"/>
<contextPrompter language="Rust" implementation="cc.unitmesh.clion.provider.RustContextPrompter"/>
Expand Down

0 comments on commit 4593cb8

Please sign in to comment.