Improve map key's evaluator
This commit is contained in:
@@ -1,22 +1,39 @@
|
|||||||
package io.smnp.evaluation.evaluator
|
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.MapEntryNode
|
||||||
import io.smnp.dsl.ast.model.node.MapNode
|
import io.smnp.dsl.ast.model.node.MapNode
|
||||||
import io.smnp.dsl.ast.model.node.Node
|
import io.smnp.dsl.ast.model.node.Node
|
||||||
import io.smnp.environment.Environment
|
import io.smnp.environment.Environment
|
||||||
|
import io.smnp.error.EvaluationException
|
||||||
import io.smnp.evaluation.model.entity.EvaluatorOutput
|
import io.smnp.evaluation.model.entity.EvaluatorOutput
|
||||||
|
import io.smnp.type.enumeration.DataType.*
|
||||||
import io.smnp.type.model.Value
|
import io.smnp.type.model.Value
|
||||||
|
|
||||||
class MapEvaluator : Evaluator() {
|
class MapEvaluator : Evaluator() {
|
||||||
|
private val evaluator = ExpressionEvaluator()
|
||||||
|
|
||||||
override fun supportedNodes() = listOf(MapNode::class)
|
override fun supportedNodes() = listOf(MapNode::class)
|
||||||
|
|
||||||
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
|
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
|
||||||
val atomEvaluator = ExpressionEvaluator()
|
|
||||||
val value = (node as MapNode).items
|
val value = (node as MapNode).items
|
||||||
.map { it as MapEntryNode }
|
.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()
|
.toMap()
|
||||||
|
|
||||||
return EvaluatorOutput.value(Value.map(value))
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user