pyscript-programming-language 1.12.4__tar.gz → 1.12.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. {pyscript_programming_language-1.12.4/pyscript_programming_language.egg-info → pyscript_programming_language-1.12.5}/PKG-INFO +1 -1
  2. pyscript_programming_language-1.12.5/changelog.md +14 -0
  3. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyproject.toml +1 -1
  4. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/__main__.py +7 -7
  5. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/analyzer.py +53 -47
  6. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/cache.py +1 -1
  7. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/checks.py +1 -1
  8. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/constants.py +43 -43
  9. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/handlers.py +5 -3
  10. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/highlight.py +1 -1
  11. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/interpreter.py +56 -49
  12. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/lexer.py +72 -72
  13. pyscript_programming_language-1.12.5/pyscript/core/mapping.py +144 -0
  14. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/objects.py +20 -8
  15. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/parser.py +125 -119
  16. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/position.py +1 -1
  17. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/pysbuiltins.py +6 -6
  18. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/results.py +25 -24
  19. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/runner.py +1 -1
  20. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/symtab.py +5 -1
  21. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/utils/ansi.py +6 -5
  22. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/utils/debug.py +16 -12
  23. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/utils/decorators.py +2 -1
  24. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/utils/generic.py +6 -5
  25. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/utils/module.py +3 -3
  26. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/utils/path.py +6 -6
  27. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/utils/similarity.py +3 -2
  28. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/utils/string.py +4 -3
  29. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/version.py +2 -2
  30. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/ast/ast_dump.py +58 -54
  31. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/ast/ast_literal_eval.py +23 -17
  32. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/ast/ast_unparse.py +44 -42
  33. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/ast/ast_walk.py +7 -2
  34. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/brainfuck.pys +6 -10
  35. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/explorer.pys +2 -2
  36. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/fpstimer/py_fpstimer.py +5 -5
  37. pyscript_programming_language-1.12.5/pyscript/lib/getch/py_getch.py +18 -0
  38. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/parser.pys +4 -4
  39. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/token.pys +2 -2
  40. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/tokenize/tok_untokenize.py +17 -14
  41. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5/pyscript_programming_language.egg-info}/PKG-INFO +1 -1
  42. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/setup.py +1 -1
  43. pyscript_programming_language-1.12.4/changelog.md +0 -13
  44. pyscript_programming_language-1.12.4/pyscript/core/mapping.py +0 -144
  45. pyscript_programming_language-1.12.4/pyscript/lib/getch/py_getch.py +0 -18
  46. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/MANIFEST.in +0 -0
  47. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/README.md +0 -0
  48. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/__init__.py +0 -0
  49. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/__init__.pyi +0 -0
  50. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/__init__.py +0 -0
  51. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/bases.py +0 -0
  52. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/buffer.py +0 -0
  53. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/context.py +0 -0
  54. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/editor/__init__.py +0 -0
  55. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/editor/bases.py +0 -0
  56. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/editor/gui.py +0 -0
  57. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/editor/terminal.py +0 -0
  58. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/exceptions.py +0 -0
  59. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/nodes.py +0 -0
  60. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/shell.py +0 -0
  61. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/token.py +0 -0
  62. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/utils/__init__.py +0 -0
  63. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/core/utils/jsdict.py +0 -0
  64. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/__hello__.pys +0 -0
  65. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/ansi.pys +0 -0
  66. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/ast/__init__.pys +0 -0
  67. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/dis.pys +0 -0
  68. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/fpstimer/__init__.pys +0 -0
  69. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/getch/__init__.pys +0 -0
  70. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/inspect.pys +0 -0
  71. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/jsdict.pys +0 -0
  72. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/keyword.pys +0 -0
  73. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/opcode.pys +0 -0
  74. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/pdisplay.pys +0 -0
  75. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/site.pys +0 -0
  76. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/symtable.pys +0 -0
  77. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/lib/tokenize/__init__.pys +0 -0
  78. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/other/.nomedia +0 -0
  79. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/other/PyScript.ico +0 -0
  80. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/other/copyright +0 -0
  81. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/other/credits +0 -0
  82. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/other/license +0 -0
  83. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/site-packages/this.pys +0 -0
  84. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript/this.py +0 -0
  85. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript_programming_language.egg-info/SOURCES.txt +0 -0
  86. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
  87. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript_programming_language.egg-info/requires.txt +0 -0
  88. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/pyscript_programming_language.egg-info/top_level.txt +0 -0
  89. {pyscript_programming_language-1.12.4 → pyscript_programming_language-1.12.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscript-programming-language
3
- Version: 1.12.4
3
+ Version: 1.12.5
4
4
  Summary: PyScript Programming Language
5
5
  Home-page: https://azzammuhyala.github.io/pyscript
6
6
  Author: azzammuhyala
@@ -0,0 +1,14 @@
1
+ # Change Log
2
+
3
+ ## [1.12.5] - 12/03/2026
4
+
5
+ ### Added
6
+ - Type hints in almost all core implementations and built-in modules.
7
+ - _etc._
8
+
9
+ ### Fixed
10
+ - **Fixed some bugs**.
11
+ - `return` statements will not consume the following line, including `as`, `assert`, and `throw`/`raise`.
12
+ - Changed the token type name separator `-` to `_`.
13
+ - Parser improvements.
14
+ - _etc._
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyscript-programming-language"
7
- version = "1.12.4"
7
+ version = "1.12.5"
8
8
  description = "PyScript Programming Language"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.10"
@@ -166,11 +166,11 @@ def argument_error(argument, message):
166
166
  argv = sys.argv[1:]
167
167
 
168
168
  file_idx = sum(1 for arg in argv if arg.startswith('-'))
169
- end_idx = argv.index('--', 0, file_idx) if '--' in argv[:file_idx] else -1
170
- end_com = file_idx if end_idx == -1 else end_idx
171
- arg_com = argv[:end_com]
172
- com_idx = argv.index('-c', 0, end_com) if '-c' in arg_com else \
173
- (argv.index('--command', 0, end_com) if '--command' in arg_com else -1)
169
+ end_idx = argv.index('--', 0, file_idx) if '--' in argv[:file_idx] else -1
170
+ end_com = file_idx if end_idx == -1 else end_idx
171
+ arg_com = argv[:end_com]
172
+ com_idx = argv.index('-c', 0, end_com) if '-c' in arg_com else \
173
+ (argv.index('--command', 0, end_com) if '--command' in arg_com else -1)
174
174
 
175
175
  args = parser.parse_args(argv if com_idx == -1 else argv[:com_idx + 2])
176
176
  arg = args.arg if com_idx == -1 else argv[com_idx + 2:]
@@ -213,11 +213,11 @@ code = 0
213
213
  flags = DEFAULT
214
214
 
215
215
  for condition, flag in [
216
- (args.notebook or USE_NOTEBOOK, NOTEBOOK),
217
- (args.debug, DEBUG),
216
+ (args.notebook or USE_NOTEBOOK, NOTEBOOK),
218
217
  (args.classic_line_shell or is_environ(ENV_PYSCRIPT_CLASSIC_LINE_SHELL), CLASSIC_LINE_SHELL),
219
218
  (args.no_color or is_environ('NO_COLOR'), NO_COLOR),
220
219
  (args.no_color_prompt or is_environ(ENV_PYSCRIPT_NO_COLOR_PROMPT), NO_COLOR_PROMPT),
220
+ (args.debug, DEBUG),
221
221
  (args.q, DONT_SHOW_BANNER_ON_SHELL)
222
222
  ]:
223
223
  if condition:
@@ -3,7 +3,7 @@ from .checks import is_list
3
3
  from .constants import TOKENS, DEFAULT
4
4
  from .context import PysContext
5
5
  from .exceptions import PysTraceback
6
- from .nodes import PysNode, PysKeywordNode, PysIdentifierNode, PysAttributeNode, PysSubscriptNode
6
+ from .nodes import *
7
7
  from .position import PysPosition
8
8
  from .utils.decorators import typechecked
9
9
 
@@ -37,7 +37,7 @@ class PysAnalyzer(Pys):
37
37
  self.visit(self.node)
38
38
  return self.error
39
39
 
40
- def throw(self, message, position):
40
+ def throw(self, message: str, position: PysPosition) -> None:
41
41
  if self.error is None:
42
42
  self.error = PysTraceback(
43
43
  SyntaxError(message),
@@ -50,12 +50,12 @@ class PysAnalyzer(Pys):
50
50
  position
51
51
  )
52
52
 
53
- def visit(self, node):
53
+ def visit(self, node: PysNode) -> None:
54
54
  func = getattr(self, 'visit_' + type(node).__name__.removeprefix('Pys'), None)
55
55
  if not self.error and func:
56
56
  func(node)
57
57
 
58
- def visit_DictionaryNode(self, node):
58
+ def visit_DictionaryNode(self, node: PysDictionaryNode) -> None:
59
59
  for key, value in node.pairs:
60
60
 
61
61
  self.visit(key)
@@ -66,35 +66,35 @@ class PysAnalyzer(Pys):
66
66
  if self.error:
67
67
  return
68
68
 
69
- def visit_SetNode(self, node):
69
+ def visit_SetNode(self, node: PysSetNode) -> None:
70
70
  for element in node.elements:
71
71
  self.visit(element)
72
72
  if self.error:
73
73
  return
74
74
 
75
- def visit_ListNode(self, node):
75
+ def visit_ListNode(self, node: PysListNode) -> None:
76
76
  for element in node.elements:
77
77
  self.visit(element)
78
78
  if self.error:
79
79
  return
80
80
 
81
- def visit_TupleNode(self, node):
81
+ def visit_TupleNode(self, node: PysTupleNode) -> None:
82
82
  for element in node.elements:
83
83
  self.visit(element)
84
84
  if self.error:
85
85
  return
86
86
 
87
- def visit_AttributeNode(self, node):
87
+ def visit_AttributeNode(self, node: PysAttributeNode) -> None:
88
88
  self.visit(node.target)
89
89
 
90
- def visit_SubscriptNode(self, node):
90
+ def visit_SubscriptNode(self, node: PysSubscriptNode) -> None:
91
91
  self.visit(node.target)
92
92
  if self.error:
93
93
  return
94
94
 
95
95
  self.visit_slice_SubscriptNode(node.slice)
96
96
 
97
- def visit_CallNode(self, node):
97
+ def visit_CallNode(self, node: PysCallNode) -> None:
98
98
  self.visit(node.target)
99
99
  if self.error:
100
100
  return
@@ -118,13 +118,13 @@ class PysAnalyzer(Pys):
118
118
  if self.error:
119
119
  return
120
120
 
121
- def visit_ChainOperatorNode(self, node):
121
+ def visit_ChainOperatorNode(self, node: PysChainOperatorNode) -> None:
122
122
  for expression in node.expressions:
123
123
  self.visit(expression)
124
124
  if self.error:
125
125
  return
126
126
 
127
- def visit_TernaryOperatorNode(self, node):
127
+ def visit_TernaryOperatorNode(self, node: PysTernaryOperatorNode) -> None:
128
128
  if node.style == 'general':
129
129
  self.visit(node.condition)
130
130
  if self.error:
@@ -147,27 +147,27 @@ class PysAnalyzer(Pys):
147
147
 
148
148
  self.visit(node.invalid)
149
149
 
150
- def visit_BinaryOperatorNode(self, node):
150
+ def visit_BinaryOperatorNode(self, node: PysBinaryOperatorNode) -> None:
151
151
  self.visit(node.left)
152
152
  if self.error:
153
153
  return
154
154
 
155
155
  self.visit(node.right)
156
156
 
157
- def visit_UnaryOperatorNode(self, node):
157
+ def visit_UnaryOperatorNode(self, node: PysUnaryOperatorNode) -> None:
158
158
  self.visit(node.value)
159
159
 
160
- def visit_IncrementalNode(self, node):
161
- operator = 'increase' if node.operand.type == TOKENS['DOUBLE-PLUS'] else 'decrease'
160
+ def visit_IncrementalNode(self, node: PysIncrementalNode) -> None:
161
+ operator = 'increase' if node.operand.type == TOKENS['DOUBLE_PLUS'] else 'decrease'
162
162
  self.visit_declaration_AssignmentNode(node.target, f"cannot {operator} literal", operator)
163
163
 
164
- def visit_StatementsNode(self, node):
164
+ def visit_StatementsNode(self, node: PysStatementsNode) -> None:
165
165
  for element in node.body:
166
166
  self.visit(element)
167
167
  if self.error:
168
168
  return
169
169
 
170
- def visit_AssignmentNode(self, node):
170
+ def visit_AssignmentNode(self, node: PysAssignmentNode) -> None:
171
171
  self.visit_declaration_AssignmentNode(
172
172
  node.target,
173
173
  "cannot assign to expression here. Maybe you meant '==' instead of '='?"
@@ -177,7 +177,7 @@ class PysAnalyzer(Pys):
177
177
 
178
178
  self.visit(node.value)
179
179
 
180
- def visit_IfNode(self, node):
180
+ def visit_IfNode(self, node: PysIfNode) -> None:
181
181
  for condition, body in node.cases_body:
182
182
  self.visit(condition)
183
183
  if self.error:
@@ -190,7 +190,7 @@ class PysAnalyzer(Pys):
190
190
  if node.else_body:
191
191
  self.visit(node.else_body)
192
192
 
193
- def visit_SwitchNode(self, node):
193
+ def visit_SwitchNode(self, node: PysSwitchNode) -> None:
194
194
  self.visit(node.target)
195
195
  if self.error:
196
196
  return
@@ -213,7 +213,7 @@ class PysAnalyzer(Pys):
213
213
 
214
214
  self.in_switch -= 1
215
215
 
216
- def visit_MatchNode(self, node):
216
+ def visit_MatchNode(self, node: PysMatchNode) -> None:
217
217
  if node.target:
218
218
  self.visit(node.target)
219
219
  if self.error:
@@ -231,7 +231,7 @@ class PysAnalyzer(Pys):
231
231
  if node.default:
232
232
  self.visit(node.default)
233
233
 
234
- def visit_TryNode(self, node):
234
+ def visit_TryNode(self, node: PysTryNode) -> None:
235
235
  self.visit(node.body)
236
236
  if self.error:
237
237
  return
@@ -249,7 +249,7 @@ class PysAnalyzer(Pys):
249
249
  if node.finally_body:
250
250
  self.visit(node.finally_body)
251
251
 
252
- def visit_WithNode(self, node):
252
+ def visit_WithNode(self, node: PysWithNode) -> None:
253
253
  for context, _ in node.contexts:
254
254
  self.visit(context)
255
255
  if self.error:
@@ -257,7 +257,7 @@ class PysAnalyzer(Pys):
257
257
 
258
258
  self.visit(node.body)
259
259
 
260
- def visit_ForNode(self, node):
260
+ def visit_ForNode(self, node: PysForNode) -> None:
261
261
  if len(node.header) == 2:
262
262
  declaration, iteration = node.header
263
263
 
@@ -286,7 +286,7 @@ class PysAnalyzer(Pys):
286
286
  if node.else_body:
287
287
  self.visit(node.else_body)
288
288
 
289
- def visit_WhileNode(self, node):
289
+ def visit_WhileNode(self, node: PysWhileNode) -> None:
290
290
  self.visit(node.condition)
291
291
  if self.error:
292
292
  return
@@ -302,7 +302,7 @@ class PysAnalyzer(Pys):
302
302
  if node.else_body:
303
303
  self.visit(node.else_body)
304
304
 
305
- def visit_DoWhileNode(self, node):
305
+ def visit_DoWhileNode(self, node: PysDoWhileNode) -> None:
306
306
  self.in_loop += 1
307
307
 
308
308
  self.visit(node.body)
@@ -318,7 +318,7 @@ class PysAnalyzer(Pys):
318
318
  if node.else_body:
319
319
  self.visit(node.else_body)
320
320
 
321
- def visit_RepeatNode(self, node):
321
+ def visit_RepeatNode(self, node: PysRepeatNode) -> None:
322
322
  self.in_loop += 1
323
323
 
324
324
  self.visit(node.body)
@@ -334,7 +334,7 @@ class PysAnalyzer(Pys):
334
334
  if node.else_body:
335
335
  self.visit(node.else_body)
336
336
 
337
- def visit_ClassNode(self, node):
337
+ def visit_ClassNode(self, node: PysClassNode) -> None:
338
338
  for decorator in node.decorators:
339
339
  self.visit(decorator)
340
340
  if self.error:
@@ -363,7 +363,7 @@ class PysAnalyzer(Pys):
363
363
  self.in_function = in_function
364
364
  self.in_switch = in_switch
365
365
 
366
- def visit_FunctionNode(self, node):
366
+ def visit_FunctionNode(self, node: PysFunctionNode) -> None:
367
367
  if node.constructor and self.in_class == 0:
368
368
  self.throw("constructor function outside of class", node.name.position)
369
369
  return
@@ -410,7 +410,7 @@ class PysAnalyzer(Pys):
410
410
  self.in_class = in_class
411
411
  self.in_switch = in_switch
412
412
 
413
- def visit_GlobalNode(self, node):
413
+ def visit_GlobalNode(self, node: PysGlobalNode) -> None:
414
414
  if self.in_function == 0:
415
415
  self.throw("global outside of function", node.position)
416
416
 
@@ -419,7 +419,7 @@ class PysAnalyzer(Pys):
419
419
  self.throw(f"name {identifier.value!r} is parameter and global", identifier.position)
420
420
  return
421
421
 
422
- def visit_ReturnNode(self, node):
422
+ def visit_ReturnNode(self, node: PysReturnNode) -> None:
423
423
  if self.in_function == 0:
424
424
  self.throw("return outside of function", node.position)
425
425
  return
@@ -427,7 +427,7 @@ class PysAnalyzer(Pys):
427
427
  if node.value:
428
428
  self.visit(node.value)
429
429
 
430
- def visit_ThrowNode(self, node):
430
+ def visit_ThrowNode(self, node: PysThrowNode) -> None:
431
431
  self.visit(node.target)
432
432
  if self.error:
433
433
  return
@@ -435,7 +435,7 @@ class PysAnalyzer(Pys):
435
435
  if node.primary:
436
436
  self.visit(node.primary)
437
437
 
438
- def visit_AssertNode(self, node):
438
+ def visit_AssertNode(self, node: PysAssertNode) -> None:
439
439
  self.visit(node.condition)
440
440
  if self.error:
441
441
  return
@@ -443,7 +443,7 @@ class PysAnalyzer(Pys):
443
443
  if node.message:
444
444
  self.visit(node.message)
445
445
 
446
- def visit_DeleteNode(self, node):
446
+ def visit_DeleteNode(self, node: PysDeleteNode) -> None:
447
447
  for target in node.targets:
448
448
  type = target.__class__
449
449
 
@@ -469,43 +469,49 @@ class PysAnalyzer(Pys):
469
469
  self.throw("cannot delete literal", target.position)
470
470
  return
471
471
 
472
- def visit_ContinueNode(self, node):
472
+ def visit_ContinueNode(self, node: PysContinueNode) -> None:
473
473
  if self.in_loop == 0:
474
474
  self.throw("continue outside of loop", node.position)
475
475
 
476
- def visit_BreakNode(self, node):
476
+ def visit_BreakNode(self, node: PysBreakNode) -> None:
477
477
  if self.in_loop == 0 and self.in_switch == 0:
478
478
  self.throw("break outside of loop or switch case", node.position)
479
479
 
480
- def visit_slice_SubscriptNode(self, nslice):
481
- type = nslice.__class__
480
+ def visit_slice_SubscriptNode(self, node: PysNode | slice | tuple[PysNode | slice]) -> None:
481
+ type = node.__class__
482
482
 
483
483
  if type is slice:
484
- if nslice.start is not None:
485
- self.visit(nslice.start)
484
+ if node.start is not None:
485
+ self.visit(node.start)
486
486
  if self.error:
487
487
  return
488
488
 
489
- if nslice.stop is not None:
490
- self.visit(nslice.stop)
489
+ if node.stop is not None:
490
+ self.visit(node.stop)
491
491
  if self.error:
492
492
  return
493
493
 
494
- if nslice.step is not None:
495
- self.visit(nslice.step)
494
+ if node.step is not None:
495
+ self.visit(node.step)
496
496
  if self.error:
497
497
  return
498
498
 
499
499
  elif type is tuple:
500
- for element in nslice:
500
+ for element in node:
501
501
  self.visit_slice_SubscriptNode(element)
502
502
  if self.error:
503
503
  return
504
504
 
505
505
  else:
506
- self.visit(nslice)
506
+ self.visit(node)
507
+
508
+ def visit_declaration_AssignmentNode(
509
+ self,
510
+ node: PysIdentifierNode | PysAttributeNode | PysSubscriptNode | PysSetNode | PysListNode | PysTupleNode,
511
+ message: str,
512
+ operator_name: str = 'assign'
513
+ ) -> None:
507
514
 
508
- def visit_declaration_AssignmentNode(self, node, message, operator_name='assign'):
509
515
  type = node.__class__
510
516
 
511
517
  if type is PysAttributeNode:
@@ -3,8 +3,8 @@ from .constants import PYSCRIPT_PATH, CORE_PATH, LIBRARIES_PATH, SITE_PACKAGES_P
3
3
  from .utils.debug import print_display, print_traceback, clear_shell
4
4
  from .utils.decorators import inheritable, singleton
5
5
 
6
- from typing import Literal
7
6
  from types import ModuleType
7
+ from typing import Literal
8
8
 
9
9
  import sys
10
10
 
@@ -26,7 +26,7 @@ is_python_extensions = frozenset([
26
26
  ]).__contains__
27
27
 
28
28
  is_equals = frozenset([
29
- TOKENS['EQUAL'], TOKENS['EQUAL-COLON']
29
+ TOKENS['EQUAL'], TOKENS['EQUAL_COLON']
30
30
  ]).__contains__
31
31
 
32
32
  is_blacklist_python_builtins = frozenset([
@@ -31,15 +31,15 @@ TOKENS = MappingProxyType({
31
31
  'IDENTIFIER': 2,
32
32
  'NUMBER': 3,
33
33
  'STRING': 4,
34
- 'NOT-IN': 5,
35
- 'IS-NOT': 6,
34
+ 'NOT_IN': 5,
35
+ 'IS_NOT': 6,
36
36
  'NEWLINE': ord('\n'),
37
37
  'EXCLAMATION': ord('!'),
38
38
  'COMMENT': ord('#'),
39
39
  'PERCENT': ord('%'),
40
40
  'AMPERSAND': ord('&'),
41
- 'RIGHT-PARENTHESIS': ord(')'),
42
- 'LEFT-PARENTHESIS': ord('('),
41
+ 'RIGHT_PARENTHESIS': ord(')'),
42
+ 'LEFT_PARENTHESIS': ord('('),
43
43
  'STAR': ord('*'),
44
44
  'PLUS': ord('+'),
45
45
  'COMMA': ord(','),
@@ -48,52 +48,52 @@ TOKENS = MappingProxyType({
48
48
  'SLASH': ord('/'),
49
49
  'COLON': ord(':'),
50
50
  'SEMICOLON': ord(';'),
51
- 'LESS-THAN': ord('<'),
51
+ 'LESS_THAN': ord('<'),
52
52
  'EQUAL': ord('='),
53
- 'GREATER-THAN': ord('>'),
53
+ 'GREATER_THAN': ord('>'),
54
54
  'QUESTION': ord('?'),
55
55
  'AT': ord('@'),
56
- 'LEFT-SQUARE': ord('['),
57
- 'RIGHT-SQUARE': ord(']'),
56
+ 'LEFT_SQUARE': ord('['),
57
+ 'RIGHT_SQUARE': ord(']'),
58
58
  'CIRCUMFLEX': ord('^'),
59
- 'LEFT-CURLY': ord('{'),
59
+ 'LEFT_CURLY': ord('{'),
60
60
  'PIPE': ord('|'),
61
- 'RIGHT-CURLY': ord('}'),
61
+ 'RIGHT_CURLY': ord('}'),
62
62
  'TILDE': ord('~'),
63
- 'DOUBLE-AMPERSAND': ord('&') + DOUBLE,
64
- 'DOUBLE-STAR': ord('*') + DOUBLE,
65
- 'DOUBLE-PLUS': ord('+') + DOUBLE,
66
- 'DOUBLE-MINUS': ord('-') + DOUBLE,
67
- 'DOUBLE-SLASH': ord('/') + DOUBLE,
68
- 'DOUBLE-LESS-THAN': ord('<') + DOUBLE,
69
- 'DOUBLE-EQUAL': ord('=') + DOUBLE,
70
- 'DOUBLE-GREATER-THAN': ord('>') + DOUBLE,
71
- 'DOUBLE-QUESTION': ord('?') + DOUBLE,
72
- 'DOUBLE-PIPE': ord('|') + DOUBLE,
73
- 'TRIPLE-DOT': ord('.') + TRIPLE,
74
- 'EQUAL-EXCLAMATION': ord('!') + WITH_EQUAL,
75
- 'EQUAL-PERCENT': ord('%') + WITH_EQUAL,
76
- 'EQUAL-AMPERSAND': ord('&') + WITH_EQUAL,
77
- 'EQUAL-STAR': ord('*') + WITH_EQUAL,
78
- 'EQUAL-PLUS': ord('+') + WITH_EQUAL,
79
- 'EQUAL-MINUS': ord('-') + WITH_EQUAL,
80
- 'EQUAL-SLASH': ord('/') + WITH_EQUAL,
81
- 'EQUAL-COLON': ord(':') + WITH_EQUAL,
82
- 'EQUAL-LESS-THAN': ord('<') + WITH_EQUAL,
83
- 'EQUAL-GREATER-THAN': ord('>') + WITH_EQUAL,
84
- 'EQUAL-AT': ord('@') + WITH_EQUAL,
85
- 'EQUAL-CIRCUMFLEX': ord('^') + WITH_EQUAL,
86
- 'EQUAL-PIPE': ord('|') + WITH_EQUAL,
87
- 'EQUAL-TILDE': ord('~') + WITH_EQUAL,
88
- 'EQUAL-DOUBLE-STAR': ord('*') + DOUBLE + WITH_EQUAL,
89
- 'EQUAL-DOUBLE-SLASH': ord('/') + DOUBLE + WITH_EQUAL,
90
- 'EQUAL-DOUBLE-LESS-THAN': ord('<') + DOUBLE + WITH_EQUAL,
91
- 'EQUAL-DOUBLE-GREATER-THAN': ord('>') + DOUBLE + WITH_EQUAL,
63
+ 'DOUBLE_AMPERSAND': ord('&') + DOUBLE,
64
+ 'DOUBLE_STAR': ord('*') + DOUBLE,
65
+ 'DOUBLE_PLUS': ord('+') + DOUBLE,
66
+ 'DOUBLE_MINUS': ord('-') + DOUBLE,
67
+ 'DOUBLE_SLASH': ord('/') + DOUBLE,
68
+ 'DOUBLE_LESS_THAN': ord('<') + DOUBLE,
69
+ 'DOUBLE_EQUAL': ord('=') + DOUBLE,
70
+ 'DOUBLE_GREATER_THAN': ord('>') + DOUBLE,
71
+ 'DOUBLE_QUESTION': ord('?') + DOUBLE,
72
+ 'DOUBLE_PIPE': ord('|') + DOUBLE,
73
+ 'TRIPLE_DOT': ord('.') + TRIPLE,
74
+ 'EQUAL_EXCLAMATION': ord('!') + WITH_EQUAL,
75
+ 'EQUAL_PERCENT': ord('%') + WITH_EQUAL,
76
+ 'EQUAL_AMPERSAND': ord('&') + WITH_EQUAL,
77
+ 'EQUAL_STAR': ord('*') + WITH_EQUAL,
78
+ 'EQUAL_PLUS': ord('+') + WITH_EQUAL,
79
+ 'EQUAL_MINUS': ord('-') + WITH_EQUAL,
80
+ 'EQUAL_SLASH': ord('/') + WITH_EQUAL,
81
+ 'EQUAL_COLON': ord(':') + WITH_EQUAL,
82
+ 'EQUAL_LESS_THAN': ord('<') + WITH_EQUAL,
83
+ 'EQUAL_GREATER_THAN': ord('>') + WITH_EQUAL,
84
+ 'EQUAL_AT': ord('@') + WITH_EQUAL,
85
+ 'EQUAL_CIRCUMFLEX': ord('^') + WITH_EQUAL,
86
+ 'EQUAL_PIPE': ord('|') + WITH_EQUAL,
87
+ 'EQUAL_TILDE': ord('~') + WITH_EQUAL,
88
+ 'EQUAL_DOUBLE_STAR': ord('*') + DOUBLE + WITH_EQUAL,
89
+ 'EQUAL_DOUBLE_SLASH': ord('/') + DOUBLE + WITH_EQUAL,
90
+ 'EQUAL_DOUBLE_LESS_THAN': ord('<') + DOUBLE + WITH_EQUAL,
91
+ 'EQUAL_DOUBLE_GREATER_THAN': ord('>') + DOUBLE + WITH_EQUAL,
92
92
  'NONE': SPECIAL,
93
- 'MINUS-GREATER-THAN': ord('-') + SPECIAL,
94
- 'EQUAL-ARROW': ord('>') + SPECIAL,
95
- 'EXCLAMATION-GREATER-THAN': ord('!') + SPECIAL,
96
- 'EXCLAMATION-TILDE': ord('~') + SPECIAL
93
+ 'MINUS_GREATER_THAN': ord('-') + SPECIAL,
94
+ 'EQUAL_ARROW': ord('>') + SPECIAL,
95
+ 'EXCLAMATION_GREATER_THAN': ord('!') + SPECIAL,
96
+ 'EXCLAMATION_TILDE': ord('~') + SPECIAL
97
97
  })
98
98
 
99
99
  # keywords
@@ -1,18 +1,20 @@
1
1
  from .cache import pys_sys
2
2
  from .constants import ENV_PYSCRIPT_NO_GIL
3
+ from .context import PysContext
3
4
  from .objects import PysFunction
5
+ from .position import PysPosition
4
6
  from .utils.generic import is_environ
5
7
 
6
8
  from types import MethodType
9
+ from typing import Any
7
10
 
8
11
  wrapper_function = (MethodType, classmethod, staticmethod)
9
12
 
10
13
  if not is_environ(ENV_PYSCRIPT_NO_GIL):
11
14
  from threading import RLock
12
-
13
15
  lock = RLock()
14
16
 
15
- def handle_call(object, context, position):
17
+ def handle_call(object: Any, context: PysContext, position: PysPosition) -> None:
16
18
  with lock:
17
19
 
18
20
  if (ins := isinstance)(object, PysFunction):
@@ -35,7 +37,7 @@ if not is_environ(ENV_PYSCRIPT_NO_GIL):
35
37
  GIL = pys_sys.gil = True
36
38
  else:
37
39
 
38
- def handle_call(object, context, position):
40
+ def handle_call(object: Any, context: PysContext, position: PysPosition) -> None:
39
41
 
40
42
  if (ins := isinstance)(object, PysFunction):
41
43
  code = object.__code__
@@ -508,7 +508,7 @@ def pys_highlight(
508
508
  type_format = 'identifier-function'
509
509
  else:
510
510
  j = i + 1
511
- if (j < len(tokens) and tokens[j].type == TOKENS['LEFT-PARENTHESIS']):
511
+ if (j < len(tokens) and tokens[j].type == TOKENS['LEFT_PARENTHESIS']):
512
512
  type_format = 'identifier-function'
513
513
  else:
514
514
  type_format = 'identifier-constant' if tvalue.isupper() else 'identifier'