Skip to content

Commit f98ee90

Browse files
committed
feat(context): add CppVariableContextBuilder
This commit adds a new file `CppVariableContextBuilder.kt` which implements the `VariableContextBuilder` interface. It provides the functionality to retrieve the variable context for a given `PsiElement` in C++ code. The `getVariableContext` function filters out `OCDeclaration` elements, extracts the declarators, and maps them to `VariableContext` objects. The first `VariableContext` object is returned as the result.
1 parent f8208f9 commit f98ee90

File tree

5 files changed

+63
-8
lines changed

5 files changed

+63
-8
lines changed

cpp/src/main/kotlin/cc/unitmesh/cpp/context/CppMethodContextBuilder.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class CppMethodContextBuilder : MethodContextBuilder {
1919

2020
val symbol: OCSymbolWithQualifiedName = psiElement.symbol ?: return null
2121
val locateDefinition = symbol.locateDefinition(psiElement.project) ?: return null
22-
val function = (locateDefinition as? OCFunctionDefinition) ?: return null
22+
val function = (psiElement as? OCFunctionDefinition) ?: return null
2323

2424
val structDeclaration = if (includeClassContext) (psiElement as? OCMethod)?.containingClass else null
2525

@@ -33,7 +33,7 @@ class CppMethodContextBuilder : MethodContextBuilder {
3333
function.name!!,
3434
symbol.getSignature(psiElement.project),
3535
structDeclaration,
36-
"Cpp",
36+
"c++",
3737
returnType,
3838
parameterList,
3939
includeClassContext,
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package cc.unitmesh.cpp.context
2+
3+
import cc.unitmesh.devti.context.VariableContext
4+
import cc.unitmesh.devti.context.builder.VariableContextBuilder
5+
import com.intellij.psi.PsiElement
6+
import com.jetbrains.cidr.lang.psi.*
7+
import com.intellij.psi.util.PsiTreeUtil
8+
9+
class CppVariableContextBuilder : VariableContextBuilder {
10+
override fun getVariableContext(
11+
psiElement: PsiElement,
12+
includeMethodContext: Boolean,
13+
includeClassContext: Boolean,
14+
gatherUsages: Boolean
15+
): VariableContext? {
16+
if (psiElement !is OCDeclaration) return null
17+
18+
val declarators = psiElement.declarators
19+
val symbols = declarators.filterIsInstance<OCDeclarator>()
20+
.mapNotNull { it.symbol }
21+
.filter { it.kind.isVariable }
22+
23+
val variableContexts = symbols.map { declarator ->
24+
val text = psiElement.text
25+
val enclosingMethod = PsiTreeUtil.getParentOfType(psiElement, OCFunctionDeclaration::class.java, true)
26+
val enclosingClass = PsiTreeUtil.getParentOfType(psiElement, OCStructLike::class.java, true)
27+
28+
VariableContext(
29+
psiElement,
30+
text,
31+
declarator.name,
32+
enclosingMethod,
33+
enclosingClass,
34+
emptyList(),
35+
includeMethodContext,
36+
includeClassContext
37+
)
38+
}
39+
40+
return variableContexts.firstOrNull()
41+
}
42+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
implementationClass="cc.unitmesh.cpp.context.CppStructContextBuilder"/>
1414
<methodContextBuilder language="ObjectiveC"
1515
implementationClass="cc.unitmesh.cpp.context.CppMethodContextBuilder"/>
16+
<variableContextBuilder language="ObjectiveC"
17+
implementationClass="cc.unitmesh.cpp.context.CppVariableContextBuilder"/>
1618

1719
<chatContextProvider implementation="cc.unitmesh.cpp.provider.CLionWorkspaceContextProvider"/>
1820
</extensions>

cpp/src/test/kotlin/cc/unitmesh/cpp/context/CppMethodContextBuilderTest.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,17 @@ class CppMethodContextBuilderTest : BasePlatformTestCase() {
2929
val type = PsiTreeUtil.getChildrenOfTypeAsList(decl, OCTypeElement::class.java).first()
3030
val clz = PsiTreeUtil.getChildrenOfTypeAsList(type, OCStructLike::class.java).first()
3131
val function = PsiTreeUtil.getChildrenOfTypeAsList(clz, OCFunctionDeclaration::class.java).first()
32-
println(function.text)
3332

3433
// // when
35-
// val result = CppMethodContextBuilder()
36-
// .getMethodContext(function, true, true)!!
34+
val result = CppMethodContextBuilder()
35+
.getMethodContext(function, false, true)!!
3736
//
3837
// // then
39-
// assertEquals("drive", result.name)
40-
// assertEquals(1, result.paramNames)
41-
// assertEquals(result.format(), "")
38+
assertEquals("drive", result.name)
39+
assertEquals("distance", result.paramNames.joinToString(", "))
40+
assertEquals(result.format(), """path: /src/Car.h
41+
language: c++
42+
fun name: drive
43+
fun signature: void drive(int distance)""")
4244
}
4345
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<idea-plugin package="cc.unitmesh" xmlns:xi="http://www.w3.org/2001/XInclude">
2+
<id>cc.unitmesh.devti</id>
3+
<xi:include href="/META-INF/autodev-core.xml" xpointer="xpointer(/idea-plugin/*)"/>
4+
5+
<!--suppress PluginXmlValidity -->
6+
<content>
7+
<module name="cc.unitmesh.cpp"/>
8+
</content>
9+
</idea-plugin>

0 commit comments

Comments
 (0)