From 81dfc32f67f8888c5d431b4e7af3ad83b93960aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Sat, 7 Mar 2020 19:12:47 +0100 Subject: [PATCH] Migrate access operator evaluator to Kotlin --- .../evaluator/AccessOperatorEvaluator.kt | 33 +++++++++++++++++++ .../evaluation/evaluator/DefaultEvaluator.kt | 3 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/io/smnp/evaluation/evaluator/AccessOperatorEvaluator.kt diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/AccessOperatorEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/AccessOperatorEvaluator.kt new file mode 100644 index 0000000..7728991 --- /dev/null +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/AccessOperatorEvaluator.kt @@ -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) + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt index cf45b78..2860e2b 100644 --- a/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt @@ -21,7 +21,8 @@ class DefaultEvaluator : Evaluator() { NotOperatorEvaluator(), PowerOperatorEvaluator(), ProductOperatorEvaluator(), - SumOperatorEvaluator() + SumOperatorEvaluator(), + AccessOperatorEvaluator() ).evaluate(node, environment) } } \ No newline at end of file