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 """ |