提交 9a07087b 编写于 作者: B bors

Auto merge of #31288 - GuillaumeGomez:error_code_tidy, r=brson

r? @steveklabnik
...@@ -21,8 +21,31 @@ if len(sys.argv) < 2: ...@@ -21,8 +21,31 @@ if len(sys.argv) < 2:
src_dir = sys.argv[1] src_dir = sys.argv[1]
errcode_map = {} errcode_map = {}
errcode_checked = []
errcode_not_found = []
error_re = re.compile("(E\d\d\d\d)") error_re = re.compile("(E\d\d\d\d)")
def check_unused_error_codes(error_codes, check_error_codes, filenames, dirnames, dirpath):
for filename in filenames:
if filename == "diagnostics.rs" or not filename.endswith(".rs"):
continue
path = os.path.join(dirpath, filename)
with open(path, 'r') as f:
for line in f:
match = error_re.search(line)
if match:
errcode = match.group(1)
if errcode in error_codes:
error_codes.remove(errcode)
if errcode not in check_error_codes:
check_error_codes.append(errcode)
for dirname in dirnames:
path = os.path.join(dirpath, dirname)
for (dirpath, dnames, fnames) in os.walk(path):
check_unused_error_codes(error_codes, check_error_codes, fnames, dnames, dirpath)
# In the register_long_diagnostics! macro, entries look like this: # In the register_long_diagnostics! macro, entries look like this:
# #
# EXXXX: r##" # EXXXX: r##"
...@@ -35,19 +58,23 @@ error_re = re.compile("(E\d\d\d\d)") ...@@ -35,19 +58,23 @@ error_re = re.compile("(E\d\d\d\d)")
long_diag_begin = "r##\"" long_diag_begin = "r##\""
long_diag_end = "\"##" long_diag_end = "\"##"
errors = False
all_errors = []
for (dirpath, dirnames, filenames) in os.walk(src_dir): for (dirpath, dirnames, filenames) in os.walk(src_dir):
if "src/test" in dirpath or "src/llvm" in dirpath: if "src/test" in dirpath or "src/llvm" in dirpath:
# Short circuit for fast # Short circuit for fast
continue continue
errcode_to_check = []
for filename in filenames: for filename in filenames:
if filename != "diagnostics.rs": if filename != "diagnostics.rs":
continue continue
path = os.path.join(dirpath, filename) path = os.path.join(dirpath, filename)
with open(path, 'r') as f: with open(path, 'r') as f:
inside_long_diag = False inside_long_diag = False
errcode_to_check = []
for line_num, line in enumerate(f, start=1): for line_num, line in enumerate(f, start=1):
if inside_long_diag: if inside_long_diag:
# Skip duplicate error code checking for this line # Skip duplicate error code checking for this line
...@@ -65,16 +92,36 @@ for (dirpath, dirnames, filenames) in os.walk(src_dir): ...@@ -65,16 +92,36 @@ for (dirpath, dirnames, filenames) in os.walk(src_dir):
errcode_map[errcode] = existing + new_record errcode_map[errcode] = existing + new_record
else: else:
errcode_map[errcode] = new_record errcode_map[errcode] = new_record
# we don't check if this is a long error explanation
if (long_diag_begin not in line and not line.strip().startswith("//")
and errcode not in errcode_to_check and errcode not in errcode_checked
and errcode not in errcode_not_found):
errcode_to_check.append(errcode)
if long_diag_begin in line: if long_diag_begin in line:
inside_long_diag = True inside_long_diag = True
break
check_unused_error_codes(errcode_to_check, errcode_checked, filenames, dirnames, dirpath)
if len(errcode_to_check) > 0:
for errcode in errcode_to_check:
if errcode in errcode_checked:
continue
errcode_not_found.append(errcode)
if len(errcode_not_found) > 0:
errcode_not_found.sort()
for errcode in errcode_not_found:
if errcode in errcode_checked:
continue
all_errors.append(errcode)
print("error: unused error code: " + errcode)
errors = True
errors = False
all_errors = []
for errcode, entries in errcode_map.items(): for errcode, entries in errcode_map.items():
all_errors.append(entries[0][0]) all_errors.append(entries[0][0])
if len(entries) > 1: if len(entries) > 1:
entries.sort()
print("error: duplicate error code " + errcode) print("error: duplicate error code " + errcode)
for entry in entries: for entry in entries:
print("{1}: {2}\n{3}".format(*entry)) print("{1}: {2}\n{3}".format(*entry))
......
...@@ -226,7 +226,7 @@ struct X { x: (), } ...@@ -226,7 +226,7 @@ struct X { x: (), }
``` ```
"##, "##,
E0038: r####" E0038: r##"
Trait objects like `Box<Trait>` can only be constructed when certain Trait objects like `Box<Trait>` can only be constructed when certain
requirements are satisfied by the trait in question. requirements are satisfied by the trait in question.
...@@ -478,7 +478,7 @@ trait Super<A> { ...@@ -478,7 +478,7 @@ trait Super<A> {
There's no easy fix for this, generally code will need to be refactored so that There's no easy fix for this, generally code will need to be refactored so that
you no longer need to derive from `Super<Self>`. you no longer need to derive from `Super<Self>`.
"####, "##,
E0072: r##" E0072: r##"
When defining a recursive struct or enum, any use of the type being defined When defining a recursive struct or enum, any use of the type being defined
...@@ -1801,14 +1801,14 @@ impl Foo { ...@@ -1801,14 +1801,14 @@ impl Foo {
register_diagnostics! { register_diagnostics! {
// E0006 // merged with E0005 // E0006 // merged with E0005
// E0134, // E0134,
// E0135, // E0135,
E0278, // requirement is not satisfied E0278, // requirement is not satisfied
E0279, // requirement is not satisfied E0279, // requirement is not satisfied
E0280, // requirement is not satisfied E0280, // requirement is not satisfied
E0284, // cannot resolve type E0284, // cannot resolve type
E0285, // overflow evaluation builtin bounds // E0285, // overflow evaluation builtin bounds
E0298, // mismatched types between arms E0298, // mismatched types between arms
E0299, // mismatched types between arms E0299, // mismatched types between arms
// E0300, // unexpanded macro // E0300, // unexpanded macro
......
...@@ -1046,8 +1046,8 @@ impl Foo for i32 {} ...@@ -1046,8 +1046,8 @@ impl Foo for i32 {}
// E0153, unused error code // E0153, unused error code
// E0157, unused error code // E0157, unused error code
E0254, // import conflicts with imported crate in this module E0254, // import conflicts with imported crate in this module
E0257, // E0257,
E0258, // E0258,
E0402, // cannot use an outer type parameter in this context E0402, // cannot use an outer type parameter in this context
E0406, // undeclared associated type E0406, // undeclared associated type
E0408, // variable from pattern #1 is not bound in pattern # E0408, // variable from pattern #1 is not bound in pattern #
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册