Fix issues occured while raising RuntimeError
eqn was added to RuntimeError, but not passed to the parent
class ParserError
Errors occured while ParserError tried subscripting on the missing eqn
variable
Fix adds the missing arguments while raising RuntimeError
Fixes regressions introduced in eb9d99a
Reproduce:
Type random text (eg. sweetener) -> Hit Enter / Equals symbol (=)
Traceback:
```
1592573782.228379 DEBUG Calculate: Result: RuntimeError("Variable 'sweetener' not defined", 0, 5)
Traceback (most recent call last):
File "/usr/share/sugar/activities/Calculate.activity/layout.py", line 133, in <lambda>
lambda w: self._parent.process()],
File "/usr/share/sugar/activities/Calculate.activity/calculate.py", line 552, in process
self.set_error_equation(eqn)
File "/usr/share/sugar/activities/Calculate.activity/calculate.py", line 444, in set_error_equation
self.set_last_equation(eqn)
File "/usr/share/sugar/activities/Calculate.activity/calculate.py", line 439, in set_last_equation
self.layout.last_eq.set_buffer(eqn.create_lasteq_textbuf())
File "/usr/share/sugar/activities/Calculate.activity/calculate.py", line 219, in create_lasteq_textbuf
resstr = str(self.result)
File "/usr/share/sugar/activities/Calculate.activity/astparser.py", line 110, in __str__
{'a': self.eqn[self._range[0] - 1: self._range[1] - 1],
TypeError: 'NoneType' object is not subscriptable
```
Fixes #67
Shaan Subbaiah authored 3 years ago
James Cameron committed 3 years ago
71 | 71 | ParserError.__init__(self, msg, start, eqn, end) |
72 | 72 | |
73 | 73 | def __str__(self): |
74 | msg = _("Error at %s, position: %s") % \ | |
75 | (self.eqn[self._range[0] - 1: self._range[1] - 1], | |
74 | msg = _("Error at \'%s\', position: %s") % \ | |
75 | (self.eqn[self._range[0]: self._range[1]] or self.eqn, | |
76 | 76 | self._range[0]) |
77 | 77 | if self._msg is not None and len(self._msg) > 0: |
78 | msg += ": %s" % (self._msg) | |
78 | msg += "\n%s" % (self._msg) | |
79 | 79 | return msg |
80 | 80 | |
81 | 81 | |
84 | 84 | """Class for reporting syntax errors.""" |
85 | 85 | |
86 | 86 | def __init__(self, module=None, helper=None, start=0, end=0): |
87 | ParserError.__init__(self, _("Syntax Error."), start, end) | |
87 | ParserError.__init__(self, _("Syntax Error."), start, "", end) | |
88 | 88 | if module is None and helper is not None: |
89 | 89 | self.help_text = helper.get_help(module) |
90 | 90 | else: |
102 | 102 | """Class for error during executing.""" |
103 | 103 | |
104 | 104 | def __init__(self, msg, start, eqn, end=None): |
105 | ParserError.__init__(self, msg, start, end) | |
105 | ParserError.__init__(self, msg, start, eqn, end) | |
106 | 106 | |
107 | 107 | def __str__(self): |
108 | msg = _("Error at %s, position: %s") % \ | |
109 | (self.eqn[self._range[0] - 1: self._range[1] - 1], | |
108 | msg = _("Error at \'%s\', position: %s") % \ | |
109 | (self.eqn[self._range[0]: self._range[1]] or self.eqn, | |
110 | 110 | self._range[0]) |
111 | 111 | if self._msg is not None and len(self._msg) > 0: |
112 | msg += ": %s" % (self._msg) | |
112 | msg += "\n%s" % (self._msg) | |
113 | 113 | return msg |
114 | 114 | |
115 | 115 | |
118 | 118 | """Class for error if incorrect arguments are entered.""" |
119 | 119 | |
120 | 120 | def __init__(self, msg, end=None): |
121 | ParserError.__init__(self, msg, 0, end) | |
121 | ParserError.__init__(self, msg, 0, "", end) | |
122 | 122 | |
123 | 123 | def __str__(self): |
124 | 124 | return self._msg |
451 | 451 | try: |
452 | 452 | return func(left, right) |
453 | 453 | except Exception as e: |
454 | raise RuntimeError(str(e), node.right.col_offset - 1) | |
454 | raise RuntimeError(str(e), node.right.col_offset - 1, "") | |
455 | 455 | |
456 | 456 | elif isinstance(node, ast.UnaryOp): |
457 | 457 | operand = self._process_node(node.operand, state) |
507 | 507 | if not isfunc: |
508 | 508 | # Check whether variable was already used in this branch |
509 | 509 | if node.id in state.branch_vars: |
510 | raise RuntimeError(_('Recursion detected'), ofs) | |
510 | raise RuntimeError(_('Recursion detected'), ofs, "") | |
511 | 511 | state.branch_vars = copy.copy(state.branch_vars) |
512 | 512 | |
513 | 513 | # Update where variable is first used |
534 | 534 | msg = _("Function '%s' not defined") % (node.id) |
535 | 535 | else: |
536 | 536 | msg = _("Variable '%s' not defined") % (node.id) |
537 | raise RuntimeError(msg, ofs, ofs + len(node.id)) | |
537 | raise RuntimeError(msg, ofs, node.id, ofs + len(node.id)) | |
538 | 538 | |
539 | 539 | elif isinstance(node, ast.Attribute): |
540 | 540 | parent = self._process_node(node.value, state) |
544 | 544 | return val |
545 | 545 | except Exception as e: |
546 | 546 | msg = _("Attribute '%s' does not exist") % node.value |
547 | raise RuntimeError(msg, ofs, ofs + len(node.value)) | |
547 | raise RuntimeError(msg, ofs, node.value, | |
548 | ofs + len(node.value)) | |
548 | 549 | |
549 | 550 | return None |
550 | 551 |