def visitAssignmentExpr(self, ctx: SolidityParser.AssignmentExprContext): if not self.is_expr_stmt(ctx): raise SyntaxException('Assignments are only allowed as statements', ctx, self.code) lhs = self.visit(ctx.lhs) rhs = self.visit(ctx.rhs) assert ctx.op.text[-1] == '=' op = ctx.op.text[:-1] if ctx.op.text != '=' else '' if op: # If the assignment contains an additional operator -> replace lhs = rhs with lhs = lhs 'op' rhs rhs = FunctionCallExpr(BuiltinFunction(op).override(line=ctx.op.line, column=ctx.op.column), [self.visit(ctx.lhs), rhs]) rhs.line = ctx.rhs.start.line rhs.column = ctx.rhs.start.column + 1 return ast.AssignmentStatement(lhs, rhs, op)
def _handle_crement_expr(self, ctx, kind: str): if not self.is_expr_stmt(ctx): raise SyntaxException(f'{kind}-crement expressions are only allowed as statements', ctx, self.code) op = '+' if ctx.op.text == '++' else '-' one = NumberLiteralExpr(1) one.line = ctx.op.line one.column = ctx.op.column + 1 fct = FunctionCallExpr(BuiltinFunction(op).override(line=ctx.op.line, column=ctx.op.column), [self.visit(ctx.expr), one]) fct.line = ctx.op.line fct.column = ctx.op.column + 1 return ast.AssignmentStatement(self.visit(ctx.expr), fct, f'{kind}{ctx.op.text}')