feat: <scala> add inner object support

上级 80b02e52
......@@ -5,15 +5,10 @@ import chapi.domain.core.*
import chapi.domain.infra.Stack
class CSharpFullIdentListener(val fileName: String) : CSharpAstListener() {
private var codeContainer: CodeContainer =
CodeContainer(FullName = fileName)
private var codeContainer: CodeContainer = CodeContainer(FullName = fileName)
private var currentContainer: CodeContainer = codeContainer
private var containerStack: Stack<CodeContainer> =
Stack<CodeContainer>()
private var currentPackage: CodePackage =
CodePackage()
private var containerStack: Stack<CodeContainer> = Stack<CodeContainer>()
private var currentPackage: CodePackage = CodePackage()
override fun enterCompilation_unit(ctx: CSharpParser.Compilation_unitContext?) {
containerStack.push(codeContainer)
......
......@@ -4,8 +4,11 @@ import chapi.ast.antlr.ScalaParser
import chapi.domain.core.CodeContainer
import chapi.domain.core.CodeDataStruct
import chapi.domain.core.DataStructType
import chapi.domain.infra.Stack
class ScalaFullIdentListener(var fileName: String) : ScalaAstBaseListener() {
private val structStack: Stack<CodeDataStruct> = Stack()
private var currentDataStruct: CodeDataStruct = CodeDataStruct()
private var codeContainer: CodeContainer = CodeContainer(FullName = fileName)
override fun enterObjectDef(ctx: ScalaParser.ObjectDefContext?) {
......@@ -16,7 +19,20 @@ class ScalaFullIdentListener(var fileName: String) : ScalaAstBaseListener() {
FilePath = codeContainer.FullName
)
codeContainer.DataStructures += codeDataStruct
updateStruct(codeDataStruct)
}
private fun updateStruct(codeDataStruct: CodeDataStruct) {
currentDataStruct = codeDataStruct
if (structStack.elements.size > 0) {
val lastStruct = structStack.elements.last()
lastStruct.InnerStructures += currentDataStruct
} else {
codeContainer.DataStructures += currentDataStruct
}
structStack.push(currentDataStruct)
}
override fun enterClassDef(ctx: ScalaParser.ClassDefContext?) {
......@@ -27,7 +43,7 @@ class ScalaFullIdentListener(var fileName: String) : ScalaAstBaseListener() {
FilePath = codeContainer.FullName
)
codeContainer.DataStructures += codeDataStruct
updateStruct(codeDataStruct)
}
fun getNodeInfo(): CodeContainer {
......
......@@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
internal class ScalaFullIdentListenerTest {
private val hellowoorld: String = """
private val helloworld: String = """
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, world!")
......@@ -15,12 +15,12 @@ object HelloWorld {
@Test
internal fun shouldAnalysis() {
ScalaAnalyser().analysis(hellowoorld, "hello.scala")
ScalaAnalyser().analysis(helloworld, "hello.scala")
}
@Test
internal fun shouldAnalysisObjectName() {
val container = ScalaAnalyser().analysis(hellowoorld, "hello.scala")
val container = ScalaAnalyser().analysis(helloworld, "hello.scala")
assertEquals(container.DataStructures.size, 1)
assertEquals(container.DataStructures[0].NodeName, "HelloWorld")
assertEquals(container.DataStructures[0].Type, DataStructType.OBJECT)
......@@ -32,11 +32,30 @@ object HelloWorld {
class Outer(i : Int) {
def foo(x : Inner.type) = x.getI
}
"""
"""
val container = ScalaAnalyser().analysis(code, "hello.scala")
assertEquals(container.DataStructures.size, 1)
assertEquals(container.DataStructures[0].NodeName, "Outer")
assertEquals(container.DataStructures[0].Type, DataStructType.CLASS)
}
@Test
internal fun shouldAnalysisOutClassInnerObjectName() {
val code = """
class Outer(i : Int) {
object Inner {
def getI : Int = i
}
def foo(x : Inner.type) = x.getI
}
"""
val container = ScalaAnalyser().analysis(code, "hello.scala")
println(container)
assertEquals(container.DataStructures.size, 1)
assertEquals(container.DataStructures[0].InnerStructures.size, 1)
assertEquals(container.DataStructures[0].InnerStructures[0].Type, DataStructType.OBJECT)
assertEquals(container.DataStructures[0].InnerStructures[0].NodeName, "Inner")
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册