From 00d2ba8fa6480895c84ffaead10cdf703df5387f Mon Sep 17 00:00:00 2001 From: Konstantin Chukharev Date: Thu, 20 Mar 2025 15:46:45 +0300 Subject: [PATCH 1/2] Support rest-params in EtsIR model --- .github/workflows/build-and-test.yml | 2 +- .../src/main/kotlin/org/jacodb/ets/dto/Convert.kt | 1 + .../src/main/kotlin/org/jacodb/ets/dto/Signatures.kt | 1 + .../main/kotlin/org/jacodb/ets/model/EtsSignature.kt | 1 + .../test/kotlin/org/jacodb/ets/test/EtsFromJsonTest.kt | 10 ++++++++++ 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 6b3d7a678..1d0fa9f32 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-02-24" + BRANCH="neo/2025-03-20" 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 f92bbcdb3..012805018 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 @@ -695,6 +695,7 @@ fun MethodSignatureDto.toEtsMethodSignature(): EtsMethodSignature { name = param.name, type = param.type.toEtsType(), isOptional = param.isOptional, + isRest = param.isRest, ) }, returnType = returnType.toEtsType(), diff --git a/jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Signatures.kt b/jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Signatures.kt index 54cc32202..c265a63fc 100644 --- a/jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Signatures.kt +++ b/jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Signatures.kt @@ -59,6 +59,7 @@ data class MethodParameterDto( val name: String, val type: TypeDto, val isOptional: Boolean = false, + val isRest: Boolean = false, ) @Serializable diff --git a/jacodb-ets/src/main/kotlin/org/jacodb/ets/model/EtsSignature.kt b/jacodb-ets/src/main/kotlin/org/jacodb/ets/model/EtsSignature.kt index 28f8bba54..94867fbe8 100644 --- a/jacodb-ets/src/main/kotlin/org/jacodb/ets/model/EtsSignature.kt +++ b/jacodb-ets/src/main/kotlin/org/jacodb/ets/model/EtsSignature.kt @@ -120,6 +120,7 @@ data class EtsMethodParameter( val name: String, override val type: EtsType, val isOptional: Boolean = false, + val isRest: Boolean = false, ) : CommonMethodParameter { override fun toString(): String { return "$name${if (isOptional) "?" else ""}: $type" 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 5449835ac..e8733be67 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 @@ -472,4 +472,14 @@ class EtsFromJsonTest { assertEquals("DummyStmt", stmtDto.kind) assertEquals(42, stmtDto.extra.getValue("value").jsonPrimitive.content.toInt()) } + + @Test + fun testVararg() { + 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) + } } From 9b509eb39a8f5bc818489730da2eec1fe745235b Mon Sep 17 00:00:00 2001 From: Konstantin Chukharev Date: Thu, 20 Mar 2025 16:42:36 +0300 Subject: [PATCH 2/2] Add sample with vararg --- jacodb-ets/src/test/resources/samples/source/lang/vararg.ts | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 jacodb-ets/src/test/resources/samples/source/lang/vararg.ts diff --git a/jacodb-ets/src/test/resources/samples/source/lang/vararg.ts b/jacodb-ets/src/test/resources/samples/source/lang/vararg.ts new file mode 100644 index 000000000..0dc1dff43 --- /dev/null +++ b/jacodb-ets/src/test/resources/samples/source/lang/vararg.ts @@ -0,0 +1,6 @@ +function f(x, ...args) { + console.log(x); + console.log(...args); +} + +f(42, "hello", "world");