Create assertions on extend statements

This commit is contained in:
Bartłomiej Pluta
2019-07-12 17:10:47 +02:00
parent 0aad7e52dd
commit 0c72203551
3 changed files with 8 additions and 9 deletions

View File

@@ -54,17 +54,17 @@ def ExtendParser(input):
Parser.terminal(TokenType.AS),
IdentifierLiteralParser,
Parser.terminal(TokenType.WITH),
Parser.wrap(FunctionDefinitionParser, lambda method: Block.withChildren([ method ], method.pos)),
Parser.doAssert(Parser.wrap(FunctionDefinitionParser, lambda method: Block.withChildren([ method ], method.pos)), "method definition"),
createNode=lambda extend, type, _, variable, __, methods: Extend.withValues(extend.pos, type, variable, methods),
name="simple extend"
)
multiExtend = Parser.allOf(
Parser.terminal(TokenType.EXTEND),
TypeParser,
Parser.terminal(TokenType.AS),
IdentifierLiteralParser,
MethodsDeclarationParser,
Parser.doAssert(TypeParser, "type being extended"),
Parser.terminal(TokenType.AS, doAssert=True),
Parser.doAssert(IdentifierLiteralParser, "variable name"),
Parser.doAssert(MethodsDeclarationParser, f"block with methods definitions or '{TokenType.WITH.key}' keyword"),
createNode=lambda extend, type, _, variable, methods: Extend.withValues(extend.pos, type, variable, methods),
name="multiple extend"
)
@@ -80,7 +80,7 @@ def ExtendParser(input):
def MethodsDeclarationParser(input):
return Parser.loop(
Parser.terminal(TokenType.OPEN_CURLY),
FunctionDefinitionParser,
Parser.doAssert(FunctionDefinitionParser, f"method definition or '{TokenType.CLOSE_CURLY.key}'"),
Parser.terminal(TokenType.CLOSE_CURLY),
createNode=lambda open, methods, close: Block.withChildren(methods, open.pos),
name="methods block"

View File

@@ -134,13 +134,12 @@ def MethodBodyParser(input):
bodyItem = Parser.oneOf(
ReturnParser,
StatementParser,
assertExpected="statement",
name="function body item"
)
return Parser.loop(
Parser.terminal(TokenType.OPEN_CURLY),
bodyItem,
Parser.doAssert(bodyItem, f"statement or '{TokenType.CLOSE_CURLY.key}'"),
Parser.terminal(TokenType.CLOSE_CURLY),
createNode=lambda open, statements, close: Block.withChildren(statements, open.pos),
name="function body"

View File

@@ -78,7 +78,7 @@ def abstractIterableParser(iterableNodeType, openTokenType, closeTokenType, item
return node
return Parser.allOf(
Parser.terminal(TokenType.COMMA, doAssert=True),
Parser.doAssert(Parser.terminal(TokenType.COMMA), f"'{TokenType.COMMA.key}' or '{closeTokenType.key}'"),
itemParser,
abstractIterableTailParser,
createNode=createNode