Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork252
Expand file tree
/
Copy pathinterpreter.py
More file actions
136 lines (114 loc) · 4.45 KB
/
interpreter.py
File metadata and controls
136 lines (114 loc) · 4.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
importsys
fromcodeopimportCommandCompiler
fromtypingimportAny
fromcollections.abcimportIterable
frompygments.tokenimportGeneric,Token,Keyword,Name,Comment,String
frompygments.tokenimportError,Literal,Number,Operator,Punctuation
frompygments.tokenimportWhitespace,_TokenType
frompygments.formatterimportFormatter
frompygments.lexersimportget_lexer_by_name
fromcurtsies.formatstringimportFmtStr
from ..curtsiesfrontend.parseimportparse
from ..replimportInterpreterasReplInterpreter
default_colors= {
Generic.Error:"R",
Keyword:"d",
Name:"c",
Name.Builtin:"g",
Comment:"b",
String:"m",
Error:"r",
Literal:"d",
Number:"M",
Number.Integer:"d",
Operator:"d",
Punctuation:"d",
Token:"d",
Whitespace:"d",
Token.Punctuation.Parenthesis:"R",
Name.Function:"d",
Name.Class:"d",
}
classBPythonFormatter(Formatter):
"""This is subclassed from the custom formatter for bpython. Its format()
method receives the tokensource and outfile params passed to it from the
Pygments highlight() method and slops them into the appropriate format
string as defined above, then writes to the outfile object the final
formatted string. This does not write real strings. It writes format string
(FmtStr) objects.
See the Pygments source for more info; it's pretty
straightforward."""
def__init__(
self,
color_scheme:dict[_TokenType,str],
**options:str|bool|None,
)->None:
self.f_strings= {k:f"\x01{v}"fork,vincolor_scheme.items()}
# FIXME: mypy currently fails to handle this properly
super().__init__(**options)# type: ignore
defformat(self,tokensource,outfile):
o=""
fortoken,textintokensource:
whiletokennotinself.f_strings:
token=token.parent
o+=f"{self.f_strings[token]}\x03{text}\x04"
outfile.write(parse(o.rstrip()))
classInterp(ReplInterpreter):
def__init__(
self,
locals:dict[str,Any]|None=None,
)->None:
"""Constructor.
We include an argument for the outfile to pass to the formatter for it
to write to.
"""
super().__init__(locals)
# typically changed after being instantiated
# but used when interpreter used corresponding REPL
defwrite(err_line:str|FmtStr)->None:
"""Default stderr handler for tracebacks
Accepts FmtStrs so interpreters can output them"""
sys.stderr.write(str(err_line))
self.write=write# type: ignore
self.outfile=self
defwritetb(self,lines:Iterable[str])->None:
tbtext="".join(lines)
lexer=get_lexer_by_name("pytb")
self.format(tbtext,lexer)
# TODO for tracebacks get_lexer_by_name("pytb", stripall=True)
defformat(self,tbtext:str,lexer:Any)->None:
# FIXME: lexer should be "Lexer"
traceback_informative_formatter=BPythonFormatter(default_colors)
traceback_code_formatter=BPythonFormatter({Token:"d"})
no_format_mode=False
cur_line= []
fortoken,textinlexer.get_tokens(tbtext):
iftext.endswith("\n"):
cur_line.append((token,text))
ifno_format_mode:
traceback_code_formatter.format(cur_line,self.outfile)
no_format_mode=False
else:
traceback_informative_formatter.format(
cur_line,self.outfile
)
cur_line= []
eliftext==" "andlen(cur_line)==0:
no_format_mode=True
cur_line.append((token,text))
else:
cur_line.append((token,text))
assertcur_line== [],cur_line
defcode_finished_will_parse(
s:str,compiler:CommandCompiler
)->tuple[bool,bool]:
"""Returns a tuple of whether the buffer could be complete and whether it
will parse
True, True means code block is finished and no predicted parse error
True, False means code block is finished because a parse error is predicted
False, True means code block is unfinished
False, False isn't possible - an predicted error makes code block done"""
try:
returnbool(compiler(s)),True
except (ValueError,SyntaxError,OverflowError):
returnTrue,False