Concepts bodies are now evaluated on demand
This commit is contained in:
@@ -5,12 +5,13 @@ import core.ast.nodes
|
||||
from core.ast.nodes import CallNodeConcept, GenericNodeConcept
|
||||
from core.ast.visitors import UnreferencedNamesVisitor
|
||||
from core.builtin_concepts import BuiltinConcepts
|
||||
from core.concept import Concept
|
||||
|
||||
|
||||
def is_same_success(sheerka, return_values):
|
||||
def is_same_success(context, return_values):
|
||||
"""
|
||||
Returns True if all returns values are successful and have the same value
|
||||
:param sheerka:
|
||||
:param context:
|
||||
:param return_values:
|
||||
:return:
|
||||
"""
|
||||
@@ -19,13 +20,27 @@ def is_same_success(sheerka, return_values):
|
||||
if not return_values[0].status:
|
||||
return False
|
||||
|
||||
reference = sheerka.value(return_values[0].value)
|
||||
if isinstance(return_values[0].body, Concept):
|
||||
evaluated = context.sheerka.evaluate_concept(context, return_values[0].body, True)
|
||||
if evaluated.key != return_values[0].body.key:
|
||||
return False
|
||||
reference = context.sheerka.value(evaluated)
|
||||
else:
|
||||
reference = context.sheerka.value(return_values[0])
|
||||
|
||||
for return_value in return_values[1:]:
|
||||
if not return_value.status:
|
||||
return False
|
||||
|
||||
actual = sheerka.value(return_value.value)
|
||||
if isinstance(return_value.body, Concept):
|
||||
evaluated = context.sheerka.evaluate_concept(context, return_value.body, True)
|
||||
if evaluated.key != return_value.body.key:
|
||||
return False
|
||||
|
||||
actual = context.sheerka.value(evaluated)
|
||||
else:
|
||||
actual = context.sheerka.value(return_value)
|
||||
|
||||
if actual != reference:
|
||||
return False
|
||||
|
||||
@@ -67,7 +82,7 @@ def expect_one(context, return_values):
|
||||
|
||||
# too many winners, which one to choose ?
|
||||
if number_of_successful > 1:
|
||||
if is_same_success(sheerka, successful_results):
|
||||
if is_same_success(context, successful_results):
|
||||
return sheerka.ret(
|
||||
context.who,
|
||||
True,
|
||||
@@ -218,3 +233,22 @@ def _extract_predicates(sheerka, node, variables_to_include, variables_to_exclud
|
||||
predicates.append(res)
|
||||
|
||||
return predicates
|
||||
|
||||
|
||||
def add_to_ret_val(sheerka, context, return_values, concept_key):
|
||||
concept = sheerka.new(concept_key)
|
||||
ret_val = sheerka.ret(context.who, True, concept)
|
||||
return_values.append(ret_val)
|
||||
return return_values
|
||||
|
||||
|
||||
def remove_from_ret_val(sheerka, return_values, concept_key):
|
||||
to_remove = []
|
||||
for ret_val in return_values:
|
||||
if ret_val.status and sheerka.isinstance(ret_val.body, concept_key):
|
||||
to_remove.append(ret_val)
|
||||
|
||||
for item in to_remove:
|
||||
return_values.remove(item)
|
||||
|
||||
return return_values
|
||||
|
||||
Reference in New Issue
Block a user