Uast: UEvaluator.evaluateVariableByReference added

This commit is contained in:
Nicolay Mitropolsky
2018-09-10 11:55:53 +03:00
parent 636230aea9
commit d8b61a1958
2 changed files with 12 additions and 3 deletions
@@ -59,13 +59,20 @@ class TreeBasedEvaluator(
return resultCache[expression]?.value
}
override fun evaluate(expression: UExpression, state: UEvaluationState?): UValue {
override fun evaluate(expression: UExpression, state: UEvaluationState?): UValue = getEvaluationInfo(expression, state).value
private fun getEvaluationInfo(expression: UExpression, state: UEvaluationState? = null): UEvaluationInfo {
if (state == null) {
val result = resultCache[expression]
if (result != null) return result.value
if (result != null) return result
}
val inputState = state ?: inputStateCache[expression] ?: expression.createEmptyState()
return expression.accept(this, inputState).value
return expression.accept(this, inputState)
}
override fun evaluateVariableByReference(variableReference: UReferenceExpression, state: UEvaluationState?): UValue {
val target = variableReference.resolveToUElement() as? UVariable ?: return UUndeterminedValue
return getEvaluationInfo(variableReference, state).state[target]
}
// ----------------------- //
@@ -43,6 +43,8 @@ interface UEvaluator {
fun evaluate(expression: UExpression, state: UEvaluationState? = null): UValue
fun evaluateVariableByReference(variableReference: UReferenceExpression, state: UEvaluationState? = null): UValue
fun getDependents(dependency: UDependency): Set<UValue>
}