Migrate access operator evaluator to Kotlin

This commit is contained in:
2020-03-07 19:12:47 +01:00
parent f71b59f51e
commit 81dfc32f67
2 changed files with 35 additions and 1 deletions

View File

@@ -0,0 +1,33 @@
package io.smnp.evaluation.evaluator
import io.smnp.dsl.ast.model.node.AccessOperatorNode
import io.smnp.dsl.ast.model.node.FunctionCallNode
import io.smnp.dsl.ast.model.node.IdentifierNode
import io.smnp.dsl.ast.model.node.Node
import io.smnp.error.EvaluationException
import io.smnp.evaluation.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class AccessOperatorEvaluator : Evaluator() {
override fun supportedNodes() = listOf(AccessOperatorNode::class)
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val evaluator = DefaultEvaluator()
val (lhsNode, _, rhsNode) = (node as AccessOperatorNode)
val lhs = evaluator.evaluate(lhsNode, environment).value!!
return when (rhsNode) {
is IdentifierNode -> {
val rhs = rhsNode.token.rawValue
EvaluatorOutput.value(lhs.properties[rhs] ?: throw EvaluationException("Unknown property $rhs of type ${lhs.type.name.toLowerCase()}", rhsNode.position))
}
is FunctionCallNode -> {
// todo Implement when methods become available
EvaluatorOutput.fail()
}
else -> {
throw EvaluationException("Invalid property access type - only property name and method call are allowed", rhsNode.position)
}
}
}
}

View File

@@ -21,7 +21,8 @@ class DefaultEvaluator : Evaluator() {
NotOperatorEvaluator(),
PowerOperatorEvaluator(),
ProductOperatorEvaluator(),
SumOperatorEvaluator()
SumOperatorEvaluator(),
AccessOperatorEvaluator()
).evaluate(node, environment)
}
}