Skip to content

Commit

Permalink
Merge pull request #164 from smeup/double_var_definition
Browse files Browse the repository at this point in the history
A D spec can't define a variable with the same name twice
  • Loading branch information
benetti-smeup authored May 7, 2020
2 parents 1b3e56d + e39a2b8 commit 73a95dd
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import java.lang.RuntimeException
* This is a very limited interpreter used at compile time, mainly
* while examining data definitions.
*
* It should consider only statically evaluatable elements.
* It should consider only statically evaluable elements.
*/
interface CompileTimeInterpreter {
fun evaluate(rContext: RpgParser.RContext, expression: Expression): Value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.strumenta.kolasu.mapping.toPosition
import com.strumenta.kolasu.model.*
import org.antlr.v4.runtime.ParserRuleContext
import org.antlr.v4.runtime.Token
import java.lang.IllegalArgumentException
import java.util.*

data class ToAstConfiguration(
Expand Down Expand Up @@ -47,8 +48,8 @@ private fun RContext.getDataDefinitions(conf: ToAstConfiguration = ToAstConfigur
// We need to calculate first all the data definitions which do not contain the LIKE DS directives
// then we calculate the ones with the LIKE DS clause, as they could have references to DS declared
// after them
var dataDefinitionProviders: MutableList<DataDefinitionProvider> = LinkedList()
val knownDataDefinitions = LinkedList<DataDefinition>()
val dataDefinitionProviders: MutableList<DataDefinitionProvider> = LinkedList()
val knownDataDefinitions = mutableMapOf<String, DataDefinition>()

// First pass ignore exception and all the know definitions
dataDefinitionProviders.addAll(this.statement()
Expand All @@ -57,7 +58,7 @@ private fun RContext.getDataDefinitions(conf: ToAstConfiguration = ToAstConfigur
it.dcl_ds() != null -> {
try {
val dataDefinition = it.dcl_ds().toAst(conf)
knownDataDefinitions.add(dataDefinition)
knownDataDefinitions.addIfNotPresent(dataDefinition)
DataDefinitionHolder(dataDefinition)
} catch (e: Exception) {
null
Expand All @@ -72,8 +73,8 @@ private fun RContext.getDataDefinitions(conf: ToAstConfiguration = ToAstConfigur
.mapNotNull {
when {
it.dspec() != null -> {
val dataDefinition = it.dspec().toAst(conf, knownDataDefinitions)
knownDataDefinitions.add(dataDefinition)
val dataDefinition = it.dspec().toAst(conf, knownDataDefinitions.values.toList())
knownDataDefinitions.addIfNotPresent(dataDefinition)
DataDefinitionHolder(dataDefinition)
}
it.dcl_ds() != null -> if (it.dcl_ds().useLikeDs()) {
Expand All @@ -87,6 +88,11 @@ private fun RContext.getDataDefinitions(conf: ToAstConfiguration = ToAstConfigur
return dataDefinitionProviders.map { it.toDataDefinition() }
}

private fun MutableMap<String, DataDefinition>.addIfNotPresent(dataDefinition: DataDefinition) {
if (put(dataDefinition.name, dataDefinition) != null)
throw IllegalArgumentException("${dataDefinition.name} has been defined twice")
}

fun RContext.toAst(conf: ToAstConfiguration = ToAstConfiguration()): CompilationUnit {
val fileDefinitions = this.statement()
.mapNotNull {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,22 @@ import kotlin.test.assertTrue

class InterpreterTest {

@Test
fun doubleVarDefinitionWithDifferentTypeShouldThrowAnError() {
val systemInterface = JavaSystemInterface()

val source = """
| D n S 1 0 inz(00)
| D n S 1 0 inz(00)
| C SETON LR
""".trimMargin()

val program = getProgram(source, systemInterface)
assertFailsWith(IllegalArgumentException::class) {
program.singleCall(listOf())
}
}

@Test
fun executeCALCFIB_initialDeclarations_dec() {
val cu = assertASTCanBeProduced("CALCFIB_1", true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
DCOUNT S 8 0
DA S 8 0 INZ(0)
DB S 8 0 INZ(1)
DB S 8 0 INZ(1)
DAR1 S 3S 0 DIM(10)
*
C CLEAR FIELD1
Expand Down

0 comments on commit 73a95dd

Please sign in to comment.