From 65841bbaea54685bbccc70262d42f270d5a82842 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Fri, 1 Mar 2024 15:41:23 +0100 Subject: [PATCH 01/17] Implemented test case --- .../evaluation/SmeupInterpreterTest.kt | 8 ++++++++ .../test/resources/smeup/T02_A40_P08.rpgle | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P08.rpgle diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt index 14cb70633..1b8371233 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt @@ -462,4 +462,12 @@ open class SmeupInterpreterTest : AbstractTest() { ) assertEquals(expected, "smeup/T03_A30_P01-02".outputOf()) } + + @Test + fun executeT02_A40_P08() { + val expected = listOf( + "CNCLI AAAAAA 333" + ) + assertEquals(expected, "smeup/T02_A40_P08".outputOf()) + } } \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P08.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P08.rpgle new file mode 100644 index 000000000..42c059034 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P08.rpgle @@ -0,0 +1,20 @@ + D A40_DS1 DS 30 + D DS1_FL1 2 + D DS1_FL2 10 + D DS1_FL3 15 + D DS1_FL4 3 0 + + D A40_DS8 DS + D DS8_FL1 LIKE(DS1_FL1) + D DS8_FL2 LIKE(DS1_FL2) + D DS8_FL3 LIKE(DS1_FL3) + D DS8_FL4 LIKE(DS1_FL4) + D £DBG_Str S 50 VARYING + + D* DS con overlay e campi definiti singolarmente + C EVAL DS8_FL1 = 'CN' + C EVAL DS8_FL2 = 'CLI' + C EVAL DS8_FL3 = 'AAAAAA' + C EVAL DS8_FL4 = 333 + C EVAL £DBG_Str=%TRIMR(A40_DS8) + C £DBG_Str DSPLY From 4db6c3a589cd9e3e13914c6a29373fe5fecf147c Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Fri, 1 Mar 2024 18:01:33 +0100 Subject: [PATCH 02/17] Fix test --- .../com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt index 1b8371233..93fb277b3 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt @@ -2,6 +2,7 @@ package com.smeup.rpgparser.evaluation import com.smeup.dbnative.DBNativeAccessConfig import com.smeup.rpgparser.AbstractTest +import com.smeup.rpgparser.assertCanBeParsed import com.smeup.rpgparser.execution.Configuration import com.smeup.rpgparser.execution.ReloadConfig import com.smeup.rpgparser.execution.SimpleReloadConfig @@ -466,7 +467,7 @@ open class SmeupInterpreterTest : AbstractTest() { @Test fun executeT02_A40_P08() { val expected = listOf( - "CNCLI AAAAAA 333" + "CNCLIAAAAAA333" ) assertEquals(expected, "smeup/T02_A40_P08".outputOf()) } From ad840d1e10880f520ef4e04bfad2077286cb7104 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Fri, 1 Mar 2024 18:02:25 +0100 Subject: [PATCH 03/17] Fixed behaviour of data definition when is used `LIKE` --- .../rpgparser/parsing/parsetreetoast/data_definitions.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt index 08c1735ed..98e765c23 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt @@ -790,7 +790,13 @@ private fun RpgParser.Parm_fixedContext.toFieldInfo(conf: ToAstConfiguration = T return FieldInfo(this.name, overlayInfo = overlayInfo, explicitStartOffset = this.explicitStartOffset(), explicitEndOffset = if (explicitStartOffset() != null) this.explicitEndOffset() else null, - explicitElementType = this.calculateExplicitElementType(arraySizeDeclared, conf) ?: knownDataDefinitions.firstOrNull { it.name.equals(varName, ignoreCase = true) }?.type, + explicitElementType = this.calculateExplicitElementType(arraySizeDeclared, conf) ?: let { + val dataDefinition = knownDataDefinitions.firstOrNull { + it.name.equals(varName, ignoreCase = true) || it.fields.firstOrNull { fe -> fe.name.equals(varName, ignoreCase = true) } != null + } + + if (dataDefinition?.name.equals(varName, ignoreCase = true)) dataDefinition else dataDefinition?.fields?.firstOrNull { f -> f.name.equals(varName, ignoreCase = true)} + }?.type, arraySizeDeclared = this.arraySizeDeclared(conf), arraySizeDeclaredOnThisField = this.arraySizeDeclared(conf), initializationValue = initializationValue, From d36cff13ca3a63569f15027948bdd73d70a70fa6 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Fri, 1 Mar 2024 18:02:47 +0100 Subject: [PATCH 04/17] Fixed behaviour of `%TRIM` for DS --- .../rpgparser/interpreter/ExpressionEvaluation.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt index 58d9f94d5..6e8175ce4 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt @@ -23,6 +23,7 @@ import com.smeup.rpgparser.utils.asLong import com.smeup.rpgparser.utils.divideAtIndex import com.smeup.rpgparser.utils.moveEndingString import com.strumenta.kolasu.model.Position +import com.strumenta.kolasu.model.ReferenceByName import com.strumenta.kolasu.model.specificProcess import java.math.BigDecimal import java.math.MathContext @@ -572,7 +573,17 @@ class ExpressionEvaluation( override fun eval(expression: TrimrExpr): Value { return if (expression.charactersToTrim == null) { - StringValue(evalAsString(expression.value).trimEnd()) + when (expression.value) { + is DataRefExpr -> { + if ((expression.value as DataRefExpr).variable.referred is DataDefinition) { + val referred: DataDefinition = (expression.value as DataRefExpr).variable.referred as DataDefinition + return StringValue(referred.fields.fold("") { acc, i -> acc.plus(evalAsString(DataRefExpr(ReferenceByName(referred.name, i))).trimEnd()) }) + } + + StringValue(evalAsString(expression.value).trimEnd()) + } + else -> StringValue(evalAsString(expression.value).trimEnd()) + } } else { val suffix = evalAsString(expression.charactersToTrim) var result = evalAsString(expression.value) From f0fad4ee19bb4f3d333aa2812e7ae171b50a557b Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Fri, 1 Mar 2024 18:05:41 +0100 Subject: [PATCH 05/17] Removed unused import --- .../com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt index 93fb277b3..4decb84bb 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt @@ -2,7 +2,6 @@ package com.smeup.rpgparser.evaluation import com.smeup.dbnative.DBNativeAccessConfig import com.smeup.rpgparser.AbstractTest -import com.smeup.rpgparser.assertCanBeParsed import com.smeup.rpgparser.execution.Configuration import com.smeup.rpgparser.execution.ReloadConfig import com.smeup.rpgparser.execution.SimpleReloadConfig From add3449b2a8ee7e29d6fa556e7b26324dd936086 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Fri, 1 Mar 2024 18:06:23 +0100 Subject: [PATCH 06/17] Added space where is needed, after `ktlinCheck` --- .../smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt index 98e765c23..62e60a895 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt @@ -795,7 +795,7 @@ private fun RpgParser.Parm_fixedContext.toFieldInfo(conf: ToAstConfiguration = T it.name.equals(varName, ignoreCase = true) || it.fields.firstOrNull { fe -> fe.name.equals(varName, ignoreCase = true) } != null } - if (dataDefinition?.name.equals(varName, ignoreCase = true)) dataDefinition else dataDefinition?.fields?.firstOrNull { f -> f.name.equals(varName, ignoreCase = true)} + if (dataDefinition?.name.equals(varName, ignoreCase = true)) dataDefinition else dataDefinition?.fields?.firstOrNull { f -> f.name.equals(varName, ignoreCase = true) } }?.type, arraySizeDeclared = this.arraySizeDeclared(conf), arraySizeDeclaredOnThisField = this.arraySizeDeclared(conf), From dc2e81a28ba78cb957dc9ad4492ec32370143c0b Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Mon, 4 Mar 2024 08:58:45 +0100 Subject: [PATCH 07/17] Fixed after run test --- .../com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt index 6e8175ce4..60980ea20 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt @@ -575,9 +575,9 @@ class ExpressionEvaluation( return if (expression.charactersToTrim == null) { when (expression.value) { is DataRefExpr -> { - if ((expression.value as DataRefExpr).variable.referred is DataDefinition) { - val referred: DataDefinition = (expression.value as DataRefExpr).variable.referred as DataDefinition - return StringValue(referred.fields.fold("") { acc, i -> acc.plus(evalAsString(DataRefExpr(ReferenceByName(referred.name, i))).trimEnd()) }) + val referred = (expression.value as DataRefExpr).variable.referred + if (referred?.type is DataStructureType) { + return StringValue((referred as DataDefinition).fields.fold("") { acc, i -> acc.plus(evalAsString(DataRefExpr(ReferenceByName(referred.name, i))).trimEnd()) }) } StringValue(evalAsString(expression.value).trimEnd()) From 83db442fc732692d7c349fb724ee18e21d3abe91 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Mon, 4 Mar 2024 10:10:26 +0100 Subject: [PATCH 08/17] Rebase evaluation of `%TRIM%` after execution on IBMi, with right result. --- .../rpgparser/interpreter/ExpressionEvaluation.kt | 13 +------------ .../rpgparser/evaluation/SmeupInterpreterTest.kt | 2 +- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt index 60980ea20..58d9f94d5 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/ExpressionEvaluation.kt @@ -23,7 +23,6 @@ import com.smeup.rpgparser.utils.asLong import com.smeup.rpgparser.utils.divideAtIndex import com.smeup.rpgparser.utils.moveEndingString import com.strumenta.kolasu.model.Position -import com.strumenta.kolasu.model.ReferenceByName import com.strumenta.kolasu.model.specificProcess import java.math.BigDecimal import java.math.MathContext @@ -573,17 +572,7 @@ class ExpressionEvaluation( override fun eval(expression: TrimrExpr): Value { return if (expression.charactersToTrim == null) { - when (expression.value) { - is DataRefExpr -> { - val referred = (expression.value as DataRefExpr).variable.referred - if (referred?.type is DataStructureType) { - return StringValue((referred as DataDefinition).fields.fold("") { acc, i -> acc.plus(evalAsString(DataRefExpr(ReferenceByName(referred.name, i))).trimEnd()) }) - } - - StringValue(evalAsString(expression.value).trimEnd()) - } - else -> StringValue(evalAsString(expression.value).trimEnd()) - } + StringValue(evalAsString(expression.value).trimEnd()) } else { val suffix = evalAsString(expression.charactersToTrim) var result = evalAsString(expression.value) diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt index 4decb84bb..eb578429d 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt @@ -466,7 +466,7 @@ open class SmeupInterpreterTest : AbstractTest() { @Test fun executeT02_A40_P08() { val expected = listOf( - "CNCLIAAAAAA333" + "CNCLI AAAAAA 333" ) assertEquals(expected, "smeup/T02_A40_P08".outputOf()) } From c4d012487a5f6dbcb6841fa1a8002431999c8c95 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Mon, 4 Mar 2024 10:10:53 +0100 Subject: [PATCH 09/17] Implemented pass 09. --- .../evaluation/SmeupInterpreterTest.kt | 8 ++++++++ .../test/resources/smeup/T02_A40_P09.rpgle | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P09.rpgle diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt index eb578429d..3ab9edef8 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt @@ -470,4 +470,12 @@ open class SmeupInterpreterTest : AbstractTest() { ) assertEquals(expected, "smeup/T02_A40_P08".outputOf()) } + + @Test + fun executeT02_A40_P09() { + val expected = listOf( + "CNCLI AAAAAA 333" + ) + assertEquals(expected, "smeup/T02_A40_P09".outputOf()) + } } \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P09.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P09.rpgle new file mode 100644 index 000000000..eabe8db48 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P09.rpgle @@ -0,0 +1,20 @@ + D A40_DS1 DS 30 + D DS1_FL1 2 + D DS1_FL2 10 + D DS1_FL3 15 + D DS1_FL4 3 0 + + D A40_DS9 DS + D DS9_FL1 LIKE(DS1_FL1) + D DS9_FL2 10 + D DS9_FL3 LIKE(DS1_FL3) + D DS9_FL4 3 0 + D £DBG_Str S 50 VARYING + + D* DS con overlay e campi definiti singolarmente + C EVAL DS9_FL1 = 'CN' + C EVAL DS9_FL2 = 'CLI' + C EVAL DS8_FL3 = 'AAAAAA' + C EVAL DS9_FL4 = 333 + C EVAL £DBG_Str=%TRIMR(A40_DS9) + C £DBG_Str DSPLY From 678a59c691cbc3550778b5ec60515c4665ed5866 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Mon, 4 Mar 2024 10:15:52 +0100 Subject: [PATCH 10/17] Fixed test of P09 --- .../src/test/resources/smeup/T02_A40_P09.rpgle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P09.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P09.rpgle index eabe8db48..0adf063bc 100644 --- a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P09.rpgle +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P09.rpgle @@ -14,7 +14,7 @@ D* DS con overlay e campi definiti singolarmente C EVAL DS9_FL1 = 'CN' C EVAL DS9_FL2 = 'CLI' - C EVAL DS8_FL3 = 'AAAAAA' + C EVAL DS9_FL3 = 'AAAAAA' C EVAL DS9_FL4 = 333 C EVAL £DBG_Str=%TRIMR(A40_DS9) C £DBG_Str DSPLY From 485b1fa253acd3a7ce7c7408393cfcb17d834f5f Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Mon, 4 Mar 2024 11:05:49 +0100 Subject: [PATCH 11/17] Fixed comments `T02_A40_P08` and `T02_A40_P09` --- .../src/test/resources/smeup/T02_A40_P08.rpgle | 2 +- .../src/test/resources/smeup/T02_A40_P09.rpgle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P08.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P08.rpgle index 42c059034..87f56392c 100644 --- a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P08.rpgle +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P08.rpgle @@ -11,7 +11,7 @@ D DS8_FL4 LIKE(DS1_FL4) D £DBG_Str S 50 VARYING - D* DS con overlay e campi definiti singolarmente + D* DS definita con tutti campi in LIKE C EVAL DS8_FL1 = 'CN' C EVAL DS8_FL2 = 'CLI' C EVAL DS8_FL3 = 'AAAAAA' diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P09.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P09.rpgle index 0adf063bc..e82d11b2a 100644 --- a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P09.rpgle +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A40_P09.rpgle @@ -11,7 +11,7 @@ D DS9_FL4 3 0 D £DBG_Str S 50 VARYING - D* DS con overlay e campi definiti singolarmente + D* DS definita con campi in LIKE e campi normali C EVAL DS9_FL1 = 'CN' C EVAL DS9_FL2 = 'CLI' C EVAL DS9_FL3 = 'AAAAAA' From 7e0915b2ddc6d4f982edba0b9df5af47393f3ec6 Mon Sep 17 00:00:00 2001 From: cosentino-smeup <32836304+cosentino-smeup@users.noreply.github.com> Date: Mon, 4 Mar 2024 10:47:21 +0000 Subject: [PATCH 12/17] Fix the null exception when the CASxx block does not have the CAS condition --- .../parsing/parsetreetoast/statements.kt | 2 +- .../evaluation/SmeupInterpreterTest.kt | 6 ++++ .../test/resources/smeup/T12_A08_P02.rpgle | 33 +++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 rpgJavaInterpreter-core/src/test/resources/smeup/T12_A08_P02.rpgle diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/statements.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/statements.kt index 50584831b..fc048932a 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/statements.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/statements.kt @@ -217,7 +217,7 @@ internal fun RpgParser.WhenstatementContext.toAst(conf: ToAstConfiguration = ToA internal fun RpgParser.CasestatementContext.toAst(conf: ToAstConfiguration = ToAstConfiguration()): CaseStmt { val casClauses = this.csCASxx().map { it.toAst(conf) } - val otherClause = this.csCASother().toAst() + val otherClause = if (this.csCASother() != null) this.csCASother().toAst() else null return CaseStmt( cases = casClauses, other = otherClause, diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt index 02f0c8ba1..1f1f20b36 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt @@ -419,6 +419,12 @@ open class SmeupInterpreterTest : AbstractTest() { assertEquals(expected, "smeup/T12_A08_P01".outputOf()) } + @Test + fun executeT12_A08_P02() { + val expected = listOf("1", "2", "2") + assertEquals(expected, "smeup/T12_A08_P02".outputOf()) + } + @Test fun executeT10_A35_P07() { val expected = listOf("Src1=1 Src2=0") diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T12_A08_P02.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T12_A08_P02.rpgle new file mode 100644 index 000000000..fbb0b6e10 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T12_A08_P02.rpgle @@ -0,0 +1,33 @@ + D £DBG_Str S 1 + * + C MOVEL '1' CHOISE 1 + C EXSR SEZ_T12_A08 + * + C MOVEL '2' CHOISE + C EXSR SEZ_T12_A08 + * + C MOVEL ' ' CHOISE + C EXSR SEZ_T12_A08 + * + C SETON LR + *--------------------------------------------------------------- + C SEZ_T12_A08 BEGSR + *--------------------------------------------------------------- + * + C CHOISE CASEQ '1' CHOISER1 + C CHOISE CASEQ '2' CHOISER2 + C ENDCS + * + C £DBG_Str DSPLY + * + C ENDSR + *--------------------------------------------------------------- + C CHOISER1 BEGSR + *--------------------------------------------------------------* + c EVAL £DBG_Str='1' + C ENDSR + *--------------------------------------------------------------- + C CHOISER2 BEGSR + *--------------------------------------------------------------* + c EVAL £DBG_Str='2' + C ENDSR From 422e63a0196c248647ba15dbde39cb2b96e64f50 Mon Sep 17 00:00:00 2001 From: cosentino-smeup <32836304+cosentino-smeup@users.noreply.github.com> Date: Mon, 4 Mar 2024 11:42:08 +0000 Subject: [PATCH 13/17] change tests to create just 2 steps --- .../rpgparser/evaluation/SmeupInterpreterTest.kt | 4 ++-- .../src/test/resources/smeup/T12_A08_P01.rpgle | 12 ++++++------ .../src/test/resources/smeup/T12_A08_P02.rpgle | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt index 1f1f20b36..d373d4a70 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt @@ -415,13 +415,13 @@ open class SmeupInterpreterTest : AbstractTest() { @Test fun executeT12_A08_P01() { - val expected = listOf("1", "2", "3") + val expected = listOf("123") assertEquals(expected, "smeup/T12_A08_P01".outputOf()) } @Test fun executeT12_A08_P02() { - val expected = listOf("1", "2", "2") + val expected = listOf("12") assertEquals(expected, "smeup/T12_A08_P02".outputOf()) } diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T12_A08_P01.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T12_A08_P01.rpgle index 7cf738253..065fcc58a 100644 --- a/rpgJavaInterpreter-core/src/test/resources/smeup/T12_A08_P01.rpgle +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T12_A08_P01.rpgle @@ -1,4 +1,4 @@ - D £DBG_Str S 1 + D £DBG_Str S 3 * C MOVEL '1' CHOISE 1 C EXSR SEZ_T12_A08 @@ -9,6 +9,8 @@ C MOVEL ' ' CHOISE C EXSR SEZ_T12_A08 * + C £DBG_Str DSPLY + * C SETON LR *--------------------------------------------------------------- C SEZ_T12_A08 BEGSR @@ -19,21 +21,19 @@ C CAS CHOISER3 C ENDCS * - C £DBG_Str DSPLY - * C ENDSR *--------------------------------------------------------------- C CHOISER1 BEGSR *--------------------------------------------------------------* - c EVAL £DBG_Str='1' + C EVAL £DBG_Str=%TRIM(£DBG_Str)+'1' C ENDSR *--------------------------------------------------------------- C CHOISER2 BEGSR *--------------------------------------------------------------* - c EVAL £DBG_Str='2' + C EVAL £DBG_Str=%TRIM(£DBG_Str)+'2' C ENDSR *--------------------------------------------------------------- C CHOISER3 BEGSR *--------------------------------------------------------------* - C EVAL £DBG_Str='3' + C EVAL £DBG_Str=%TRIM(£DBG_Str)+'3' C ENDSR diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T12_A08_P02.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T12_A08_P02.rpgle index fbb0b6e10..ec1aafb2b 100644 --- a/rpgJavaInterpreter-core/src/test/resources/smeup/T12_A08_P02.rpgle +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T12_A08_P02.rpgle @@ -1,4 +1,4 @@ - D £DBG_Str S 1 + D £DBG_Str S 3 * C MOVEL '1' CHOISE 1 C EXSR SEZ_T12_A08 @@ -9,6 +9,8 @@ C MOVEL ' ' CHOISE C EXSR SEZ_T12_A08 * + C £DBG_Str DSPLY + * C SETON LR *--------------------------------------------------------------- C SEZ_T12_A08 BEGSR @@ -18,16 +20,14 @@ C CHOISE CASEQ '2' CHOISER2 C ENDCS * - C £DBG_Str DSPLY - * C ENDSR *--------------------------------------------------------------- C CHOISER1 BEGSR *--------------------------------------------------------------* - c EVAL £DBG_Str='1' + C EVAL £DBG_Str=%TRIM(£DBG_Str)+'1' C ENDSR *--------------------------------------------------------------- C CHOISER2 BEGSR *--------------------------------------------------------------* - c EVAL £DBG_Str='2' + C EVAL £DBG_Str=%TRIM(£DBG_Str)+'2' C ENDSR From 0f51a479b3a2becb970005e24fadb4228c4db762 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Mon, 4 Mar 2024 13:38:09 +0100 Subject: [PATCH 14/17] Implemented `T02_A50_P08` test --- .../evaluation/SmeupInterpreterTest.kt | 8 ++++++++ .../src/test/resources/smeup/T02_A50_P08.rpgle | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P08.rpgle diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt index 3ab9edef8..7103b2da2 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt @@ -478,4 +478,12 @@ open class SmeupInterpreterTest : AbstractTest() { ) assertEquals(expected, "smeup/T02_A40_P09".outputOf()) } + + @Test + fun executeT02_A50_P08() { + val expected = listOf( + "A50_A81(Funzione ) A50_N81(Funzione )A50_V81(Funzione)" + ) + assertEquals(expected, "smeup/T02_A50_P08".outputOf()) + } } \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P08.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P08.rpgle new file mode 100644 index 000000000..912b64f3d --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P08.rpgle @@ -0,0 +1,18 @@ + D £DBG_I_Fun S 10 Funzione chiamata + D £DBG_I_Num S 7 0 Numero esecuzioni + D £DBG_O_Str S 2560 VARYING Risultato + + D A50_A81 S LIKE(£DBG_I_Fun) + D A50_N81 S LIKE(£DBG_I_Num) + D A50_V81 S LIKE(£DBG_O_Str) + + D £DBG_Str S 150 VARYING + + D* DS con overlay e campi definiti singolarmente + C EVAL A50_A81='Funzione' + C EVAL A50_N81=1234567 + C EVAL A50_V81='Funzione' + C EVAL £DBG_Str= 'A50_A81('+A50_A81+')' + C +' A50_N81('+%CHAR(A50_A81)+')' + C + 'A50_V81('+A50_V81+')' + C £DBG_Str DSPLY From 7475a9d70b48c5be78f6a56f9971d19a398ced96 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Mon, 4 Mar 2024 13:40:38 +0100 Subject: [PATCH 15/17] Implemented `T02_A50_P09` test --- .../evaluation/SmeupInterpreterTest.kt | 8 +++++++ .../test/resources/smeup/T02_A50_P09.rpgle | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P09.rpgle diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt index 7103b2da2..199c219e3 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/SmeupInterpreterTest.kt @@ -486,4 +486,12 @@ open class SmeupInterpreterTest : AbstractTest() { ) assertEquals(expected, "smeup/T02_A50_P08".outputOf()) } + + @Test + fun executeT02_A50_P09() { + val expected = listOf( + "A50_A91(Funzione ) A50_N91(Funzione )A50_V91(Funzione)" + ) + assertEquals(expected, "smeup/T02_A50_P09".outputOf()) + } } \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P09.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P09.rpgle new file mode 100644 index 000000000..20070a0ec --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P09.rpgle @@ -0,0 +1,22 @@ + D £DBG_I_Fun S 10 Funzione chiamata + D £DBG_I_Num S 7 0 Numero esecuzioni + D £DBG_O_Str S 2560 VARYING Risultato + + D A50_A81 S LIKE(£DBG_I_Fun) + D A50_N81 S LIKE(£DBG_I_Num) + D A50_V81 S LIKE(£DBG_O_Str) + + D A50_A91 S LIKE(A50_A81) + D A50_N91 S LIKE(A50_N81) + D A50_V91 S LIKE(A50_V81) + + D £DBG_Str S 150 VARYING + + D* DS con overlay e campi definiti singolarmente + C EVAL A50_A91='Funzione' + C EVAL A50_N91=1234567 + C EVAL A50_V91='Funzione' + C EVAL £DBG_Str= 'A50_A91('+A50_A91+')' + C +' A50_N91('+%CHAR(A50_A91)+')' + C + 'A50_V91('+A50_V91+')' + C £DBG_Str DSPLY From 85ddccf42d5355f7aa21605e032693b8da6e4ebf Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Tue, 5 Mar 2024 10:10:18 +0100 Subject: [PATCH 16/17] Removed space in .rpgle files --- .../src/test/resources/smeup/T02_A50_P08.rpgle | 2 +- .../src/test/resources/smeup/T02_A50_P09.rpgle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P08.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P08.rpgle index 912b64f3d..0c7fc3bb8 100644 --- a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P08.rpgle +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P08.rpgle @@ -6,7 +6,7 @@ D A50_N81 S LIKE(£DBG_I_Num) D A50_V81 S LIKE(£DBG_O_Str) - D £DBG_Str S 150 VARYING + D £DBG_Str S 150 VARYING D* DS con overlay e campi definiti singolarmente C EVAL A50_A81='Funzione' diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P09.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P09.rpgle index 20070a0ec..b8a10731f 100644 --- a/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P09.rpgle +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T02_A50_P09.rpgle @@ -10,7 +10,7 @@ D A50_N91 S LIKE(A50_N81) D A50_V91 S LIKE(A50_V81) - D £DBG_Str S 150 VARYING + D £DBG_Str S 150 VARYING D* DS con overlay e campi definiti singolarmente C EVAL A50_A91='Funzione' From 568b6f0802de7d62e5542c83b545a011ce161a00 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Tue, 5 Mar 2024 10:17:27 +0100 Subject: [PATCH 17/17] Improved calculation of `explicitElementType` --- .../rpgparser/parsing/parsetreetoast/data_definitions.kt | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt index 62e60a895..d89dbfdb0 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt @@ -790,13 +790,8 @@ private fun RpgParser.Parm_fixedContext.toFieldInfo(conf: ToAstConfiguration = T return FieldInfo(this.name, overlayInfo = overlayInfo, explicitStartOffset = this.explicitStartOffset(), explicitEndOffset = if (explicitStartOffset() != null) this.explicitEndOffset() else null, - explicitElementType = this.calculateExplicitElementType(arraySizeDeclared, conf) ?: let { - val dataDefinition = knownDataDefinitions.firstOrNull { - it.name.equals(varName, ignoreCase = true) || it.fields.firstOrNull { fe -> fe.name.equals(varName, ignoreCase = true) } != null - } - - if (dataDefinition?.name.equals(varName, ignoreCase = true)) dataDefinition else dataDefinition?.fields?.firstOrNull { f -> f.name.equals(varName, ignoreCase = true) } - }?.type, + explicitElementType = this.calculateExplicitElementType(arraySizeDeclared, conf) ?: knownDataDefinitions.firstOrNull { it.name.equals(varName, ignoreCase = true) }?.type + ?: knownDataDefinitions.flatMap { it.fields }.firstOrNull { fe -> fe.name.equals(varName, ignoreCase = true) }?.type, arraySizeDeclared = this.arraySizeDeclared(conf), arraySizeDeclaredOnThisField = this.arraySizeDeclared(conf), initializationValue = initializationValue,