11
22call extend (s: , vimlparser#import ())
33
4+ " Ignore undefined variable errors of vint
5+ " vint: -ProhibitUsingUndeclaredVariable
6+ let s: StringReader = s: StringReader
7+ let s: VimLParser = s: VimLParser
8+ let s: ExprParser = s: ExprParser
9+ let s: NIL = s: NIL
10+ " vint: +ProhibitUsingUndeclaredVariable
11+
412let s: opprec = {}
13+ " vint: -ProhibitUsingUndeclaredVariable
514let s: opprec [s: NODE_TERNARY ] = 1
615let s: opprec [s: NODE_OR ] = 2
716let s: opprec [s: NODE_AND ] = 3
@@ -58,6 +67,7 @@ let s:opprec[s:NODE_IDENTIFIER] = 9
5867let s: opprec [s: NODE_CURLYNAME ] = 9
5968let s: opprec [s: NODE_ENV ] = 9
6069let s: opprec [s: NODE_REG ] = 9
70+ " vint: +ProhibitUsingUndeclaredVariable
6171
6272" Reserved Python keywords (dict for faster lookup).
6373let s: reserved_keywords = {
@@ -110,8 +120,8 @@ function s:PythonCompiler.__init__()
110120endfunction
111121
112122function s: PythonCompiler .out (... )
113- if len (a: 000 ) == 1
114- if a: 000 [0 ] = ~ ' ^)\+$'
123+ if len (a: 000 ) == # 1
124+ if a: 000 [0 ] = ~# ' ^)\+$'
115125 let self .lines [-1 ] .= a: 000 [0 ]
116126 else
117127 call add (self .lines , self .indent [0 ] . a: 000 [0 ])
@@ -133,177 +143,181 @@ function s:PythonCompiler.decindent()
133143 call remove (self .indent , 0 )
134144endfunction
135145
146+ " vint: -ProhibitUsingUndeclaredVariable
136147function s: PythonCompiler .compile (node)
137- if a: node .type == s: NODE_TOPLEVEL
148+ if a: node .type == # s: NODE_TOPLEVEL
138149 return self .compile_toplevel (a: node )
139- elseif a: node .type == s: NODE_COMMENT
150+ elseif a: node .type == # s: NODE_COMMENT
140151 return self .compile_comment (a: node )
141- elseif a: node .type == s: NODE_EXCMD
152+ elseif a: node .type == # s: NODE_EXCMD
142153 return self .compile_excmd (a: node )
143- elseif a: node .type == s: NODE_FUNCTION
154+ elseif a: node .type == # s: NODE_FUNCTION
144155 return self .compile_function (a: node )
145- elseif a: node .type == s: NODE_DELFUNCTION
156+ elseif a: node .type == # s: NODE_DELFUNCTION
146157 return self .compile_delfunction (a: node )
147- elseif a: node .type == s: NODE_RETURN
158+ elseif a: node .type == # s: NODE_RETURN
148159 return self .compile_return (a: node )
149- elseif a: node .type == s: NODE_EXCALL
160+ elseif a: node .type == # s: NODE_EXCALL
150161 return self .compile_excall (a: node )
151- elseif a: node .type == s: NODE_LET
162+ elseif a: node .type == # s: NODE_LET
152163 return self .compile_let (a: node )
153- elseif a: node .type == s: NODE_UNLET
164+ elseif a: node .type == # s: NODE_UNLET
154165 return self .compile_unlet (a: node )
155- elseif a: node .type == s: NODE_LOCKVAR
166+ elseif a: node .type == # s: NODE_LOCKVAR
156167 return self .compile_lockvar (a: node )
157- elseif a: node .type == s: NODE_UNLOCKVAR
168+ elseif a: node .type == # s: NODE_UNLOCKVAR
158169 return self .compile_unlockvar (a: node )
159- elseif a: node .type == s: NODE_IF
170+ elseif a: node .type == # s: NODE_IF
160171 return self .compile_if (a: node )
161- elseif a: node .type == s: NODE_WHILE
172+ elseif a: node .type == # s: NODE_WHILE
162173 return self .compile_while (a: node )
163- elseif a: node .type == s: NODE_FOR
174+ elseif a: node .type == # s: NODE_FOR
164175 return self .compile_for (a: node )
165- elseif a: node .type == s: NODE_CONTINUE
176+ elseif a: node .type == # s: NODE_CONTINUE
166177 return self .compile_continue (a: node )
167- elseif a: node .type == s: NODE_BREAK
178+ elseif a: node .type == # s: NODE_BREAK
168179 return self .compile_break (a: node )
169- elseif a: node .type == s: NODE_TRY
180+ elseif a: node .type == # s: NODE_TRY
170181 return self .compile_try (a: node )
171- elseif a: node .type == s: NODE_THROW
182+ elseif a: node .type == # s: NODE_THROW
172183 return self .compile_throw (a: node )
173- elseif a: node .type == s: NODE_ECHO
184+ elseif a: node .type == # s: NODE_ECHO
174185 return self .compile_echo (a: node )
175- elseif a: node .type == s: NODE_ECHON
186+ elseif a: node .type == # s: NODE_ECHON
176187 return self .compile_echon (a: node )
177- elseif a: node .type == s: NODE_ECHOHL
188+ elseif a: node .type == # s: NODE_ECHOHL
178189 return self .compile_echohl (a: node )
179- elseif a: node .type == s: NODE_ECHOMSG
190+ elseif a: node .type == # s: NODE_ECHOMSG
180191 return self .compile_echomsg (a: node )
181- elseif a: node .type == s: NODE_ECHOERR
192+ elseif a: node .type == # s: NODE_ECHOERR
182193 return self .compile_echoerr (a: node )
183- elseif a: node .type == s: NODE_EXECUTE
194+ elseif a: node .type == # s: NODE_EXECUTE
184195 return self .compile_execute (a: node )
185- elseif a: node .type == s: NODE_TERNARY
196+ elseif a: node .type == # s: NODE_TERNARY
186197 return self .compile_ternary (a: node )
187- elseif a: node .type == s: NODE_OR
198+ elseif a: node .type == # s: NODE_OR
188199 return self .compile_or (a: node )
189- elseif a: node .type == s: NODE_AND
200+ elseif a: node .type == # s: NODE_AND
190201 return self .compile_and (a: node )
191- elseif a: node .type == s: NODE_EQUAL
202+ elseif a: node .type == # s: NODE_EQUAL
192203 return self .compile_equal (a: node )
193- elseif a: node .type == s: NODE_EQUALCI
204+ elseif a: node .type == # s: NODE_EQUALCI
194205 return self .compile_equalci (a: node )
195- elseif a: node .type == s: NODE_EQUALCS
206+ elseif a: node .type == # s: NODE_EQUALCS
196207 return self .compile_equalcs (a: node )
197- elseif a: node .type == s: NODE_NEQUAL
208+ elseif a: node .type == # s: NODE_NEQUAL
198209 return self .compile_nequal (a: node )
199- elseif a: node .type == s: NODE_NEQUALCI
210+ elseif a: node .type == # s: NODE_NEQUALCI
200211 return self .compile_nequalci (a: node )
201- elseif a: node .type == s: NODE_NEQUALCS
212+ elseif a: node .type == # s: NODE_NEQUALCS
202213 return self .compile_nequalcs (a: node )
203- elseif a: node .type == s: NODE_GREATER
214+ elseif a: node .type == # s: NODE_GREATER
204215 return self .compile_greater (a: node )
205- elseif a: node .type == s: NODE_GREATERCI
216+ elseif a: node .type == # s: NODE_GREATERCI
206217 return self .compile_greaterci (a: node )
207- elseif a: node .type == s: NODE_GREATERCS
218+ elseif a: node .type == # s: NODE_GREATERCS
208219 return self .compile_greatercs (a: node )
209- elseif a: node .type == s: NODE_GEQUAL
220+ elseif a: node .type == # s: NODE_GEQUAL
210221 return self .compile_gequal (a: node )
211- elseif a: node .type == s: NODE_GEQUALCI
222+ elseif a: node .type == # s: NODE_GEQUALCI
212223 return self .compile_gequalci (a: node )
213- elseif a: node .type == s: NODE_GEQUALCS
224+ elseif a: node .type == # s: NODE_GEQUALCS
214225 return self .compile_gequalcs (a: node )
215- elseif a: node .type == s: NODE_SMALLER
226+ elseif a: node .type == # s: NODE_SMALLER
216227 return self .compile_smaller (a: node )
217- elseif a: node .type == s: NODE_SMALLERCI
228+ elseif a: node .type == # s: NODE_SMALLERCI
218229 return self .compile_smallerci (a: node )
219- elseif a: node .type == s: NODE_SMALLERCS
230+ elseif a: node .type == # s: NODE_SMALLERCS
220231 return self .compile_smallercs (a: node )
221- elseif a: node .type == s: NODE_SEQUAL
232+ elseif a: node .type == # s: NODE_SEQUAL
222233 return self .compile_sequal (a: node )
223- elseif a: node .type == s: NODE_SEQUALCI
234+ elseif a: node .type == # s: NODE_SEQUALCI
224235 return self .compile_sequalci (a: node )
225- elseif a: node .type == s: NODE_SEQUALCS
236+ elseif a: node .type == # s: NODE_SEQUALCS
226237 return self .compile_sequalcs (a: node )
227- elseif a: node .type == s: NODE_MATCH
238+ elseif a: node .type == # s: NODE_MATCH
228239 return self .compile_match (a: node )
229- elseif a: node .type == s: NODE_MATCHCI
240+ elseif a: node .type == # s: NODE_MATCHCI
230241 return self .compile_matchci (a: node )
231- elseif a: node .type == s: NODE_MATCHCS
242+ elseif a: node .type == # s: NODE_MATCHCS
232243 return self .compile_matchcs (a: node )
233- elseif a: node .type == s: NODE_NOMATCH
244+ elseif a: node .type == # s: NODE_NOMATCH
234245 return self .compile_nomatch (a: node )
235- elseif a: node .type == s: NODE_NOMATCHCI
246+ elseif a: node .type == # s: NODE_NOMATCHCI
236247 return self .compile_nomatchci (a: node )
237- elseif a: node .type == s: NODE_NOMATCHCS
248+ elseif a: node .type == # s: NODE_NOMATCHCS
238249 return self .compile_nomatchcs (a: node )
239- elseif a: node .type == s: NODE_IS
250+ elseif a: node .type == # s: NODE_IS
240251 return self .compile_is (a: node )
241- elseif a: node .type == s: NODE_ISCI
252+ elseif a: node .type == # s: NODE_ISCI
242253 return self .compile_isci (a: node )
243- elseif a: node .type == s: NODE_ISCS
254+ elseif a: node .type == # s: NODE_ISCS
244255 return self .compile_iscs (a: node )
245- elseif a: node .type == s: NODE_ISNOT
256+ elseif a: node .type == # s: NODE_ISNOT
246257 return self .compile_isnot (a: node )
247- elseif a: node .type == s: NODE_ISNOTCI
258+ elseif a: node .type == # s: NODE_ISNOTCI
248259 return self .compile_isnotci (a: node )
249- elseif a: node .type == s: NODE_ISNOTCS
260+ elseif a: node .type == # s: NODE_ISNOTCS
250261 return self .compile_isnotcs (a: node )
251- elseif a: node .type == s: NODE_ADD
262+ elseif a: node .type == # s: NODE_ADD
252263 return self .compile_add (a: node )
253- elseif a: node .type == s: NODE_SUBTRACT
264+ elseif a: node .type == # s: NODE_SUBTRACT
254265 return self .compile_subtract (a: node )
255- elseif a: node .type == s: NODE_CONCAT
266+ elseif a: node .type == # s: NODE_CONCAT
256267 return self .compile_concat (a: node )
257- elseif a: node .type == s: NODE_MULTIPLY
268+ elseif a: node .type == # s: NODE_MULTIPLY
258269 return self .compile_multiply (a: node )
259- elseif a: node .type == s: NODE_DIVIDE
270+ elseif a: node .type == # s: NODE_DIVIDE
260271 return self .compile_divide (a: node )
261- elseif a: node .type == s: NODE_REMAINDER
272+ elseif a: node .type == # s: NODE_REMAINDER
262273 return self .compile_remainder (a: node )
263- elseif a: node .type == s: NODE_NOT
274+ elseif a: node .type == # s: NODE_NOT
264275 return self .compile_not (a: node )
265- elseif a: node .type == s: NODE_PLUS
276+ elseif a: node .type == # s: NODE_PLUS
266277 return self .compile_plus (a: node )
267- elseif a: node .type == s: NODE_MINUS
278+ elseif a: node .type == # s: NODE_MINUS
268279 return self .compile_minus (a: node )
269- elseif a: node .type == s: NODE_SUBSCRIPT
280+ elseif a: node .type == # s: NODE_SUBSCRIPT
270281 return self .compile_subscript (a: node )
271- elseif a: node .type == s: NODE_SLICE
282+ elseif a: node .type == # s: NODE_SLICE
272283 return self .compile_slice (a: node )
273- elseif a: node .type == s: NODE_DOT
284+ elseif a: node .type == # s: NODE_DOT
274285 return self .compile_dot (a: node )
275- elseif a: node .type == s: NODE_CALL
286+ elseif a: node .type == # s: NODE_CALL
276287 return self .compile_call (a: node )
277- elseif a: node .type == s: NODE_NUMBER
288+ elseif a: node .type == # s: NODE_NUMBER
278289 return self .compile_number (a: node )
279- elseif a: node .type == s: NODE_BLOB
290+ elseif a: node .type == # s: NODE_BLOB
280291 return self .compile_blob (a: node )
281- elseif a: node .type == s: NODE_STRING
292+ elseif a: node .type == # s: NODE_STRING
282293 return self .compile_string (a: node )
283- elseif a: node .type == s: NODE_LIST
294+ elseif a: node .type == # s: NODE_LIST
284295 return self .compile_list (a: node )
285- elseif a: node .type == s: NODE_DICT
296+ elseif a: node .type == # s: NODE_DICT
286297 return self .compile_dict (a: node )
287- elseif a: node .type == s: NODE_OPTION
298+ elseif a: node .type == # s: NODE_OPTION
288299 return self .compile_option (a: node )
289- elseif a: node .type == s: NODE_IDENTIFIER
300+ elseif a: node .type == # s: NODE_IDENTIFIER
290301 return self .compile_identifier (a: node )
291- elseif a: node .type == s: NODE_CURLYNAME
302+ elseif a: node .type == # s: NODE_CURLYNAME
292303 return self .compile_curlyname (a: node )
293- elseif a: node .type == s: NODE_ENV
304+ elseif a: node .type == # s: NODE_ENV
294305 return self .compile_env (a: node )
295- elseif a: node .type == s: NODE_REG
306+ elseif a: node .type == # s: NODE_REG
296307 return self .compile_reg (a: node )
297308 else
298309 throw self .err (' Compiler: unknown node: %s' , string (a: node ))
299310 endif
300311endfunction
312+ " vint: +ProhibitUsingUndeclaredVariable
301313
302314function s: PythonCompiler .compile_body (body)
303315 let empty = 1
304316 for node in a: body
305317 call self .compile (node)
318+ " vint: -ProhibitUsingUndeclaredVariable
306319 if node.type != s: NODE_COMMENT
320+ " vint: +ProhibitUsingUndeclaredVariable
307321 let empty = 0
308322 endif
309323 endfor
@@ -359,13 +373,13 @@ endfunction
359373function s: PythonCompiler .compile_function (node)
360374 let left = self .compile (a: node .left )
361375 let rlist = map (a: node .rlist, ' self.compile(v:val)' )
362- if ! empty (rlist) && rlist[-1 ] == ' ...'
376+ if ! empty (rlist) && rlist[-1 ] == # ' ...'
363377 let rlist[-1 ] = ' *a000'
364378 endif
365379
366- if left = ~ ' ^\(VimLParser\|ExprTokenizer\|ExprParser\|LvalueParser\|StringReader\|Compiler\|RegexpParser\)\.'
380+ if left = ~# ' ^\(VimLParser\|ExprTokenizer\|ExprParser\|LvalueParser\|StringReader\|Compiler\|RegexpParser\)\.'
367381 let left = matchstr (left , ' \.\zs.*' )
368- if left == ' new'
382+ if left == # ' new'
369383 return
370384 endif
371385 call self .insert_empty_lines_before_comment (1 )
@@ -405,7 +419,7 @@ endfunction
405419
406420function s: PythonCompiler .compile_let (node)
407421 let op = a: node .op
408- if op == ' .='
422+ if op == # ' .='
409423 let op = ' +='
410424 endif
411425 let right = self .compile (a: node .right )
@@ -745,7 +759,7 @@ endfunction
745759function s: PythonCompiler .compile_subscript (node)
746760 let left = self .compile (a: node .left )
747761 let right = self .compile (a: node .right )
748- if left == ' self'
762+ if left == # ' self'
749763 return printf (' getattr(%s, %s)' , left , right )
750764 else
751765 return printf (' %s[%s]' , left , right )
@@ -765,15 +779,15 @@ endfunction
765779function s: PythonCompiler .compile_call (node)
766780 let rlist = map (a: node .rlist, ' self.compile(v:val)' )
767781 let left = self .compile (a: node .left )
768- if left == ' map'
782+ if left == # ' map'
769783 let r = s: StringReader .new ([eval (rlist[1 ])])
770784 let p = s: ExprParser .new (r )
771785 let n = p .parse ()
772786 return printf (' [%s for vval in %s]' , self .compile (n ), rlist[0 ])
773- elseif left == ' call' && rlist[0 ][0 ] = ~ ' ['' "]'
787+ elseif left == # ' call' && rlist[0 ][0 ] = ~# ' ['' "]'
774788 return printf (' viml_%s(*%s)' , rlist[0 ][1 :-2 ], rlist[1 ])
775789 endif
776- if left = ~ ' \.new$'
790+ if left = ~# ' \.new$'
777791 let left = matchstr (left , ' .*\ze\.new$' )
778792 endif
779793 if index (s: viml_builtin_functions , left ) != -1
@@ -787,7 +801,7 @@ function s:PythonCompiler.compile_number(node)
787801endfunction
788802
789803function s: PythonCompiler .compile_string (node)
790- if a: node .value[0 ] == " '"
804+ if a: node .value[0 ] == # " '"
791805 let s = substitute (a: node .value[1 :-2 ], " ''" , " '" , ' g' )
792806 return ' "' . escape (s , ' \"' ) . ' "'
793807 else
@@ -819,11 +833,11 @@ endfunction
819833
820834function s: PythonCompiler .compile_identifier (node)
821835 let name = a: node .value
822- if name == ' a:000'
836+ if name == # ' a:000'
823837 let name = ' a000'
824- elseif name == ' v:val'
838+ elseif name == # ' v:val'
825839 let name = ' vval'
826- elseif name = ~ ' ^[sa]:'
840+ elseif name = ~# ' ^[sa]:'
827841 let name = name[2 :]
828842 endif
829843 if has_key (s: reserved_keywords , name)
@@ -892,9 +906,9 @@ endfunction
892906function ! s: numtoname (num)
893907 let sig = printf (" function('%s')" , a: num )
894908 for k in keys (s: )
895- if type (s: [k ]) == type ({})
909+ if type (s: [k ]) == # type ({})
896910 for name in keys (s: [k ])
897- if type (s: [k ][name]) == type (function (' tr' )) && string (s: [k ][name]) == sig
911+ if type (s: [k ][name]) == # type (function (' tr' )) && string (s: [k ][name]) == # sig
898912 return printf (' %s.%s' , k , name)
899913 endif
900914 endfor
0 commit comments