]> git.lizzy.rs Git - rust.git/blobdiff - util/lintlib.py
Make indexing_slicing a restriction lint (fixes #2933)
[rust.git] / util / lintlib.py
index c46706352b7a881ed902ea81d7285551ff600468..00826805e1617b5e80db08168b668f8e1f5b087d 100644 (file)
@@ -7,19 +7,33 @@ import collections
 import logging as log
 log.basicConfig(level=log.INFO, format='%(levelname)s: %(message)s')
 
-Lint = collections.namedtuple('Lint', 'name level doc sourcefile')
+Lint = collections.namedtuple('Lint', 'name level doc sourcefile group')
 Config = collections.namedtuple('Config', 'name ty doc default')
 
 lintname_re = re.compile(r'''pub\s+([A-Z_][A-Z_0-9]*)''')
-level_re = re.compile(r'''(Forbid|Deny|Warn|Allow)''')
+group_re = re.compile(r'''\s*([a-z_][a-z_0-9]+)''')
 conf_re = re.compile(r'''define_Conf! {\n([^}]*)\n}''', re.MULTILINE)
 confvar_re = re.compile(
     r'''/// Lint: (\w+). (.*).*\n\s*\([^,]+,\s+"([^"]+)",\s+([^=\)]+)=>\s+(.*)\),''', re.MULTILINE)
 
+lint_levels = {
+    "correctness": 'Deny',
+    "style": 'Warn',
+    "complexity": 'Warn',
+    "perf": 'Warn',
+    "restriction": 'Allow',
+    "pedantic": 'Allow',
+    "nursery": 'Allow',
+    "cargo": 'Allow',
+}
+
 
 def parse_lints(lints, filepath):
     last_comment = []
     comment = True
+    clippy = False
+    deprecated = False
+    name = ""
 
     with open(filepath) as fp:
         for line in fp:
@@ -29,43 +43,48 @@ def parse_lints(lints, filepath):
                 elif line.startswith("///"):
                     last_comment.append(line[3:])
                 elif line.startswith("declare_lint!"):
+                    import sys
+                    print "don't use `declare_lint!` in Clippy, use `declare_clippy_lint!` instead"
+                    sys.exit(42)
+                elif line.startswith("declare_clippy_lint!"):
                     comment = False
                     deprecated = False
-                    restriction = False
-                elif line.startswith("declare_restriction_lint!"):
-                    comment = False
-                    deprecated = False
-                    restriction = True
+                    clippy = True
+                    name = ""
                 elif line.startswith("declare_deprecated_lint!"):
                     comment = False
                     deprecated = True
+                    clippy = False
                 else:
                     last_comment = []
             if not comment:
                 m = lintname_re.search(line)
+
                 if m:
                     name = m.group(1).lower()
+                    line = next(fp)
 
                     if deprecated:
                         level = "Deprecated"
-                    elif restriction:
-                        level = "Allow"
+                        group = "deprecated"
                     else:
                         while True:
-                            m = level_re.search(line)
-                            if m:
-                                level = m.group(0)
+                            g = group_re.search(line)
+                            if g:
+                                group = g.group(1).lower()
+                                level = lint_levels[group]
                                 break
                             line = next(fp)
 
                     log.info("found %s with level %s in %s",
                              name, level, filepath)
-                    lints.append(Lint(name, level, last_comment, filepath))
+                    lints.append(Lint(name, level, last_comment, filepath, group))
                     last_comment = []
                     comment = True
-                if "}" in line:
-                    log.warn("Warning: missing Lint-Name in %s", filepath)
-                    comment = True
+
+                    if "}" in line:
+                        log.warn("Warning: missing Lint-Name in %s", filepath)
+                        comment = True
 
 
 def parse_configs(path):
@@ -77,7 +96,7 @@ def parse_configs(path):
     confvars = re.findall(confvar_re, match.group(1))
 
     for (lint, doc, name, default, ty) in confvars:
-        configs[lint.lower()] = Config(name, ty, doc, default)
+        configs[lint.lower()] = Config(name.replace("_", "-"), ty, doc, default)
 
     return configs