Plugins/CheckerPlugins/Pep8/Pep8Fixer.py

changeset 853
ec7dd115e26b
parent 852
257a6f80b96c
child 869
6d16246da792
equal deleted inserted replaced
852:257a6f80b96c 853:ec7dd115e26b
14 14
15 from E5Gui import E5MessageBox 15 from E5Gui import E5MessageBox
16 16
17 import Utilities 17 import Utilities
18 18
19 Pep8FixableIssues = ["E101", "W191", "E201", "E202", "E203", "E211", "E221", "E222", "E225", "E231", "E241", "E251", "E261", "E262", "W291", "W292", "W293", "E301", "E303", "E304", "W391", "W603"] 19 Pep8FixableIssues = ["E101", "W191", "E201", "E202", "E203", "E211", "E221",
20 "E222", "E225", "E231", "E241", "E251", "E261", "E262",
21 "W291", "W292", "W293", "E301", "E302", "E303", "E304",
22 "W391", "W603"]
20 23
21 class Pep8Fixer(QObject): 24 class Pep8Fixer(QObject):
22 """ 25 """
23 Class implementing a fixer for certain PEP 8 issues. 26 Class implementing a fixer for certain PEP 8 issues.
24 """ 27 """
39 self.__project = project 42 self.__project = project
40 self.__filename = filename 43 self.__filename = filename
41 self.__origName = "" 44 self.__origName = ""
42 self.__source = sourceLines[:] # save a copy 45 self.__source = sourceLines[:] # save a copy
43 self.__fixCodes = [c.strip() for c in fixCodes.split(",") if c.strip()] 46 self.__fixCodes = [c.strip() for c in fixCodes.split(",") if c.strip()]
47 self.fixed = 0
44 48
45 if not inPlace: 49 if not inPlace:
46 self.__origName = self.__filename 50 self.__origName = self.__filename
47 self.__filename = os.path.join(os.path.dirname(self.__filename), 51 self.__filename = os.path.join(os.path.dirname(self.__filename),
48 "fixed_" + os.path.basename(self.__filename)) 52 "fixed_" + os.path.basename(self.__filename))
64 "E262" : self.__fixWhitespaceAfterInline, 68 "E262" : self.__fixWhitespaceAfterInline,
65 "W291" : self.__fixWhitespace, 69 "W291" : self.__fixWhitespace,
66 "W292" : self.__fixNewline, 70 "W292" : self.__fixNewline,
67 "W293" : self.__fixWhitespace, 71 "W293" : self.__fixWhitespace,
68 "E301" : self.__fixOneBlankLine, 72 "E301" : self.__fixOneBlankLine,
73 "E302" : self.__fixTwoBlankLines,
69 "E303" : self.__fixTooManyBlankLines, 74 "E303" : self.__fixTooManyBlankLines,
70 "E304" : self.__fixBlankLinesAfterDecorator, 75 "E304" : self.__fixBlankLinesAfterDecorator,
71 "W391" : self.__fixTrailingBlankLines, 76 "W391" : self.__fixTrailingBlankLines,
72 "W603" : self.__fixNotEqual, 77 "W603" : self.__fixNotEqual,
73 } 78 }
119 if (code in self.__fixCodes or len(self.__fixCodes) == 0) and \ 124 if (code in self.__fixCodes or len(self.__fixCodes) == 0) and \
120 code in self.__fixes: 125 code in self.__fixes:
121 res = self.__fixes[code](code, line, pos) 126 res = self.__fixes[code](code, line, pos)
122 if res[0]: 127 if res[0]:
123 self.__modified = True 128 self.__modified = True
129 self.fixed += 1
124 else: 130 else:
125 res = (False, "") 131 res = (False, "")
126 132
127 return res 133 return res
128 134
289 self.__source.insert(line - 1, self.__getEol()) 295 self.__source.insert(line - 1, self.__getEol())
290 else: 296 else:
291 self.__stack.append((code, line, pos)) 297 self.__stack.append((code, line, pos))
292 return (True, self.trUtf8("One blank line inserted.")) 298 return (True, self.trUtf8("One blank line inserted."))
293 299
300 def __fixTwoBlankLines(self, code, line, pos, apply=False):
301 """
302 Private method to fix the need for two blank lines.
303 """
304 # count blank lines
305 index = line - 1
306 blanks = 0
307 while index:
308 if self.__source[index - 1].strip() == "":
309 blanks += 1
310 index -= 1
311 else:
312 break
313 delta = blanks - 2
314
315 if apply:
316 line -= 1
317 if delta < 0:
318 # insert blank lines (one or two)
319 while delta < 0:
320 self.__source.insert(line, self.__getEol())
321 delta += 1
322 elif delta > 0:
323 # delete superfluous blank lines
324 while delta > 0:
325 del self.__source[line - 1]
326 line -= 1
327 delta -= 1
328 else:
329 self.__stack.append((code, line, pos))
330
331 if delta < 0:
332 msg = self.trUtf8("%n blank line(s) inserted.", "", -delta)
333 elif delta > 0:
334 msg = self.trUtf8("%n superfluous lines removed", "", delta)
335 else:
336 msg = ""
337 return (True, msg)
338
294 def __fixWhitespaceAfter(self, code, line, pos, apply=False): 339 def __fixWhitespaceAfter(self, code, line, pos, apply=False):
295 """ 340 """
296 Private method to fix superfluous whitespace after '([{'. 341 Private method to fix superfluous whitespace after '([{'.
297 342
298 @param code code of the issue (string) 343 @param code code of the issue (string)
360 (boolean) 405 (boolean)
361 @return flag indicating an applied fix (boolean) and a message for 406 @return flag indicating an applied fix (boolean) and a message for
362 the fix (string) 407 the fix (string)
363 """ 408 """
364 line = line - 1 409 line = line - 1
365 while self.__source[line][pos] in [" ", "\t"]: 410 while self.__source[line][pos - 1] in [" ", "\t"]:
366 self.__source[line] = self.__source[line][:pos] + \ 411 self.__source[line] = self.__source[line][:pos - 1] + \
367 self.__source[line][pos + 1:] 412 self.__source[line][pos:]
413 pos -= 1
368 return (True, self.trUtf8("Extraneous whitespace removed.")) 414 return (True, self.trUtf8("Extraneous whitespace removed."))
369 415
370 def __fixMissingWhitespaceAroundOperator(self, code, line, pos, 416 def __fixMissingWhitespaceAroundOperator(self, code, line, pos,
371 apply=False): 417 apply=False):
372 """ 418 """

eric ide

mercurial