Skip to content

Commit

Permalink
Merge pull request #694 from smeup/bugfix/bugfix/fix-ds-fields-duplic…
Browse files Browse the repository at this point in the history
…ation-which-uses-extname

Bugfix/bugfix/Fix DS fields duplication which uses `EXTNAME`
  • Loading branch information
lanarimarco authored Jan 20, 2025
2 parents e9422c1 + a1d229b commit bd1e961
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -1304,8 +1304,9 @@ internal fun RpgParser.Dcl_dsContext.getExtnameFields(
val prefixIsNull = keywordPrefix == null && it.key.prefix == null
val prefixIsValid = keywordPrefix != null && it.key.prefix != null && it.key.prefix is Prefix
val prefixMatches = prefixIsValid && it.key.prefix?.prefix == prefixName
val isForExtname = it.key.justExtName

nameMatches && (prefixIsNull || prefixMatches)
nameMatches && (prefixIsNull || prefixMatches) && isForExtname
}.values.flatten()

if (fileDataDefinitions.isEmpty()) return emptyList()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.smeup.rpgparser.parsing.ast

import com.smeup.rpgparser.AbstractTest
import com.smeup.rpgparser.interpreter.DataDefinition
import com.smeup.rpgparser.interpreter.DataStructureType
import com.smeup.rpgparser.interpreter.Scope
import com.smeup.rpgparser.interpreter.Visibility
Expand Down Expand Up @@ -396,4 +397,22 @@ open class ToAstSmokeTest : AbstractTest() {
assertNotNull(this.getAnyDataDefinition("SQLERM"), "SQLERM is defined")
}
}

/**
* Test the declaration of a DS which uses `EXTNAME` to a file already declared as `F` specification.
* The purpose of this test is to ensure about the right number of fields to avoid duplications.
*/
@Test
fun buildAstForEXTNAMEDS01() {
assertASTCanBeProduced(exampleName = "EXTNAMEDS01", printTree = false).apply {
this.resolveAndValidate()

val dataStructure: DataDefinition = this.getAnyDataDefinition("DS_ST01") as DataDefinition

assertEquals(dataStructure.fields.size, 4, "Number of fields is correct.")
assertNotNull(dataStructure.fields.firstOrNull { fieldDefinition -> fieldDefinition.name.equals("ST01_KEY") }, "ST01_KEY is defined under DS_ST01")
assertNotNull(dataStructure.fields.firstOrNull { fieldDefinition -> fieldDefinition.name.equals("ST01_COL1") }, "ST01_COL1 is defined under DS_ST01")
assertNotNull(dataStructure.fields.firstOrNull { fieldDefinition -> fieldDefinition.name.equals("ST01_COL2") }, "ST01_COL2 is defined under DS_ST01")
}
}
}
2 changes: 2 additions & 0 deletions rpgJavaInterpreter-core/src/test/resources/EXTNAMEDS01.rpgle
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
FST01 IF E K DISK
D DS_ST01 E DS EXTNAME(ST01) INZ
11 changes: 11 additions & 0 deletions rpgJavaInterpreter-core/src/test/resources/db/metadata/ST01.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{"name": "ST01",
"tableName": "ST01T",
"recordFormat": "ST01RF",
"fields": [
{ "fieldName": "ST01_KEY",
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":20, "varying":false}}
, { "fieldName": "ST01_COL1",
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}}
, { "fieldName": "ST01_COL2",
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}}
], "accessFields": [ "ST01_KEY" ]}

0 comments on commit bd1e961

Please sign in to comment.