From 6aa3f507d5d1779a706ee82b3d8da23d2d6032e2 Mon Sep 17 00:00:00 2001 From: Konstantin Chukharev Date: Fri, 21 Mar 2025 15:05:23 +0300 Subject: [PATCH 1/2] Add class category --- .github/workflows/build-and-test.yml | 2 +- .../main/kotlin/org/jacodb/ets/dto/Convert.kt | 15 +++++++++++ .../main/kotlin/org/jacodb/ets/dto/Model.kt | 1 + .../kotlin/org/jacodb/ets/graph/EtsCfg.kt | 2 +- .../kotlin/org/jacodb/ets/model/EtsClass.kt | 2 ++ .../org/jacodb/ets/model/EtsClassCategory.kt | 26 +++++++++++++++++++ .../org/jacodb/ets/test/EtsFromJsonTest.kt | 18 ++++++++++--- 7 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 jacodb-ets/src/main/kotlin/org/jacodb/ets/model/EtsClassCategory.kt diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 1d0fa9f32..775e86160 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -64,7 +64,7 @@ jobs: DEST_DIR="arkanalyzer" MAX_RETRIES=10 RETRY_DELAY=3 # Delay between retries in seconds - BRANCH="neo/2025-03-20" + BRANCH="neo/2025-03-21" for ((i=1; i<=MAX_RETRIES; i++)); do git clone --depth=1 --branch $BRANCH $REPO_URL $DEST_DIR && break diff --git a/jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Convert.kt b/jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Convert.kt index 012805018..ec6845f69 100644 --- a/jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Convert.kt +++ b/jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Convert.kt @@ -111,6 +111,7 @@ import org.jacodb.ets.base.EtsVoidType import org.jacodb.ets.base.EtsYieldExpr import org.jacodb.ets.graph.EtsCfg import org.jacodb.ets.model.EtsClass +import org.jacodb.ets.model.EtsClassCategory import org.jacodb.ets.model.EtsClassImpl import org.jacodb.ets.model.EtsClassSignature import org.jacodb.ets.model.EtsDecorator @@ -534,6 +535,7 @@ fun ClassDto.toEtsClass(): EtsClass { val methods = methodDtos.map { it.toEtsMethod() } val ctor = ctorDto.toEtsMethod() + val category = category.toEtsClassCategory() val typeParameters = typeParameters?.map { it.toEtsType() } ?: emptyList() val modifiers = EtsModifiers(modifiers) @@ -544,6 +546,7 @@ fun ClassDto.toEtsClass(): EtsClass { fields = fields, methods = methods, ctor = ctor, + category = category, superClass = superClassSignature, implementedInterfaces = implementedInterfaces, typeParameters = typeParameters, @@ -788,3 +791,15 @@ fun LocalDto.toEtsLocal(): EtsLocal { type = type.toEtsType(), ) } + +private fun Int.toEtsClassCategory() : EtsClassCategory { + return when (this) { + 0 -> EtsClassCategory.CLASS + 1 -> EtsClassCategory.STRUCT + 2 -> EtsClassCategory.INTERFACE + 3 -> EtsClassCategory.ENUM + 4 -> EtsClassCategory.TYPE_LITERAL + 5 -> EtsClassCategory.OBJECT + else -> error("Unknown class category: $this") + } +} diff --git a/jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Model.kt b/jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Model.kt index 45cd7be96..fd770528a 100644 --- a/jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Model.kt +++ b/jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Model.kt @@ -59,6 +59,7 @@ data class ClassDto( val signature: ClassSignatureDto, val modifiers: Int, val decorators: List, + val category: Int = 0, val typeParameters: List? = null, val superClassName: String?, val implementedInterfaceNames: List, diff --git a/jacodb-ets/src/main/kotlin/org/jacodb/ets/graph/EtsCfg.kt b/jacodb-ets/src/main/kotlin/org/jacodb/ets/graph/EtsCfg.kt index 9a444b58b..3b7114d24 100644 --- a/jacodb-ets/src/main/kotlin/org/jacodb/ets/graph/EtsCfg.kt +++ b/jacodb-ets/src/main/kotlin/org/jacodb/ets/graph/EtsCfg.kt @@ -57,7 +57,7 @@ class EtsCfg( } override fun predecessors(node: EtsStmt): Set { - return predecessorMap[node]!! + return predecessorMap[node].orEmpty() } companion object { diff --git a/jacodb-ets/src/main/kotlin/org/jacodb/ets/model/EtsClass.kt b/jacodb-ets/src/main/kotlin/org/jacodb/ets/model/EtsClass.kt index 560dac296..74fc77ff1 100644 --- a/jacodb-ets/src/main/kotlin/org/jacodb/ets/model/EtsClass.kt +++ b/jacodb-ets/src/main/kotlin/org/jacodb/ets/model/EtsClass.kt @@ -24,6 +24,7 @@ interface EtsClass : EtsBaseModel { val fields: List val methods: List val ctor: EtsMethod + val category: EtsClassCategory val superClass: EtsClassSignature? val implementedInterfaces: List @@ -36,6 +37,7 @@ class EtsClassImpl( override val fields: List, override val methods: List, override val ctor: EtsMethod, + override val category: EtsClassCategory = EtsClassCategory.CLASS, override val superClass: EtsClassSignature? = null, override val implementedInterfaces: List = emptyList(), override val typeParameters: List = emptyList(), diff --git a/jacodb-ets/src/main/kotlin/org/jacodb/ets/model/EtsClassCategory.kt b/jacodb-ets/src/main/kotlin/org/jacodb/ets/model/EtsClassCategory.kt new file mode 100644 index 000000000..7a9170ef5 --- /dev/null +++ b/jacodb-ets/src/main/kotlin/org/jacodb/ets/model/EtsClassCategory.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2022 UnitTestBot contributors (utbot.org) + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jacodb.ets.model + +enum class EtsClassCategory { + CLASS, + STRUCT, + INTERFACE, + ENUM, + TYPE_LITERAL, + OBJECT, +} diff --git a/jacodb-ets/src/test/kotlin/org/jacodb/ets/test/EtsFromJsonTest.kt b/jacodb-ets/src/test/kotlin/org/jacodb/ets/test/EtsFromJsonTest.kt index e8733be67..f4a228688 100644 --- a/jacodb-ets/src/test/kotlin/org/jacodb/ets/test/EtsFromJsonTest.kt +++ b/jacodb-ets/src/test/kotlin/org/jacodb/ets/test/EtsFromJsonTest.kt @@ -47,6 +47,7 @@ import org.jacodb.ets.dto.ValueDto import org.jacodb.ets.dto.dtoModule import org.jacodb.ets.dto.toEtsLocal import org.jacodb.ets.dto.toEtsMethod +import org.jacodb.ets.model.EtsClassCategory import org.jacodb.ets.model.EtsClassSignature import org.jacodb.ets.model.EtsFile import org.jacodb.ets.model.EtsFileSignature @@ -478,8 +479,19 @@ class EtsFromJsonTest { val path = "/samples/etsir/ast/lang/vararg.ts.json" val file = loadEtsFileFromResource(path) val method = file.classes.flatMap { it.methods }.first { it.name == "f" } - assertEquals(method.parameters.size, 2) - assertEquals(method.parameters[0].isRest, false) - assertEquals(method.parameters[1].isRest, true) + assertEquals(2, method.parameters.size) + assertEquals(false, method.parameters[0].isRest) + assertEquals(true, method.parameters[1].isRest) + } + + @Test + fun testClassCategory() { + val path = "/samples/etsir/ast/lang/enum.ts.json" + val file = loadEtsFileFromResource(path) + val cls = file.classes.first { it.name == "Animal" } + assertEquals(EtsClassCategory.ENUM, cls.category) + assertEquals(2, cls.fields.size) + assertEquals("Cat", cls.fields[0].name) + assertEquals("Dog", cls.fields[1].name) } } From cb4f5ceb8c619975106b405cd38d1536d8eb41fb Mon Sep 17 00:00:00 2001 From: Konstantin Chukharev Date: Fri, 21 Mar 2025 15:43:26 +0300 Subject: [PATCH 2/2] Add test sample --- jacodb-ets/src/test/resources/samples/source/lang/enum.ts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 jacodb-ets/src/test/resources/samples/source/lang/enum.ts diff --git a/jacodb-ets/src/test/resources/samples/source/lang/enum.ts b/jacodb-ets/src/test/resources/samples/source/lang/enum.ts new file mode 100644 index 000000000..093c834b1 --- /dev/null +++ b/jacodb-ets/src/test/resources/samples/source/lang/enum.ts @@ -0,0 +1,4 @@ +enum Animal { + Cat, + Dog, +}