Files
smnp-py/smnp/runtime/evaluators/access.py
2019-07-05 17:00:43 +02:00

43 lines
1.6 KiB
Python

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
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):
# raise RuntimeException(functionCall.pos, f"Calling '{funcName}' requires {len(library['params'])} and {len(arguments)} was passed")
# environment.scopes.append({ library['params'][i].identifier: v for i, v in enumerate(arguments) })
# returnValue = None
# for node in library['body']:
# if not isinstance(node, ReturnNode):
# evaluate(node, environment)
# else:
# returnValue = evaluateReturn(node, environment)
# environment.scopes.pop(-1)
# return returnValue