Improve map key's evaluator

This commit is contained in:
2020-03-12 20:47:32 +01:00
parent e7567a1078
commit e7268bf18a

View File

@@ -1,22 +1,39 @@
package io.smnp.evaluation.evaluator
import io.smnp.dsl.ast.model.node.IdentifierNode
import io.smnp.dsl.ast.model.node.MapEntryNode
import io.smnp.dsl.ast.model.node.MapNode
import io.smnp.dsl.ast.model.node.Node
import io.smnp.environment.Environment
import io.smnp.error.EvaluationException
import io.smnp.evaluation.model.entity.EvaluatorOutput
import io.smnp.type.enumeration.DataType.*
import io.smnp.type.model.Value
class MapEvaluator : Evaluator() {
private val evaluator = ExpressionEvaluator()
override fun supportedNodes() = listOf(MapNode::class)
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val atomEvaluator = ExpressionEvaluator()
val value = (node as MapNode).items
.map { it as MapEntryNode }
.map { atomEvaluator.evaluate(it.key, environment).value!! to atomEvaluator.evaluate(it.value, environment).value!! }
.map { getKey(it.key, environment) to evaluator.evaluate(it.value, environment).value!! }
.toMap()
return EvaluatorOutput.value(Value.map(value))
}
private fun getKey(keyNode: Node, environment: Environment): Value {
val key = when(keyNode) {
is IdentifierNode -> Value.string(keyNode.token.rawValue)
else -> evaluator.evaluate(keyNode, environment).value!!
}
if(key.type !in listOf(BOOL, INT, NOTE, STRING)) {
throw EvaluationException("Invalid map key's type ${key.type.name.toLowerCase()}", keyNode.position)
}
return key
}
}