from smnp.ast.node.block import BlockNode from smnp.ast.node.function import FunctionDefinitionNode from smnp.ast.node.identifier import IdentifierNode from smnp.ast.node.none import NoneNode from smnp.ast.node.statement import StatementNode from smnp.ast.node.type import TypeNode from smnp.ast.parser import Parser from smnp.token.type import TokenType class ExtendNode(StatementNode): def __init__(self, pos): super().__init__(pos) self.children = [NoneNode(), NoneNode(), NoneNode()] @property def type(self): return self[0] @type.setter def type(self, value): self[0] = value @property def variable(self): return self[1] @variable.setter def variable(self, value): self[1] = value @property def methods(self): return self[2] @methods.setter def methods(self, value): self[2] = value @classmethod def _parse(cls, input): def createNode(extend, type, asKeyword, variable, methods): node = ExtendNode(extend.pos) node.type = type node.variable = variable node.methods = methods return node return Parser.allOf( Parser.terminalParser(TokenType.EXTEND), Parser.doAssert(TypeNode.parse, "type being extended"), Parser.terminalParser(TokenType.AS, doAssert=True), Parser.doAssert(IdentifierNode.identifierParser(), "variable name"), Parser.doAssert(cls._methodsDeclarationsParser(), "methods declarations"), createNode=createNode )(input) @classmethod def _methodsDeclarationsParser(cls): def createNode(openBracket, items, closeBracket): node = BlockNode(openBracket.pos) node.children = items return node return Parser.loop( Parser.terminalParser(TokenType.OPEN_CURLY), Parser.doAssert(FunctionDefinitionNode.parse, f"method declaration or '{TokenType.CLOSE_CURLY.key}'"), Parser.terminalParser(TokenType.CLOSE_CURLY), createNode=createNode )