From 5615e2956bd986d71225498ed1a571ef861f734f Mon Sep 17 00:00:00 2001 From: Domenico Date: Wed, 12 Jun 2024 10:12:19 +0200 Subject: [PATCH 1/5] Add test case --- .../smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt | 10 ++++++++++ .../src/test/resources/smeup/MUDRNRAPU00216.rpgle | 6 ++++++ 2 files changed, 16 insertions(+) create mode 100644 rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00216.rpgle diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt index 92385c2f5..d46e84b0f 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt @@ -122,4 +122,14 @@ open class MULANGT10BaseCodopTest : MULANGTTest() { val expected = listOf("51=1,52=0,53=0") assertEquals(expected, "smeup/MU102501".outputOf()) } + + /** + * EXCEPT statement is supported + * @see #LS24002974 + */ + @Test + fun executeMUDRNRAPU00216() { + val expected = listOf("ok") + assertEquals(expected, "smeup/MUDRNRAPU00216".outputOf()) + } } \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00216.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00216.rpgle new file mode 100644 index 000000000..f95d8c69b --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00216.rpgle @@ -0,0 +1,6 @@ + D £DBG_Str S 2 + C IF 0 + C EXCEPT E1RIGA + C ENDIF + C EVAL £DBG_Str='ok' + C £DBG_Str DSPLY \ No newline at end of file From 50eb49304622a3a1db9d791a4ddb805b2bae90e1 Mon Sep 17 00:00:00 2001 From: Domenico Date: Wed, 12 Jun 2024 10:12:53 +0200 Subject: [PATCH 2/5] Implement ExceptStmt mock --- .../smeup/rpgparser/parsing/ast/statements.kt | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt index 75c8f8d7e..644071233 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt @@ -107,7 +107,13 @@ abstract class Statement( /** * For statements with this interface there isn't execution but will be called the callback `onMockStatement`. */ -interface MockStatement +interface MockStatement { + /** + * Callback method called for this statement on mock execution. + * It is the equivalent of the [Statement.execute] method for mock statements. + */ + fun onMock() = Unit +} interface CompositeStatement { val body: List @@ -2410,6 +2416,19 @@ data class UnlockStmt( override fun execute(interpreter: InterpreterCore) {} } +@Serializable +data class ExceptStmt( + override val position: Position? = null +) : Statement(position), MockStatement { + override val loggableEntityName: String + get() = "EXCEPT" + + override fun execute(interpreter: InterpreterCore) {} + override fun onMock() { + throw NotImplementedError("EXCEPT statement is not implemented yet") + } +} + @Serializable data class FeodStmt( override val position: Position? = null From 3d373414afb7a806cd015da2cc76ffb6e324914e Mon Sep 17 00:00:00 2001 From: Domenico Date: Wed, 12 Jun 2024 10:13:11 +0200 Subject: [PATCH 3/5] Implement ExceptStmt AST creation and serialization --- .../com/smeup/rpgparser/parsing/ast/serialization.kt | 1 + .../com/smeup/rpgparser/parsing/parsetreetoast/misc.kt | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/serialization.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/serialization.kt index f2d84c36a..3b9d3ea8e 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/serialization.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/serialization.kt @@ -65,6 +65,7 @@ private val modules = SerializersModule { subclass(DowStmt::class) subclass(DOWxxStmt::class) subclass(EvalStmt::class) + subclass(ExceptStmt::class) subclass(ExecuteSubroutine::class) subclass(ExfmtStmt::class) subclass(FeodStmt::class) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/misc.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/misc.kt index e7fcd6a35..c3c736773 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/misc.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/misc.kt @@ -962,6 +962,9 @@ internal fun Cspec_fixed_standardContext.toAst(conf: ToAstConfiguration = ToAstC this.csUNLOCK() != null -> this.csUNLOCK() .let { it.cspec_fixed_standard_parts().validate(stmt = it.toAst(conf), conf = conf) } + this.csEXCEPT() != null -> this.csEXCEPT() + .let { it.cspec_fixed_standard_parts().validate(stmt = it.toAst(conf), conf = conf) } + this.csFEOD() != null -> this.csFEOD() .let { it.cspec_fixed_standard_parts().validate(stmt = it.toAst(conf), conf = conf) } @@ -2093,6 +2096,12 @@ internal fun CsUNLOCKContext.toAst(conf: ToAstConfiguration = ToAstConfiguration return UnlockStmt(position) } +// TODO +internal fun CsEXCEPTContext.toAst(conf: ToAstConfiguration = ToAstConfiguration()): Statement { + val position = toPosition(conf.considerPosition) + return ExceptStmt(position) +} + internal fun CsTESTNContext.toAst(conf: ToAstConfiguration = ToAstConfiguration()): TestnStmt { val position = toPosition(conf.considerPosition) val resultExpression = this.cspec_fixed_standard_parts().resultExpression(conf) as AssignableExpression From 29bc955655b4d22d4ba291e6a8766a3804fd2896 Mon Sep 17 00:00:00 2001 From: Domenico Date: Wed, 12 Jun 2024 10:13:31 +0200 Subject: [PATCH 4/5] Add onMock call in InternalInterpreter --- .../com/smeup/rpgparser/interpreter/internal_interpreter.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/internal_interpreter.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/internal_interpreter.kt index 0b1e2bef6..c1a29dee6 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/internal_interpreter.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/internal_interpreter.kt @@ -462,6 +462,7 @@ open class InternalInterpreter( if (statement is MockStatement) { MainExecutionContext.getConfiguration().jarikoCallback.onMockStatement + statement.onMock() } else { if (logsEnabled()) executeWithLogging(statement) From 638ccd5153208204829f39612c3916d1c9a67e5f Mon Sep 17 00:00:00 2001 From: Domenico Date: Wed, 12 Jun 2024 12:59:19 +0200 Subject: [PATCH 5/5] Move ExceptStmt mock implementation in execute method --- .../rpgparser/interpreter/internal_interpreter.kt | 1 - .../com/smeup/rpgparser/parsing/ast/statements.kt | 14 ++++---------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/internal_interpreter.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/internal_interpreter.kt index c1a29dee6..0b1e2bef6 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/internal_interpreter.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/internal_interpreter.kt @@ -462,7 +462,6 @@ open class InternalInterpreter( if (statement is MockStatement) { MainExecutionContext.getConfiguration().jarikoCallback.onMockStatement - statement.onMock() } else { if (logsEnabled()) executeWithLogging(statement) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt index 644071233..b57ae2461 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt @@ -107,13 +107,7 @@ abstract class Statement( /** * For statements with this interface there isn't execution but will be called the callback `onMockStatement`. */ -interface MockStatement { - /** - * Callback method called for this statement on mock execution. - * It is the equivalent of the [Statement.execute] method for mock statements. - */ - fun onMock() = Unit -} +interface MockStatement interface CompositeStatement { val body: List @@ -2419,12 +2413,12 @@ data class UnlockStmt( @Serializable data class ExceptStmt( override val position: Position? = null -) : Statement(position), MockStatement { +) : Statement(position) { override val loggableEntityName: String get() = "EXCEPT" - override fun execute(interpreter: InterpreterCore) {} - override fun onMock() { + override fun execute(interpreter: InterpreterCore) { + // TODO: Replace with actual implementation throw NotImplementedError("EXCEPT statement is not implemented yet") } }