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 de26c51c2..d75909109 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 @@ -2029,22 +2029,27 @@ data class XlateStmt( @Serializable data class ResetStmt( val name: String, + @Derived val dataDefinition: InStatementDataDefinition? = null, override val position: Position? = null -) : Statement(position) { +) : Statement(position), StatementThatCanDefineData { override fun execute(interpreter: InterpreterCore) { - val dataDefinition = interpreter.dataDefinitionByName(name) - require(dataDefinition != null) { - this.error("Data definition $name not found") - } - require(dataDefinition is DataDefinition) { - this.error("Data definition $name is not an instance of DataDefinition") - } - require(dataDefinition.defaultValue != null) { - this.error("Data definition $name has no default value") + when (val dataDefinition = interpreter.dataDefinitionByName(name)) { + null -> this.error("Data definition $name not found") + is DataDefinition -> { + require(dataDefinition.defaultValue != null) { + this.error("Data definition $name has no default value") + } + interpreter.assign(dataDefinition, dataDefinition.defaultValue!!) + } + is InStatementDataDefinition -> { + interpreter.assign(dataDefinition, dataDefinition.type.blank()) + } + else -> this.error("Data definition $name is not a valid instance of DataDefinition") } - interpreter.assign(dataDefinition, dataDefinition.defaultValue!!) } + + override fun dataDefinition(): List = dataDefinition?.let { listOf(it) } ?: emptyList() } @Serializable 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 845348615..d959f321d 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 @@ -1956,6 +1956,7 @@ internal fun CsCLOSEContext.toAst(conf: ToAstConfiguration = ToAstConfiguration( internal fun CsRESETContext.toAst(conf: ToAstConfiguration = ToAstConfiguration()): Statement { val position = toPosition(conf.considerPosition) + require(this.cspec_fixed_standard_parts().factor().text.isEmptyTrim()) { "RESET operation does not support factor1" } @@ -1966,8 +1967,12 @@ internal fun CsRESETContext.toAst(conf: ToAstConfiguration = ToAstConfiguration( require(!result.isEmptyTrim()) { "RESET operation requires result" } + + val dataDefinition = this.cspec_fixed_standard_parts().toDataDefinition(result, position, conf) + return ResetStmt( name = result, + dataDefinition = dataDefinition, position = position ) } diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt index 53c400fe2..5a740c0e4 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt @@ -1,3 +1,16 @@ package com.smeup.rpgparser.smeup -open class MULANGT40ArrayAndDSTest : MULANGTTest() \ No newline at end of file +import org.junit.Test +import kotlin.test.assertEquals + +open class MULANGT40ArrayAndDSTest : MULANGTTest() { + /** + * Reset with inline declaration + * @see #242 + */ + @Test + fun executeT40_A10_P10() { + val expected = listOf("Contenuto Pre-RESET: AAA - Contenuto Post-RESET:") + assertEquals(expected, "smeup/T40_A10_P10".outputOf(configuration = smeupConfig)) + } +} \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T40_A10_P10.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T40_A10_P10.rpgle new file mode 100644 index 000000000..fc9ee5879 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T40_A10_P10.rpgle @@ -0,0 +1,7 @@ + D £DBG_Str S 150 VARYING + C EVAL A10_D1='AAA' + C EVAL £DBG_Str='Contenuto Pre-RESET: '+A10_D1 + C RESET A10_D1 10 + C EVAL £DBG_Str=%TRIMR(£DBG_Str) + C +' - Contenuto Post-RESET: '+A10_D1 + C £DBG_Str DSPLY