Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py

changeset 6177
af76e795c4ce
parent 6106
921d070cec82
child 6178
905ea208884a
diff -r 8927e74527bc -r af76e795c4ce Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py
--- a/Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py	Thu Mar 08 18:51:35 2018 +0100
+++ b/Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py	Thu Mar 08 19:03:19 2018 +0100
@@ -26,6 +26,8 @@
         "M191", "M192", "M193", "M194",
         "M195", "M196", "M197", "M198",
         
+        "M201",
+        
         "M601",
         "M611", "M612", "M613",
         "M621", "M622", "M623", "M624", "M625",
@@ -101,6 +103,7 @@
             (self.__checkBuiltins, ("M131", "M132")),
             (self.__checkComprehensions, ("M191", "M192", "M193", "M194",
                                           "M195", "M196", "M197", "M198")),
+            (self.__checkDictWithSortedKeys, ("M201",)),
             (self.__checkPep3101, ("M601",)),
             (self.__checkFormatString, ("M611", "M612", "M613",
                                         "M621", "M622", "M623", "M624", "M625",
@@ -112,15 +115,15 @@
         ]
         
         self.__defaultArgs = {
+            "BuiltinsChecker": {
+                "chr": ["unichr", ],
+                "str": ["unicode", ],
+            },
             "CodingChecker": 'latin-1, utf-8',
             "CopyrightChecker": {
+                "Author": "",
                 "MinFilesize": 0,
-                "Author": "",
             },
-            "BuiltinsChecker": {
-                "str": ["unicode", ],
-                "chr": ["unichr", ],
-            }
         }
         
         self.__checkers = []
@@ -561,25 +564,25 @@
                 if (isinstance(node.args[0], ast.GeneratorExp) and
                         node.func.id in ('list', 'set', 'dict')):
                     errorCode = {
+                        "dict": "M193",
                         "list": "M191",
                         "set": "M192",
-                        "dict": "M193",
                     }[node.func.id]
                     self.__error(node.lineno - 1, node.col_offset, errorCode)
 
                 elif (isinstance(node.args[0], ast.ListComp) and
                       node.func.id in ('set', 'dict')):
                     errorCode = {
+                        'dict': 'M195',
                         'set': 'M194',
-                        'dict': 'M195',
                     }[node.func.id]
                     self.__error(node.lineno - 1, node.col_offset, errorCode)
 
                 elif (isinstance(node.args[0], ast.List) and
                       node.func.id in ('set', 'dict')):
                     errorCode = {
+                        'dict': 'M197',
                         'set': 'M196',
-                        'dict': 'M197',
                     }[node.func.id]
                     self.__error(node.lineno - 1, node.col_offset, errorCode)
 
@@ -612,6 +615,18 @@
                             errorCode = "M821"
                         self.__error(default.lineno - 1, default.col_offset,
                                      errorCode, typeName)
+    
+    def __checkDictWithSortedKeys(self):
+        """
+        Private method to check, if dictionary keys appear in sorted order.
+        """
+        for node in ast.walk(self.__tree):
+            if isinstance(node, ast.Dict) and \
+               all(isinstance(key, ast.Str) for key in node.keys):
+                for key1, key2 in zip(node.keys, node.keys[1:]):
+                    if key2.s < key1.s:
+                        self.__error(key2.lineno - 1, key2.col_offset,
+                                     "M201", key2.s, key1.s)
 
 
 class TextVisitor(ast.NodeVisitor):

eric ide

mercurial