From 1d357e10d2f2dcc315ece27e55ffa4f43a012187 Mon Sep 17 00:00:00 2001 From: Phodal Huang Date: Fri, 18 Nov 2022 14:10:48 +0800 Subject: [PATCH] feat(rs): init struct --- .../ast/rustast/RustFullIdentListener.kt | 31 +++++++++++++++---- .../chapi/ast/rustast/RustAnalyserTest.kt | 2 ++ .../ast/rustast/RustFullIdentListenerTest.kt | 21 +++++++++++++ 3 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 chapi-ast-rust/src/test/kotlin/chapi/ast/rustast/RustFullIdentListenerTest.kt diff --git a/chapi-ast-rust/src/main/kotlin/chapi/ast/rustast/RustFullIdentListener.kt b/chapi-ast-rust/src/main/kotlin/chapi/ast/rustast/RustFullIdentListener.kt index c5a5bc11..9c9742e1 100644 --- a/chapi-ast-rust/src/main/kotlin/chapi/ast/rustast/RustFullIdentListener.kt +++ b/chapi-ast-rust/src/main/kotlin/chapi/ast/rustast/RustFullIdentListener.kt @@ -1,19 +1,38 @@ package chapi.ast.rustast +import chapi.ast.antlr.RustParser import chapi.domain.core.* open class RustFullIdentListener(fileName: String) : RustAstBaseListener() { - private var currentDataStruct = CodeDataStruct() - private val defaultDataStruct = CodeDataStruct() - private var currentFunction = CodeFunction() - private var structMap = mutableMapOf() private var codeContainer: CodeContainer = CodeContainer(FullName = fileName) + private var defaultNode = CodeDataStruct() + private var structMap = mutableMapOf() + private var localVars = mutableMapOf() + + private var currentFunction = CodeFunction(IsConstructor = false) + + override fun enterStructStruct(ctx: RustParser.StructStructContext?) { + val structName = ctx!!.identifier().text + + val codeStruct = CodeDataStruct( + NodeName = structName, + Package = codeContainer.PackageName + ) + + structMap[structName] = codeStruct + defaultNode = codeStruct + } fun getNodeInfo(): CodeContainer { - if (defaultDataStruct.Functions.isNotEmpty()) { - codeContainer.DataStructures += defaultDataStruct + for (entry in structMap) { + codeContainer.DataStructures += entry.value } + + if (defaultNode.Functions.isNotEmpty()) { + codeContainer.DataStructures += defaultNode + } + return codeContainer } } diff --git a/chapi-ast-rust/src/test/kotlin/chapi/ast/rustast/RustAnalyserTest.kt b/chapi-ast-rust/src/test/kotlin/chapi/ast/rustast/RustAnalyserTest.kt index aef07bcd..49c529ed 100644 --- a/chapi-ast-rust/src/test/kotlin/chapi/ast/rustast/RustAnalyserTest.kt +++ b/chapi-ast-rust/src/test/kotlin/chapi/ast/rustast/RustAnalyserTest.kt @@ -1,5 +1,6 @@ package chapi.ast.rustast +import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import java.io.File @@ -17,6 +18,7 @@ internal class RustAnalyserTest { } @Test + @Disabled fun allGrammarUnderResources() { val content = this::class.java.getResource("/grammar")!! File(content.toURI()).walkTopDown().forEach { diff --git a/chapi-ast-rust/src/test/kotlin/chapi/ast/rustast/RustFullIdentListenerTest.kt b/chapi-ast-rust/src/test/kotlin/chapi/ast/rustast/RustFullIdentListenerTest.kt new file mode 100644 index 00000000..fafed2d0 --- /dev/null +++ b/chapi-ast-rust/src/test/kotlin/chapi/ast/rustast/RustFullIdentListenerTest.kt @@ -0,0 +1,21 @@ +package chapi.ast.rustast + +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals + + +class RustFullIdentListenerTest { + @Test + fun structDef() { + val str = """ + struct Point { + x: i32, + y: i32, + } + """.trimIndent() + + val codeContainer = RustAnalyser().analysis(str, "test.rs") + assertEquals(1, codeContainer.DataStructures.size) + assertEquals("Point", codeContainer.DataStructures[0].NodeName) + } +}