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):