eric7/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/messages.py

branch
eric7
changeset 8312
800c432b34c8
parent 8207
d359172d11be
child 8881
54e42bc2437a
equal deleted inserted replaced
8311:4e8b98454baa 8312:800c432b34c8
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2010 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5 # Original (c) 2005 Divmod, Inc. See __init__.py file for details
6 #
7 # This module is based on pyflakes, but was modified to
8 # be integrated into eric
9
10 """
11 Module providing the class Message and its subclasses.
12 """
13
14
15 class Message():
16 """
17 Class defining the base for all specific message classes.
18 """
19 message_id = 'F00'
20 message = ''
21 message_args = ()
22
23 def __init__(self, filename, loc):
24 """
25 Constructor
26
27 @param filename name of the file
28 @type str
29 @param loc location of the issue
30 """
31 self.filename = filename
32 self.lineno = loc.lineno
33 self.col = getattr(loc, 'col_offset', 0)
34
35 def __str__(self):
36 """
37 Special method return a string representation of the instance object.
38
39 @return string representation of the object
40 @rtype str
41 """
42 return '{0}:{1}:{2} {3}'.format(
43 self.filename, self.lineno, self.col + 1,
44 self.message % self.message_args)
45
46 def getMessageData(self):
47 """
48 Public method to get the individual message data elements.
49
50 @return tuple containing file name, line number, column, message ID
51 and message arguments
52 @rtype tuple of (str, int, int, str, list)
53 """
54 return (self.filename, self.lineno, self.col, self.message_id,
55 self.message_args)
56
57
58 class UnusedImport(Message):
59 """
60 Class defining the "Unused Import" message.
61 """
62 message_id = 'F01'
63 message = '%r imported but unused'
64
65 def __init__(self, filename, loc, name):
66 """
67 Constructor
68
69 @param filename name of the file (string)
70 @param loc location of the issue
71 @param name name of the unused import (string)
72 """
73 Message.__init__(self, filename, loc)
74 self.message_args = (name,)
75
76
77 class RedefinedWhileUnused(Message):
78 """
79 Class defining the "Redefined While Unused" message.
80 """
81 message_id = 'F02'
82 message = 'redefinition of unused %r from line %r'
83
84 def __init__(self, filename, loc, name, orig_loc):
85 """
86 Constructor
87
88 @param filename name of the file (string)
89 @param loc location of the issue
90 @param name name of the redefined object (string)
91 @param orig_loc location of the original definition
92 """
93 Message.__init__(self, filename, loc)
94 self.message_args = (name, orig_loc.lineno)
95
96
97 class RedefinedInListComp(Message):
98 """
99 Class defining the "Redefined In List Comprehension" message.
100 """
101 message_id = 'F12'
102 message = 'list comprehension redefines %r from line %r'
103
104 def __init__(self, filename, loc, name, orig_loc):
105 """
106 Constructor
107
108 @param filename name of the file (string)
109 @param loc location of the issue
110 @param name name of the redefined object (string)
111 @param orig_loc location of the original definition
112 """
113 Message.__init__(self, filename, loc)
114 self.message_args = (name, orig_loc.lineno)
115
116
117 class ImportShadowedByLoopVar(Message):
118 """
119 Class defining the "Import Shadowed By Loop Var" message.
120 """
121 message_id = 'F03'
122 message = 'import %r from line %r shadowed by loop variable'
123
124 def __init__(self, filename, loc, name, orig_loc):
125 """
126 Constructor
127
128 @param filename name of the file (string)
129 @param loc location of the issue
130 @param name name of the shadowed import (string)
131 @param orig_loc location of the import
132 """
133 Message.__init__(self, filename, loc)
134 self.message_args = (name, orig_loc.lineno)
135
136
137 class ImportStarNotPermitted(Message):
138 """
139 Class defining the "Import * not permitted" message.
140 """
141 message_id = 'F16'
142 message = "'from %s import *' only allowed at module level"
143
144 def __init__(self, filename, loc, modname):
145 """
146 Constructor
147
148 @param filename name of the file (string)
149 @param loc location of the issue
150 @param modname name of the module (string)
151 """
152 Message.__init__(self, filename, loc)
153 self.message_args = (modname,)
154
155
156 class ImportStarUsed(Message):
157 """
158 Class defining the "Import Star Used" message.
159 """
160 message_id = 'F04'
161 message = "'from %s import *' used; unable to detect undefined names"
162
163 def __init__(self, filename, loc, modname):
164 """
165 Constructor
166
167 @param filename name of the file (string)
168 @param loc location of the issue
169 @param modname name of the module imported using star import (string)
170 """
171 Message.__init__(self, filename, loc)
172 self.message_args = (modname,)
173
174
175 class ImportStarUsage(Message):
176 """
177 Class defining the "Import Star Usage" message.
178 """
179 message_id = 'F17'
180 message = "%r may be undefined, or defined from star imports: %s"
181
182 def __init__(self, filename, loc, name, from_list):
183 """
184 Constructor
185
186 @param filename name of the file (string)
187 @param loc location of the issue
188 @param name name of the variable (string)
189 @param from_list list of modules imported from with * (string)
190 """
191 Message.__init__(self, filename, loc)
192 self.message_args = (name, from_list)
193
194
195 class UndefinedName(Message):
196 """
197 Class defining the "Undefined Name" message.
198 """
199 message_id = 'F05'
200 message = 'undefined name %r'
201
202 def __init__(self, filename, loc, name):
203 """
204 Constructor
205
206 @param filename name of the file (string)
207 @param loc location of the issue
208 @param name undefined name (string)
209 """
210 Message.__init__(self, filename, loc)
211 self.message_args = (name,)
212
213
214 class DoctestSyntaxError(Message):
215 """
216 Class defining the "Doctest syntax Error" message.
217 """
218 message_id = 'F13'
219 message = 'syntax error in doctest'
220
221 def __init__(self, filename, loc, position=None):
222 """
223 Constructor
224
225 @param filename name of the file (string)
226 @param loc location of the issue
227 @param position position of the syntax error
228 """
229 Message.__init__(self, filename, loc)
230 if position:
231 (self.lineno, self.col) = position
232 self.message_args = ()
233
234
235 class UndefinedExport(Message):
236 """
237 Class defining the "Undefined Export" message.
238 """
239 message_id = 'F06'
240 message = 'undefined name %r in __all__'
241
242 def __init__(self, filename, loc, name):
243 """
244 Constructor
245
246 @param filename name of the file (string)
247 @param loc location of the issue
248 @param name undefined exported name (string)
249 """
250 Message.__init__(self, filename, loc)
251 self.message_args = (name,)
252
253
254 class UndefinedLocal(Message):
255 """
256 Class defining the "Undefined Local Variable" message.
257 """
258 message_id = 'F07'
259 message = 'local variable %r {0} referenced before assignment'
260
261 default = 'defined in enclosing scope on line %r'
262 builtin = 'defined as a builtin'
263
264 def __init__(self, filename, loc, name, orig_loc):
265 """
266 Constructor
267
268 @param filename name of the file (string)
269 @param loc location of the issue
270 @param name name of the prematurely referenced variable (string)
271 @param orig_loc location of the variable definition
272 """
273 Message.__init__(self, filename, loc)
274 if orig_loc is None:
275 self.message = self.message.format(self.builtin)
276 self.message_args = (name,)
277 self.message_id = 'F07B'
278 else:
279 self.message = self.message.format(self.default)
280 self.message_args = (name, orig_loc.lineno)
281 self.message_id = 'F07A'
282
283
284 class DuplicateArgument(Message):
285 """
286 Class defining the "Duplicate Argument" message.
287 """
288 message_id = 'F08'
289 message = 'duplicate argument %r in function definition'
290
291 def __init__(self, filename, loc, name):
292 """
293 Constructor
294
295 @param filename name of the file (string)
296 @param loc location of the issue
297 @param name name of the duplicate argument (string)
298 """
299 Message.__init__(self, filename, loc)
300 self.message_args = (name,)
301
302
303 class MultiValueRepeatedKeyLiteral(Message):
304 """
305 Class defining the multiple used dictionary key message.
306 """
307 message_id = 'F18'
308 message = 'dictionary key %r repeated with different values'
309
310 def __init__(self, filename, loc, key):
311 """
312 Constructor
313
314 @param filename name of the file (string)
315 @param loc location of the issue
316 @param key dictionary key (string)
317 """
318 Message.__init__(self, filename, loc)
319 self.message_args = (key,)
320
321
322 class MultiValueRepeatedKeyVariable(Message):
323 """
324 Class defining the multiple used dictionary key variable message.
325 """
326 message_id = 'F19'
327 message = 'dictionary key variable %s repeated with different values'
328
329 def __init__(self, filename, loc, key):
330 """
331 Constructor
332
333 @param filename name of the file (string)
334 @param loc location of the issue
335 @param key dictionary key variable (string)
336 """
337 Message.__init__(self, filename, loc)
338 self.message_args = (key,)
339
340
341 class LateFutureImport(Message):
342 """
343 Class defining the "Late Future Import" message.
344 """
345 message_id = 'F10'
346 message = 'from __future__ imports must occur at the beginning of the file'
347
348 def __init__(self, filename, loc, names):
349 """
350 Constructor
351
352 @param filename name of the file (string)
353 @param loc location of the issue
354 @param names names of the imported futures (string)
355 """
356 Message.__init__(self, filename, loc)
357 self.message_args = ()
358
359
360 class FutureFeatureNotDefined(Message):
361 """
362 Class defining the undefined __future__ feature message.
363 """
364 message_id = 'F20'
365 message = 'future feature %s is not defined'
366
367 def __init__(self, filename, loc, name):
368 """
369 Constructor
370
371 @param filename name of the file (string)
372 @param loc location of the issue
373 @param name name of the imported undefined future feature (string)
374 """
375 Message.__init__(self, filename, loc)
376 self.message_args = (name,)
377
378
379 class UnusedVariable(Message):
380 """
381 Class defining the "Unused Variable" message.
382
383 Indicates that a variable has been explicitly assigned to but not actually
384 used.
385 """
386 message_id = 'F11'
387 message = 'local variable %r is assigned to but never used'
388
389 def __init__(self, filename, loc, names):
390 """
391 Constructor
392
393 @param filename name of the file (string)
394 @param loc location of the issue
395 @param names names of unused variable (string)
396 """
397 Message.__init__(self, filename, loc)
398 self.message_args = (names,)
399
400
401 class ReturnWithArgsInsideGenerator(Message):
402 """
403 Class defining the "Return values in generator" message.
404
405 Indicates a return statement with arguments inside a generator.
406 """
407 message_id = 'F14'
408 message = '\'return\' with argument inside generator'
409
410
411 class ReturnOutsideFunction(Message):
412 """
413 Class defining the "Return outside function" message.
414
415 Indicates a return statement outside of a function/method.
416 """
417 message_id = 'F15'
418 message = '\'return\' outside function'
419
420
421 class YieldOutsideFunction(Message):
422 """
423 Class defining the "Yield outside function" message.
424
425 Indicates a yield or yield from statement outside of a function/method.
426 """
427 message_id = 'F21'
428 message = '\'yield\' outside function'
429
430
431 # For whatever reason, Python gives different error messages for these two. We
432 # match the Python error message exactly.
433 class ContinueOutsideLoop(Message):
434 """
435 Class defining the "Continue outside loop" message.
436
437 Indicates a continue statement outside of a while or for loop.
438 """
439 message_id = 'F22'
440 message = '\'continue\' not properly in loop'
441
442
443 class BreakOutsideLoop(Message):
444 """
445 Class defining the "Break outside loop" message.
446
447 Indicates a break statement outside of a while or for loop.
448 """
449 message_id = 'F23'
450 message = '\'break\' outside loop'
451
452
453 class ContinueInFinally(Message):
454 """
455 Class defining the "Continue in finally block" message.
456
457 Indicates a continue statement in a finally block in a while or for loop.
458 """
459 message_id = 'F24'
460 message = '\'continue\' not supported inside \'finally\' clause'
461
462
463 class DefaultExceptNotLast(Message):
464 """
465 Class defining the "Default except not being the last" message.
466
467 Indicates an except: block as not the last exception handler.
468 """
469 message_id = 'F25'
470 message = 'default \'except:\' must be last'
471
472
473 class TwoStarredExpressions(Message):
474 """
475 Class defining the "multiple starred expressions" message.
476
477 Two or more starred expressions in an assignment (a, *b, *c = d).
478 """
479 message_id = 'F26'
480 message = 'two starred expressions in assignment'
481
482
483 class TooManyExpressionsInStarredAssignment(Message):
484 """
485 Class defining the "too many starred expressions" message.
486
487 Too many expressions in an assignment with star-unpacking
488 """
489 message_id = 'F27'
490 message = 'too many expressions in star-unpacking assignment'
491
492
493 class IfTuple(Message):
494 """
495 Class defining the "non-empty tuple literal" message.
496
497 Conditional test is a non-empty tuple literal, which are always True.
498 """
499 message_id = 'F49'
500 message = (
501 '\'if tuple literal\' is always true, perhaps remove accidental comma?'
502 )
503
504
505 class AssertTuple(Message):
506 """
507 Class defining the "tuple assertion" message.
508
509 Assertion test is a tuple, which are always True.
510 """
511 message_id = 'F28'
512 message = 'assertion is always true, perhaps remove parentheses?'
513
514
515 class ForwardAnnotationSyntaxError(Message):
516 """
517 Class defining the "forward annotation syntax error" message.
518
519 Found a syntax error in forward annotation.
520 """
521 message_id = 'F29'
522 message = 'syntax error in forward annotation %r'
523
524 def __init__(self, filename, loc, annotation):
525 """
526 Constructor
527
528 @param filename name of the file (string)
529 @param loc location of the issue
530 @param annotation erroneous forward annotation (string)
531 """
532 Message.__init__(self, filename, loc)
533 self.message_args = (annotation,)
534
535
536 class CommentAnnotationSyntaxError(Message):
537 """
538 Class defining the "Comment Annotation Syntax Error" message.
539
540 Indicates a syntax error in a type comment.
541 """
542 message_id = 'F31'
543 message = 'syntax error in type comment %r'
544
545 def __init__(self, filename, loc, annotation):
546 """
547 Constructor
548
549 @param filename name of the file (string)
550 @param loc location of the issue
551 @param annotation erroneous forward annotation (string)
552 """
553 Message.__init__(self, filename, loc)
554 self.message_args = (annotation,)
555
556
557 class RaiseNotImplemented(Message):
558 """
559 Class defining the "raise not implemented" message.
560
561 Use NotImplementedError instead of NotImplemented.
562 """
563 message_id = 'F30'
564 message = "'raise NotImplemented' should be 'raise NotImplementedError'"
565
566
567 class InvalidPrintSyntax(Message):
568 """
569 Class defining the "Invalid Print Syntax" message.
570
571 Indicates the use of >> with a print function.
572 """
573 message_id = 'F32'
574 message = 'use of >> is invalid with print function'
575
576
577 class IsLiteral(Message):
578 """
579 Class defining the "Is Literal" message.
580
581 Indicates the use of "is" or "is not" against str, int and bytes.
582 """
583 message_id = 'F33'
584 message = 'use ==/!= to compare str, bytes, and int literals'
585
586
587 class FStringMissingPlaceholders(Message):
588 """
589 Class defining the "Missing Placeholder" message.
590
591 Indicates that an f-string is missing some placeholders.
592 """
593 message_id = 'F34'
594 message = 'f-string is missing placeholders'
595
596
597 class StringDotFormatExtraPositionalArguments(Message):
598 """
599 Class defining the "Unused Arguments" message.
600
601 Indicates that an f-string has unused arguments.
602 """
603 message_id = 'F35'
604 message = "'...'.format(...) has unused arguments at position(s): %s"
605
606 def __init__(self, filename, loc, extra_positions):
607 """
608 Constructor
609
610 @param filename name of the file (string)
611 @param loc location of the issue
612 @param extra_positions indexes of unused arguments
613 """
614 Message.__init__(self, filename, loc)
615 self.message_args = (extra_positions,)
616
617
618 class StringDotFormatExtraNamedArguments(Message):
619 """
620 Class defining the "Unused Named Arguments" message.
621
622 Indicates that an f-string has unused named arguments.
623 """
624 message_id = 'F36'
625 message = "'...'.format(...) has unused named argument(s): %s"
626
627 def __init__(self, filename, loc, extra_keywords):
628 """
629 Constructor
630
631 @param filename name of the file (string)
632 @param loc location of the issue
633 @param extra_keywords index of unused named arguments
634 """
635 Message.__init__(self, filename, loc)
636 self.message_args = (extra_keywords,)
637
638
639 class StringDotFormatMissingArgument(Message):
640 """
641 Class defining the "Missing Arguments" message.
642
643 Indicates that an f-string is missing some arguments.
644 """
645 message_id = 'F37'
646 message = "'...'.format(...) is missing argument(s) for placeholder(s): %s"
647
648 def __init__(self, filename, loc, missing_arguments):
649 """
650 Constructor
651
652 @param filename name of the file (string)
653 @param loc location of the issue
654 @param missing_arguments missing arguments
655 """
656 Message.__init__(self, filename, loc)
657 self.message_args = (missing_arguments,)
658
659
660 class StringDotFormatMixingAutomatic(Message):
661 """
662 Class defining the "Mixing Automatic and Manual" message.
663
664 Indicates that an f-string mixes automatic and manual numbering.
665 """
666 message_id = 'F38'
667 message = "'...'.format(...) mixes automatic and manual numbering"
668
669
670 class StringDotFormatInvalidFormat(Message):
671 """
672 Class defining the "Invalid Format String" message.
673
674 Indicates that an f-string contains an invalid format string.
675 """
676 message_id = 'F39'
677 message = "'...'.format(...) has invalid format string: %s"
678
679 def __init__(self, filename, loc, error):
680 """
681 Constructor
682
683 @param filename name of the file (string)
684 @param loc location of the issue
685 @param error error details
686 """
687 Message.__init__(self, filename, loc)
688 if not isinstance(error, str):
689 error = str(error)
690 self.message_args = (error,)
691
692
693 class PercentFormatInvalidFormat(Message):
694 """
695 Class defining the "Invalid Percent Format String" message.
696
697 Indicates that a percent format has an invalid format string.
698 """
699 message_id = 'F40'
700 message = "'...' %% ... has invalid format string: %s"
701
702 def __init__(self, filename, loc, error):
703 """
704 Constructor
705
706 @param filename name of the file (string)
707 @param loc location of the issue
708 @param error error details
709 """
710 Message.__init__(self, filename, loc)
711 self.message_args = (error,)
712
713
714 class PercentFormatMixedPositionalAndNamed(Message):
715 """
716 Class defining the "Mixed Positional and Named" message.
717
718 Indicates that a percent format has mixed positional and named
719 placeholders.
720 """
721 message_id = 'F41'
722 message = "'...' %% ... has mixed positional and named placeholders"
723
724
725 class PercentFormatUnsupportedFormatCharacter(Message):
726 """
727 Class defining the "Unsupported Format Character" message.
728
729 Indicates that a percent format has an unsupported format character.
730 """
731 message_id = 'F42'
732 message = "'...' %% ... has unsupported format character %r"
733
734 def __init__(self, filename, loc, c):
735 """
736 Constructor
737
738 @param filename name of the file (string)
739 @param loc location of the issue
740 @param c unsupported format character
741 """
742 Message.__init__(self, filename, loc)
743 self.message_args = (c,)
744
745
746 class PercentFormatPositionalCountMismatch(Message):
747 """
748 Class defining the "Placeholder Substitution Mismatch" message.
749
750 Indicates that a percent format has a mismatching number of placeholders
751 and substitutions.
752 """
753 message_id = 'F43'
754 message = "'...' %% ... has %d placeholder(s) but %d substitution(s)"
755
756 def __init__(self, filename, loc, n_placeholders, n_substitutions):
757 """
758 Constructor
759
760 @param filename name of the file (string)
761 @param loc location of the issue
762 @param n_placeholders number of placeholders (integer)
763 @param n_substitutions number of substitutions (integer)
764 """
765 Message.__init__(self, filename, loc)
766 self.message_args = (n_placeholders, n_substitutions)
767
768
769 class PercentFormatExtraNamedArguments(Message):
770 """
771 Class defining the "Unused Named Arguments" message.
772
773 Indicates that a percent format has unused named arguments.
774 """
775 message_id = 'F44'
776 message = "'...' %% ... has unused named argument(s): %s"
777
778 def __init__(self, filename, loc, extra_keywords):
779 """
780 Constructor
781
782 @param filename name of the file (string)
783 @param loc location of the issue
784 @param extra_keywords index of unused named arguments
785 """
786 Message.__init__(self, filename, loc)
787 self.message_args = (extra_keywords,)
788
789
790 class PercentFormatMissingArgument(Message):
791 """
792 Class defining the "Missing Arguments" message.
793
794 Indicates that a percent format is missing arguments for some placeholders.
795 """
796 message_id = 'F45'
797 message = "'...' %% ... is missing argument(s) for placeholder(s): %s"
798
799 def __init__(self, filename, loc, missing_arguments):
800 """
801 Constructor
802
803 @param filename name of the file (string)
804 @param loc location of the issue
805 @param missing_arguments missing arguments
806 """
807 Message.__init__(self, filename, loc)
808 self.message_args = (missing_arguments,)
809
810
811 class PercentFormatExpectedMapping(Message):
812 """
813 Class defining the "Sequence instead of Mapping" message.
814
815 Indicates that a percent format expected a mapping but got a sequence.
816 """
817 message_id = 'F46'
818 message = "'...' %% ... expected mapping but got sequence"
819
820
821 class PercentFormatExpectedSequence(Message):
822 """
823 Class defining the "Mapping instead of Sequence" message.
824
825 Indicates that a percent format expected a sequence but got a mapping.
826 """
827 message_id = 'F47'
828 message = "'...' %% ... expected sequence but got mapping"
829
830
831 class PercentFormatStarRequiresSequence(Message):
832 """
833 Class defining the "'*' Requires Sequence" message.
834
835 Indicates that a percent format expected a sequence.
836 """
837 message_id = 'F48'
838 message = "'...' %% ... `*` specifier requires sequence"

eric ide

mercurial