rapydscript-ns 0.8.3 → 0.8.4
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.
- package/.agignore +1 -1
- package/.github/workflows/ci.yml +38 -38
- package/=template.pyj +5 -5
- package/CHANGELOG.md +8 -0
- package/HACKING.md +103 -103
- package/LICENSE +24 -24
- package/PYTHON_DIFFERENCES_REPORT.md +2 -2
- package/PYTHON_FEATURE_COVERAGE.md +13 -13
- package/README.md +670 -6
- package/TODO.md +5 -6
- package/add-toc-to-readme +2 -2
- package/bin/export +75 -75
- package/bin/rapydscript +70 -70
- package/bin/web-repl-export +102 -102
- package/build +2 -2
- package/language-service/index.js +155 -6
- package/package.json +1 -1
- package/publish.py +37 -37
- package/release/baselib-plain-pretty.js +2006 -229
- package/release/baselib-plain-ugly.js +70 -3
- package/release/compiler.js +11554 -3870
- package/release/signatures.json +31 -29
- package/session.vim +4 -4
- package/setup.cfg +2 -2
- package/src/ast.pyj +93 -1
- package/src/baselib-builtins.pyj +22 -1
- package/src/baselib-containers.pyj +99 -0
- package/src/baselib-errors.pyj +44 -0
- package/src/baselib-internal.pyj +94 -4
- package/src/baselib-itertools.pyj +97 -97
- package/src/baselib-str.pyj +24 -0
- package/src/compiler.pyj +36 -36
- package/src/errors.pyj +30 -30
- package/src/lib/aes.pyj +646 -646
- package/src/lib/copy.pyj +120 -0
- package/src/lib/elementmaker.pyj +83 -83
- package/src/lib/encodings.pyj +126 -126
- package/src/lib/gettext.pyj +569 -569
- package/src/lib/itertools.pyj +580 -580
- package/src/lib/math.pyj +193 -193
- package/src/lib/operator.pyj +11 -11
- package/src/lib/pythonize.pyj +20 -20
- package/src/lib/random.pyj +118 -118
- package/src/lib/re.pyj +470 -470
- package/src/lib/react.pyj +74 -0
- package/src/lib/traceback.pyj +63 -63
- package/src/lib/uuid.pyj +77 -77
- package/src/monaco-language-service/builtins.js +5 -0
- package/src/monaco-language-service/diagnostics.js +25 -3
- package/src/monaco-language-service/dts.js +550 -550
- package/src/output/classes.pyj +108 -8
- package/src/output/codegen.pyj +16 -2
- package/src/output/comments.pyj +45 -45
- package/src/output/exceptions.pyj +201 -105
- package/src/output/functions.pyj +9 -0
- package/src/output/jsx.pyj +164 -0
- package/src/output/literals.pyj +28 -2
- package/src/output/modules.pyj +1 -1
- package/src/output/operators.pyj +8 -2
- package/src/output/statements.pyj +2 -2
- package/src/output/stream.pyj +1 -0
- package/src/output/treeshake.pyj +182 -182
- package/src/output/utils.pyj +72 -72
- package/src/parse.pyj +417 -113
- package/src/string_interpolation.pyj +72 -72
- package/src/tokenizer.pyj +29 -0
- package/src/unicode_aliases.pyj +576 -576
- package/src/utils.pyj +192 -192
- package/test/_import_one.pyj +37 -37
- package/test/_import_two/__init__.pyj +11 -11
- package/test/_import_two/level2/deep.pyj +4 -4
- package/test/_import_two/other.pyj +6 -6
- package/test/_import_two/sub.pyj +13 -13
- package/test/aes_vectors.pyj +421 -421
- package/test/annotations.pyj +80 -80
- package/test/decorators.pyj +77 -77
- package/test/docstrings.pyj +39 -39
- package/test/elementmaker_test.pyj +45 -45
- package/test/functions.pyj +151 -151
- package/test/generators.pyj +41 -41
- package/test/generic.pyj +370 -370
- package/test/imports.pyj +72 -72
- package/test/internationalization.pyj +73 -73
- package/test/lint.pyj +164 -164
- package/test/loops.pyj +85 -85
- package/test/numpy.pyj +734 -734
- package/test/omit_function_metadata.pyj +20 -20
- package/test/python_features.pyj +19 -6
- package/test/regexp.pyj +55 -55
- package/test/repl.pyj +121 -121
- package/test/scoped_flags.pyj +76 -76
- package/test/unit/index.js +2177 -64
- package/test/unit/language-service-dts.js +543 -543
- package/test/unit/language-service-hover.js +455 -455
- package/test/unit/language-service.js +590 -4
- package/test/unit/web-repl.js +303 -0
- package/tools/cli.js +547 -547
- package/tools/compile.js +219 -219
- package/tools/completer.js +131 -131
- package/tools/embedded_compiler.js +251 -251
- package/tools/gettext.js +185 -185
- package/tools/ini.js +65 -65
- package/tools/msgfmt.js +187 -187
- package/tools/repl.js +223 -223
- package/tools/test.js +118 -118
- package/tools/utils.js +128 -128
- package/tools/web_repl.js +95 -95
- package/try +41 -41
- package/web-repl/env.js +196 -74
- package/web-repl/index.html +163 -163
- package/web-repl/main.js +252 -254
- package/web-repl/prism.css +139 -139
- package/web-repl/prism.js +113 -113
- package/web-repl/rapydscript.js +224 -102
- package/web-repl/sha1.js +25 -25
- package/hack_demo.pyj +0 -112
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
# vim:fileencoding=utf-8
|
|
2
|
-
# License: BSD
|
|
3
|
-
# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
|
|
4
|
-
|
|
5
|
-
# globals: ρσ_iterator_symbol, ρσ_bool
|
|
6
|
-
|
|
7
|
-
def sum(iterable, start):
|
|
8
|
-
if Array.isArray(iterable):
|
|
9
|
-
return iterable.reduce(
|
|
10
|
-
def(prev, cur): return prev+cur
|
|
11
|
-
,
|
|
12
|
-
start or 0
|
|
13
|
-
)
|
|
14
|
-
ans = start or 0
|
|
15
|
-
iterator = iter(iterable)
|
|
16
|
-
r = iterator.next()
|
|
17
|
-
while not r.done:
|
|
18
|
-
ans += r.value
|
|
19
|
-
r = iterator.next()
|
|
20
|
-
return ans
|
|
21
|
-
|
|
22
|
-
def map():
|
|
23
|
-
iterators = new Array(arguments.length - 1)
|
|
24
|
-
func = arguments[0] # noqa: unused-local
|
|
25
|
-
args = new Array(arguments.length - 1) # noqa: unused-local
|
|
26
|
-
for v'var i = 1; i < arguments.length; i++':
|
|
27
|
-
iterators[i - 1] = iter(arguments[i]) # noqa:undef
|
|
28
|
-
ans = v"{'_func':func, '_iterators':iterators, '_args':args}"
|
|
29
|
-
ans[ρσ_iterator_symbol] = def():
|
|
30
|
-
return this
|
|
31
|
-
ans['next'] = def():
|
|
32
|
-
for v'var i = 0; i < this._iterators.length; i++':
|
|
33
|
-
r = this._iterators[i].next()
|
|
34
|
-
if r.done:
|
|
35
|
-
return v"{'done':true}"
|
|
36
|
-
this._args[i] = r.value # noqa:undef
|
|
37
|
-
return v"{'done':false, 'value':this._func.apply(undefined, this._args)}"
|
|
38
|
-
return ans
|
|
39
|
-
|
|
40
|
-
def filter(func_or_none, iterable):
|
|
41
|
-
func = ρσ_bool if func_or_none is None else func_or_none # noqa: unused-local
|
|
42
|
-
ans = v"{'_func':func, '_iterator':ρσ_iter(iterable)}"
|
|
43
|
-
ans[ρσ_iterator_symbol] = def():
|
|
44
|
-
return this
|
|
45
|
-
ans['next'] = def():
|
|
46
|
-
r = this._iterator.next()
|
|
47
|
-
while not r.done:
|
|
48
|
-
if this._func(r.value):
|
|
49
|
-
return r
|
|
50
|
-
r = this._iterator.next()
|
|
51
|
-
return v"{'done':true}"
|
|
52
|
-
return ans
|
|
53
|
-
|
|
54
|
-
def zip():
|
|
55
|
-
iterators = new Array(arguments.length)
|
|
56
|
-
for v'var i = 0; i < arguments.length; i++':
|
|
57
|
-
iterators[i] = iter(arguments[i]) # noqa:undef
|
|
58
|
-
ans = v"{'_iterators':iterators}"
|
|
59
|
-
ans[ρσ_iterator_symbol] = def():
|
|
60
|
-
return this
|
|
61
|
-
ans['next'] = def():
|
|
62
|
-
args = new Array(this._iterators.length)
|
|
63
|
-
for v'var i = 0; i < this._iterators.length; i++':
|
|
64
|
-
r = this._iterators[i].next()
|
|
65
|
-
if r.done:
|
|
66
|
-
return v"{'done':true}"
|
|
67
|
-
args[i] = r.value # noqa:undef
|
|
68
|
-
return v"{'done':false, 'value':args}"
|
|
69
|
-
return ans
|
|
70
|
-
|
|
71
|
-
def any(iterable):
|
|
72
|
-
if Array.isArray(iterable) or jstype(iterable) is 'string':
|
|
73
|
-
for v'var i = 0; i < iterable.length; i++':
|
|
74
|
-
if iterable[i]: # noqa:undef
|
|
75
|
-
return True
|
|
76
|
-
return False
|
|
77
|
-
iterator = iter(iterable)
|
|
78
|
-
r = iterator.next()
|
|
79
|
-
while not r.done:
|
|
80
|
-
if r.value:
|
|
81
|
-
return True
|
|
82
|
-
r = iterator.next()
|
|
83
|
-
return False
|
|
84
|
-
|
|
85
|
-
def all(iterable):
|
|
86
|
-
if Array.isArray(iterable) or jstype(iterable) is 'string':
|
|
87
|
-
for v'var i = 0; i < iterable.length; i++':
|
|
88
|
-
if not iterable[i]: # noqa:undef
|
|
89
|
-
return False
|
|
90
|
-
return True
|
|
91
|
-
iterator = iter(iterable)
|
|
92
|
-
r = iterator.next()
|
|
93
|
-
while not r.done:
|
|
94
|
-
if not r.value:
|
|
95
|
-
return False
|
|
96
|
-
r = iterator.next()
|
|
97
|
-
return True
|
|
1
|
+
# vim:fileencoding=utf-8
|
|
2
|
+
# License: BSD
|
|
3
|
+
# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
|
|
4
|
+
|
|
5
|
+
# globals: ρσ_iterator_symbol, ρσ_bool
|
|
6
|
+
|
|
7
|
+
def sum(iterable, start):
|
|
8
|
+
if Array.isArray(iterable):
|
|
9
|
+
return iterable.reduce(
|
|
10
|
+
def(prev, cur): return prev+cur
|
|
11
|
+
,
|
|
12
|
+
start or 0
|
|
13
|
+
)
|
|
14
|
+
ans = start or 0
|
|
15
|
+
iterator = iter(iterable)
|
|
16
|
+
r = iterator.next()
|
|
17
|
+
while not r.done:
|
|
18
|
+
ans += r.value
|
|
19
|
+
r = iterator.next()
|
|
20
|
+
return ans
|
|
21
|
+
|
|
22
|
+
def map():
|
|
23
|
+
iterators = new Array(arguments.length - 1)
|
|
24
|
+
func = arguments[0] # noqa: unused-local
|
|
25
|
+
args = new Array(arguments.length - 1) # noqa: unused-local
|
|
26
|
+
for v'var i = 1; i < arguments.length; i++':
|
|
27
|
+
iterators[i - 1] = iter(arguments[i]) # noqa:undef
|
|
28
|
+
ans = v"{'_func':func, '_iterators':iterators, '_args':args}"
|
|
29
|
+
ans[ρσ_iterator_symbol] = def():
|
|
30
|
+
return this
|
|
31
|
+
ans['next'] = def():
|
|
32
|
+
for v'var i = 0; i < this._iterators.length; i++':
|
|
33
|
+
r = this._iterators[i].next()
|
|
34
|
+
if r.done:
|
|
35
|
+
return v"{'done':true}"
|
|
36
|
+
this._args[i] = r.value # noqa:undef
|
|
37
|
+
return v"{'done':false, 'value':this._func.apply(undefined, this._args)}"
|
|
38
|
+
return ans
|
|
39
|
+
|
|
40
|
+
def filter(func_or_none, iterable):
|
|
41
|
+
func = ρσ_bool if func_or_none is None else func_or_none # noqa: unused-local
|
|
42
|
+
ans = v"{'_func':func, '_iterator':ρσ_iter(iterable)}"
|
|
43
|
+
ans[ρσ_iterator_symbol] = def():
|
|
44
|
+
return this
|
|
45
|
+
ans['next'] = def():
|
|
46
|
+
r = this._iterator.next()
|
|
47
|
+
while not r.done:
|
|
48
|
+
if this._func(r.value):
|
|
49
|
+
return r
|
|
50
|
+
r = this._iterator.next()
|
|
51
|
+
return v"{'done':true}"
|
|
52
|
+
return ans
|
|
53
|
+
|
|
54
|
+
def zip():
|
|
55
|
+
iterators = new Array(arguments.length)
|
|
56
|
+
for v'var i = 0; i < arguments.length; i++':
|
|
57
|
+
iterators[i] = iter(arguments[i]) # noqa:undef
|
|
58
|
+
ans = v"{'_iterators':iterators}"
|
|
59
|
+
ans[ρσ_iterator_symbol] = def():
|
|
60
|
+
return this
|
|
61
|
+
ans['next'] = def():
|
|
62
|
+
args = new Array(this._iterators.length)
|
|
63
|
+
for v'var i = 0; i < this._iterators.length; i++':
|
|
64
|
+
r = this._iterators[i].next()
|
|
65
|
+
if r.done:
|
|
66
|
+
return v"{'done':true}"
|
|
67
|
+
args[i] = r.value # noqa:undef
|
|
68
|
+
return v"{'done':false, 'value':args}"
|
|
69
|
+
return ans
|
|
70
|
+
|
|
71
|
+
def any(iterable):
|
|
72
|
+
if Array.isArray(iterable) or jstype(iterable) is 'string':
|
|
73
|
+
for v'var i = 0; i < iterable.length; i++':
|
|
74
|
+
if iterable[i]: # noqa:undef
|
|
75
|
+
return True
|
|
76
|
+
return False
|
|
77
|
+
iterator = iter(iterable)
|
|
78
|
+
r = iterator.next()
|
|
79
|
+
while not r.done:
|
|
80
|
+
if r.value:
|
|
81
|
+
return True
|
|
82
|
+
r = iterator.next()
|
|
83
|
+
return False
|
|
84
|
+
|
|
85
|
+
def all(iterable):
|
|
86
|
+
if Array.isArray(iterable) or jstype(iterable) is 'string':
|
|
87
|
+
for v'var i = 0; i < iterable.length; i++':
|
|
88
|
+
if not iterable[i]: # noqa:undef
|
|
89
|
+
return False
|
|
90
|
+
return True
|
|
91
|
+
iterator = iter(iterable)
|
|
92
|
+
r = iterator.next()
|
|
93
|
+
while not r.done:
|
|
94
|
+
if not r.value:
|
|
95
|
+
return False
|
|
96
|
+
r = iterator.next()
|
|
97
|
+
return True
|
package/src/baselib-str.pyj
CHANGED
|
@@ -774,6 +774,29 @@ define_str_func('zfill', def(width):
|
|
|
774
774
|
return string
|
|
775
775
|
)
|
|
776
776
|
|
|
777
|
+
define_str_func('expandtabs', def(tabsize):
|
|
778
|
+
if tabsize is undefined:
|
|
779
|
+
tabsize = 8
|
|
780
|
+
string = this
|
|
781
|
+
ans = ''
|
|
782
|
+
col = 0
|
|
783
|
+
for v'var i = 0; i < string.length; i++':
|
|
784
|
+
ch = string[i] # noqa:undef
|
|
785
|
+
if ch is '\t':
|
|
786
|
+
if tabsize > 0:
|
|
787
|
+
spaces = tabsize - (col % tabsize)
|
|
788
|
+
ans += v'new Array(spaces + 1).join(" ")'
|
|
789
|
+
col += spaces
|
|
790
|
+
# tabsize <= 0: tab adds no spaces, col stays
|
|
791
|
+
elif ch is '\n' or ch is '\r':
|
|
792
|
+
ans += ch
|
|
793
|
+
col = 0
|
|
794
|
+
else:
|
|
795
|
+
ans += ch
|
|
796
|
+
col += 1
|
|
797
|
+
return ans
|
|
798
|
+
)
|
|
799
|
+
|
|
777
800
|
ρσ_str.uchrs = def(string, with_positions):
|
|
778
801
|
# Return iterator over unicode chars in string. Will yield the unicode
|
|
779
802
|
# replacement char U+FFFD for broken surrogate pairs
|
|
@@ -836,4 +859,5 @@ def ρσ_format(value, spec):
|
|
|
836
859
|
return ρσ_str(value)
|
|
837
860
|
return str.format('{:' + spec + '}', value)
|
|
838
861
|
|
|
862
|
+
ρσ_str.__name__ = 'str'
|
|
839
863
|
v'var str = ρσ_str, repr = ρσ_repr, format = ρσ_format'
|
package/src/compiler.pyj
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
# vim:fileencoding=utf-8
|
|
2
|
-
# License: BSD
|
|
3
|
-
# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
|
|
4
|
-
# globals: console
|
|
5
|
-
|
|
6
|
-
from utils import DefaultsError, string_template
|
|
7
|
-
from errors import ImportError, SyntaxError
|
|
8
|
-
from tokenizer import ALL_KEYWORDS, IDENTIFIER_PAT, tokenizer
|
|
9
|
-
from parse import parse, NATIVE_CLASSES, compile_time_decorators
|
|
10
|
-
from output.stream import OutputStream
|
|
11
|
-
from output.codegen import generate_code
|
|
12
|
-
from output.treeshake import tree_shake
|
|
13
|
-
|
|
14
|
-
generate_code() # create the print methods on the AST nodes
|
|
15
|
-
|
|
16
|
-
# The following allows this module to be used from a pure javascript, require()
|
|
17
|
-
# based environment like Node.js
|
|
18
|
-
if jstype(exports) is 'object':
|
|
19
|
-
exports.DefaultsError = DefaultsError
|
|
20
|
-
exports.parse = parse
|
|
21
|
-
exports.compile_time_decorators = compile_time_decorators
|
|
22
|
-
exports.OutputStream = OutputStream
|
|
23
|
-
exports.string_template = string_template # noqa:undef
|
|
24
|
-
# Needed for REPL and linter
|
|
25
|
-
exports.ALL_KEYWORDS = ALL_KEYWORDS
|
|
26
|
-
exports.IDENTIFIER_PAT = IDENTIFIER_PAT
|
|
27
|
-
exports.NATIVE_CLASSES = NATIVE_CLASSES
|
|
28
|
-
exports.ImportError = ImportError
|
|
29
|
-
exports.SyntaxError = SyntaxError
|
|
30
|
-
exports.tokenizer = tokenizer
|
|
31
|
-
exports.tree_shake = tree_shake
|
|
32
|
-
# Magic! Export all the AST_* nodes
|
|
33
|
-
ast = ρσ_modules['ast']
|
|
34
|
-
for ast_node in ast:
|
|
35
|
-
if ast_node.substr(0, 4) is 'AST_':
|
|
36
|
-
exports[ast_node] = ast[ast_node] # noqa:undef
|
|
1
|
+
# vim:fileencoding=utf-8
|
|
2
|
+
# License: BSD
|
|
3
|
+
# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
|
|
4
|
+
# globals: console
|
|
5
|
+
|
|
6
|
+
from utils import DefaultsError, string_template
|
|
7
|
+
from errors import ImportError, SyntaxError
|
|
8
|
+
from tokenizer import ALL_KEYWORDS, IDENTIFIER_PAT, tokenizer
|
|
9
|
+
from parse import parse, NATIVE_CLASSES, compile_time_decorators
|
|
10
|
+
from output.stream import OutputStream
|
|
11
|
+
from output.codegen import generate_code
|
|
12
|
+
from output.treeshake import tree_shake
|
|
13
|
+
|
|
14
|
+
generate_code() # create the print methods on the AST nodes
|
|
15
|
+
|
|
16
|
+
# The following allows this module to be used from a pure javascript, require()
|
|
17
|
+
# based environment like Node.js
|
|
18
|
+
if jstype(exports) is 'object':
|
|
19
|
+
exports.DefaultsError = DefaultsError
|
|
20
|
+
exports.parse = parse
|
|
21
|
+
exports.compile_time_decorators = compile_time_decorators
|
|
22
|
+
exports.OutputStream = OutputStream
|
|
23
|
+
exports.string_template = string_template # noqa:undef
|
|
24
|
+
# Needed for REPL and linter
|
|
25
|
+
exports.ALL_KEYWORDS = ALL_KEYWORDS
|
|
26
|
+
exports.IDENTIFIER_PAT = IDENTIFIER_PAT
|
|
27
|
+
exports.NATIVE_CLASSES = NATIVE_CLASSES
|
|
28
|
+
exports.ImportError = ImportError
|
|
29
|
+
exports.SyntaxError = SyntaxError
|
|
30
|
+
exports.tokenizer = tokenizer
|
|
31
|
+
exports.tree_shake = tree_shake
|
|
32
|
+
# Magic! Export all the AST_* nodes
|
|
33
|
+
ast = ρσ_modules['ast']
|
|
34
|
+
for ast_node in ast:
|
|
35
|
+
if ast_node.substr(0, 4) is 'AST_':
|
|
36
|
+
exports[ast_node] = ast[ast_node] # noqa:undef
|
package/src/errors.pyj
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
# vim:fileencoding=utf-8
|
|
2
|
-
# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
|
3
|
-
from __python__ import hash_literals
|
|
4
|
-
|
|
5
|
-
class SyntaxError(Error):
|
|
6
|
-
|
|
7
|
-
def __init__(self, message, filename, line, col, pos, is_eof):
|
|
8
|
-
self.stack = Error().stack
|
|
9
|
-
self.message = message
|
|
10
|
-
self.line = line
|
|
11
|
-
self.col = col
|
|
12
|
-
self.pos = pos
|
|
13
|
-
self.is_eof = is_eof
|
|
14
|
-
self.filename = filename
|
|
15
|
-
# The "standard" form for these error attributes
|
|
16
|
-
self.lineNumber = line
|
|
17
|
-
self.fileName = filename
|
|
18
|
-
|
|
19
|
-
def toString(self):
|
|
20
|
-
ans = self.message + " (line: " + self.line + ", col: " + self.col + ", pos: " + self.pos + ")"
|
|
21
|
-
if self.filename:
|
|
22
|
-
ans = self.filename + ':' + ans
|
|
23
|
-
if self.stack:
|
|
24
|
-
ans += "\n\n" + self.stack
|
|
25
|
-
return ans
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class ImportError(SyntaxError):
|
|
29
|
-
pass
|
|
30
|
-
|
|
1
|
+
# vim:fileencoding=utf-8
|
|
2
|
+
# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
|
3
|
+
from __python__ import hash_literals
|
|
4
|
+
|
|
5
|
+
class SyntaxError(Error):
|
|
6
|
+
|
|
7
|
+
def __init__(self, message, filename, line, col, pos, is_eof):
|
|
8
|
+
self.stack = Error().stack
|
|
9
|
+
self.message = message
|
|
10
|
+
self.line = line
|
|
11
|
+
self.col = col
|
|
12
|
+
self.pos = pos
|
|
13
|
+
self.is_eof = is_eof
|
|
14
|
+
self.filename = filename
|
|
15
|
+
# The "standard" form for these error attributes
|
|
16
|
+
self.lineNumber = line
|
|
17
|
+
self.fileName = filename
|
|
18
|
+
|
|
19
|
+
def toString(self):
|
|
20
|
+
ans = self.message + " (line: " + self.line + ", col: " + self.col + ", pos: " + self.pos + ")"
|
|
21
|
+
if self.filename:
|
|
22
|
+
ans = self.filename + ':' + ans
|
|
23
|
+
if self.stack:
|
|
24
|
+
ans += "\n\n" + self.stack
|
|
25
|
+
return ans
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ImportError(SyntaxError):
|
|
29
|
+
pass
|
|
30
|
+
|