Skip to content

Commit ca96312

Browse files
committed
feat(rust): add process for function call
1 parent c34b9bf commit ca96312

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

chapi-ast-rust/src/main/kotlin/chapi/ast/rustast/RustFullIdentListener.kt

+6-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,12 @@ class RustFullIdentListener(val fileName: String) : RustAstBaseListener(fileName
3838
}
3939

4040
override fun enterMethodCallExpression(ctx: RustParser.MethodCallExpressionContext?) {
41-
val instanceVar = ctx?.expression()?.text
42-
val nodeName = localVars.getOrDefault(instanceVar ?: "", instanceVar)
41+
var instanceVar = ctx?.expression()?.text ?: ""
42+
if (instanceVar.contains("(") && instanceVar.contains(")")) {
43+
instanceVar = instanceVar.substringBefore("(")
44+
}
45+
46+
val nodeName = localVars.getOrDefault(instanceVar, instanceVar)
4347

4448
val functionName = lookupFunctionName(ctx?.pathExprSegment())
4549

chapi-ast-rust/src/test/kotlin/chapi/ast/rustast/RustFullIdentListenerTest.kt

+37-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package chapi.ast.rustast
22

3+
import kotlinx.serialization.encodeToString
4+
import kotlinx.serialization.json.Json
35
import org.junit.jupiter.api.Test
46
import kotlin.test.assertEquals
57

@@ -229,7 +231,6 @@ class RustFullIdentListenerTest {
229231
assertEquals("p", functionCalls[1].OriginNodeName)
230232
}
231233

232-
// self function call, like self.print();
233234
@Test
234235
fun should_identify_self_function_call() {
235236
val code = """
@@ -250,4 +251,39 @@ class RustFullIdentListenerTest {
250251
assertEquals("clone", functionCalls[1].FunctionName)
251252
assertEquals("id", functionCalls[1].OriginNodeName)
252253
}
254+
255+
@Test
256+
fun should_handle_system_func() {
257+
val code = """
258+
use std::sync::Arc;
259+
260+
pub use embedding::Semantic;
261+
pub use embedding::semantic::SemanticError;
262+
263+
pub fn init_semantic_with_path(model_path: &str, tokenizer_path: &str) -> Result<Arc<Semantic>, SemanticError> {
264+
let model = std::fs::read(model_path).map_err(|_| SemanticError::InitModelReadError)?;
265+
let tokenizer_data = std::fs::read(tokenizer_path).map_err(|_| SemanticError::InitTokenizerReadError)?;
266+
267+
let result = Semantic::init_semantic(model, tokenizer_data)?;
268+
Ok(Arc::new(result))
269+
}
270+
""".trimIndent()
271+
272+
val codeContainer = RustAnalyser().analysis(code, "lib.rs")
273+
val codeDataStruct = codeContainer.DataStructures[0]
274+
val functionCalls = codeDataStruct.Functions[0].FunctionCalls
275+
assertEquals(7, functionCalls.size)
276+
277+
functionCalls.map {
278+
println("${it.NodeName} -> ${it.FunctionName} -> ${it.OriginNodeName}")
279+
}
280+
281+
assertEquals("std::fs::read", functionCalls[0].NodeName)
282+
assertEquals("map_err", functionCalls[0].FunctionName)
283+
assertEquals("std::fs::read", functionCalls[0].OriginNodeName)
284+
285+
assertEquals("std::fs", functionCalls[1].NodeName)
286+
assertEquals("read", functionCalls[1].FunctionName)
287+
assertEquals("", functionCalls[1].OriginNodeName)
288+
}
253289
}

0 commit comments

Comments
 (0)