From 6b141d5ea741f772ab6b4b9a9b558df4a7092e0d Mon Sep 17 00:00:00 2001 From: Phodal Huang Date: Fri, 18 Mar 2022 16:54:20 +0800 Subject: [PATCH] fix: fix kotlin crash issue --- .../chapi/app/analyser/KotlinAnalyserAppTest.kt | 13 +++++++++++++ .../chapi/ast/kotlinast/KotlinFullIdentListener.kt | 9 ++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/chapi-application/src/test/kotlin/chapi/app/analyser/KotlinAnalyserAppTest.kt b/chapi-application/src/test/kotlin/chapi/app/analyser/KotlinAnalyserAppTest.kt index 80ae688a..15013ce2 100644 --- a/chapi-application/src/test/kotlin/chapi/app/analyser/KotlinAnalyserAppTest.kt +++ b/chapi-application/src/test/kotlin/chapi/app/analyser/KotlinAnalyserAppTest.kt @@ -3,9 +3,12 @@ package chapi.app.analyser import chapi.app.analyser.config.ChapiConfig import chapi.app.analyser.config.Language import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test import java.nio.file.Paths +import kotlin.io.path.Path +import kotlin.io.path.absolutePathString import kotlin.test.assertEquals internal class KotlinAnalyserAppTest { @@ -21,6 +24,16 @@ internal class KotlinAnalyserAppTest { Assertions.assertEquals(nodeInfos[0].FilePath.endsWith("resources/test/languages/kotlin/Hello.kt"), true) } + @Test + @Disabled + fun `boostrap for not crash`() { + val config = ChapiConfig(language = Language.KOTLIN) + // todo: can change to `../` + val path = Path("../") + + KotlinAnalyserApp(config).analysisNodeByPath(path.absolutePathString()) + } + @Nested inner class DryRun { private val relativePath = Paths.get("../../archguard-backend/src/main/kotlin") diff --git a/chapi-ast-kotlin/src/main/kotlin/chapi/ast/kotlinast/KotlinFullIdentListener.kt b/chapi-ast-kotlin/src/main/kotlin/chapi/ast/kotlinast/KotlinFullIdentListener.kt index 5079ebde..4e2a9ff8 100644 --- a/chapi-ast-kotlin/src/main/kotlin/chapi/ast/kotlinast/KotlinFullIdentListener.kt +++ b/chapi-ast-kotlin/src/main/kotlin/chapi/ast/kotlinast/KotlinFullIdentListener.kt @@ -20,11 +20,14 @@ class KotlinFullIdentListener(fileName: String) : KotlinBasicIdentListener(fileN private val postClassHandler = mutableListOf<(CodeDataStruct) -> Unit>() override fun buildFunction(ctx: KotlinParser.FunctionDeclarationContext): CodeFunction = super.buildFunction(ctx).apply { - FunctionCalls = buildFunctionCalls(ctx).toTypedArray() + val functionCalls = buildFunctionCalls(ctx) + if (functionCalls != null) { + FunctionCalls = functionCalls.toTypedArray() + } } - private fun buildFunctionCalls(ctx: KotlinParser.FunctionDeclarationContext): List = - ctx.functionBody().block().statements().statement().mapNotNull(::buildFunctionCall) + private fun buildFunctionCalls(ctx: KotlinParser.FunctionDeclarationContext): List? = + ctx.functionBody()?.block()?.statements()?.statement()?.mapNotNull(::buildFunctionCall) private fun buildFunctionCall(it: KotlinParser.StatementContext): CodeCall? { val result = Regex("(\\w+\\.?)+\\((.*)\\)").find(it.text) ?: return null