Enable invoking builtin methods

This commit is contained in:
Bartłomiej Pluta
2019-07-08 17:15:54 +02:00
parent 8b7e1432b6
commit d8cdafe293
3 changed files with 72 additions and 31 deletions

View File

@@ -1,32 +1,46 @@
from smnp.ast.node.access import AccessNode
from smnp.ast.node.function import FunctionCallNode
from smnp.error.base import SmnpException
from smnp.error.runtime import RuntimeException
from smnp.runtime.evaluator import evaluate
from smnp.runtime.evaluators.list import evaluateList
from smnp.ast.node.identifier import IdentifierNode
from smnp.ast.node.invocation import FunctionCallNode
from smnp.runtime.evaluator import Evaluator
from smnp.runtime.evaluators.expression import expressionEvaluator
from smnp.runtime.evaluators.iterable import abstractIterableEvaluator
def evaluateAccess(access, environment):
element = evaluate(access.element, environment)
if type(access.property) == FunctionCallNode:
return evaluateMethodCall(element, access.property, environment)
if type(access.property) == AccessNode:
return evaluateAccess(access.property, environment)
class AccessEvaluator(Evaluator):
raise RuntimeException("Not implemented yet", access.property.pos)
# TODO only methods can be handled so far
@classmethod
def evaluator(cls, node, environment):
left = expressionEvaluator(doAssert=True)(node.left, environment).value #TODO check if it isn't necessary to verify 'result' attr of EvaluatioNResult
right = node.right
if type(node.right) == IdentifierNode:
raise RuntimeError("Accessing properties is not implemented yet")
def evaluateMethodCall(element, methodCall, environment):
try:
methodName = methodCall.identifier.identifier
arguments = evaluateList(methodCall.arguments, environment)
if type(node.right) == FunctionCallNode:
arguments = abstractIterableEvaluator(expressionEvaluator(True))(right.arguments, environment)
return environment.invokeMethod(left, right.name.value, arguments)
return environment.invokeMethod(methodName, element, arguments)
except SmnpException as e:
e.pos = methodCall.pos
raise e
#
# def evaluateAccess(access, environment):
# element = evaluate(access.element, environment)
# if type(access.property) == FunctionCallNode:
# return evaluateMethodCall(element, access.property, environment)
# if type(access.property) == AccessNode:
# return evaluateAccess(access.property, environment)
#
# raise RuntimeException("Not implemented yet", access.property.pos)
# # TODO only methods can be handled so far
#
#
# def evaluateMethodCall(element, methodCall, environment):
# try:
# methodName = methodCall.identifier.identifier
# arguments = evaluateList(methodCall.arguments, environment)
#
# return environment.invokeMethod(methodName, element, arguments)
#
# except SmnpException as e:
# e.pos = methodCall.pos
# raise e
# for name, library in environment.customFunctions.items():
# if funcName == name:
# if len(library['params']) != len(arguments):