Enable creating custom methods

This commit is contained in:
Bartłomiej Pluta
2019-07-08 17:48:02 +02:00
parent d8cdafe293
commit 6d56706354
7 changed files with 61 additions and 8 deletions

View File

@@ -1,3 +1,4 @@
from smnp.ast.node.extend import ExtendNode
from smnp.ast.node.function import FunctionDefinitionNode
from smnp.ast.node.program import Program
from smnp.error.runtime import RuntimeException
@@ -68,9 +69,11 @@ def evaluate(node, environment):
from smnp.runtime.evaluators.expression import expressionEvaluator
from smnp.runtime.evaluators.function import FunctionDefinitionEvaluator
from smnp.runtime.evaluators.extend import ExtendEvaluator
result = Evaluator.oneOf(
Evaluator.forNodes(ProgramEvaluator.evaluate, Program),
Evaluator.forNodes(FunctionDefinitionEvaluator.evaluate, FunctionDefinitionNode),
Evaluator.forNodes(ExtendEvaluator.evaluate, ExtendNode),
expressionEvaluator()
)(node, environment)

View File

@@ -0,0 +1,25 @@
from smnp.runtime.evaluator import Evaluator
from smnp.runtime.evaluators.function import argumentsNodeToMethodSignature
from smnp.runtime.evaluators.type import TypeEvaluator
class ExtendEvaluator(Evaluator):
@classmethod
def evaluator(cls, node, environment):
type = TypeEvaluator.evaluate(node.type, environment).value #TODO check if it isn't necessary to verify 'result' attr of EvaluatioNResult
variable = node.variable.value
cls._evaluateExtend(node.methods, environment, type, variable)
@classmethod
def _evaluateExtend(cls, node, environment, type, variable):
for child in node.children:
cls._evaluateMethodDefinition(child, environment, type, variable)
@classmethod
def _evaluateMethodDefinition(cls, node, environment, type, variable):
name = node.name.value
signature = argumentsNodeToMethodSignature(node.arguments)
arguments = [arg.variable.value for arg in node.arguments]
body = node.body
environment.addCustomMethod(type, variable, name, signature, arguments, body)

View File

@@ -0,0 +1,10 @@
from smnp.runtime.evaluator import Evaluator
from smnp.type.model import Type
from smnp.type.value import Value
class TypeEvaluator(Evaluator):
@classmethod
def evaluator(cls, node, environment):
return Value(Type.TYPE, node.type)