Skip to content

Commit

Permalink
Make error code registration work again. #19624
Browse files Browse the repository at this point in the history
  • Loading branch information
brson committed Jan 20, 2015
1 parent a0f86de commit 953d6df
Show file tree
Hide file tree
Showing 11 changed files with 128 additions and 80 deletions.
1 change: 1 addition & 0 deletions mk/tests.mk
Expand Up @@ -302,6 +302,7 @@ tidy:
| grep '^$(S)src/libbacktrace' -v \
| grep '^$(S)src/rust-installer' -v \
| xargs $(CFG_PYTHON) $(S)src/etc/check-binaries.py
$(Q) $(CFG_PYTHON) $(S)src/etc/errorck.py $(S)src/


endif
Expand Down
70 changes: 70 additions & 0 deletions src/etc/errorck.py
@@ -0,0 +1,70 @@
# Copyright 2015 The Rust Project Developers. See the COPYRIGHT
# file at the top-level directory of this distribution and at
# http://rust-lang.org/COPYRIGHT.
#
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
# option. This file may not be copied, modified, or distributed
# except according to those terms.

# Digs error codes out of files named 'diagnostics.rs' across
# the tree, and ensures thare are no duplicates.

import sys, os, re

src_dir = sys.argv[1]

errcode_map = { }

for (dirpath, dirnames, filenames) in os.walk(src_dir):

if "src/test" in dirpath or "src/llvm" in dirpath:
# Short circuit for fast
continue

for filename in filenames:
if filename != "diagnostics.rs":
continue

path = os.path.join(dirpath, filename)
line_num = 1
with open(path, 'r') as f:
for line in f:

p = re.compile("(E\d\d\d\d)")
m = p.search(line)
if not m is None:
errcode = m.group(1)

new_record = [(errcode, path, line_num, line)]
existing = errcode_map.get(errcode)
if existing is not None:
# This is a dupe
errcode_map[errcode] = existing + new_record
else:
errcode_map[errcode] = new_record

line_num += 1

errors = False
all_errors = []
for errcode in errcode_map:
entries = errcode_map[errcode]
all_errors += [entries[0][0]]
if len(entries) > 1:
print "error: duplicate error code " + errcode
for entry in entries:
print entry[1] + ": " + str(entry[2])
print entry[3]
errors = True

print str(len(errcode_map)) + " error codes"

all_errors.sort()
all_errors.reverse()

print "highest error code: " + all_errors[0]

if errors:
sys.exit(1)
20 changes: 4 additions & 16 deletions src/librustc/diagnostics.rs
Expand Up @@ -31,7 +31,6 @@ register_diagnostics! {
E0010,
E0011,
E0012,
E0013,
E0014,
E0015,
E0016,
Expand All @@ -49,24 +48,13 @@ register_diagnostics! {
E0137,
E0138,
E0139,
E0140,
E0152,
E0153,
E0157,
E0158,
E0161,
E0162,
E0165,
E0166,
E0167,
E0168,
E0169,
E0170,
E0171,
E0172,
E0173,
E0174,
E0177,
E0178,
E0179
E0170
}

__build_diagnostic_array! { DIAGNOSTICS }

6 changes: 3 additions & 3 deletions src/librustc/lib.rs
Expand Up @@ -54,7 +54,9 @@ extern crate test;

pub use rustc_llvm as llvm;

mod diagnostics;
// NB: This module needs to be declared first so diagnostics are
// registered before they are used.
pub mod diagnostics;

pub mod back {
pub use rustc_back::abi;
Expand Down Expand Up @@ -132,8 +134,6 @@ pub mod lib {
pub use llvm;
}

__build_diagnostic_array! { DIAGNOSTICS }

// A private module so that macro-expanded idents like
// `::rustc::lint::Lint` will also work in `rustc` itself.
//
Expand Down
15 changes: 13 additions & 2 deletions src/librustc_driver/lib.rs
Expand Up @@ -61,7 +61,6 @@ use rustc::lint::Lint;
use rustc::lint;
use rustc::metadata;
use rustc::metadata::creader::CrateOrString::Str;
use rustc::DIAGNOSTICS;
use rustc::util::common::time;

use std::cmp::Ordering::Equal;
Expand Down Expand Up @@ -98,7 +97,7 @@ fn run_compiler(args: &[String]) {
None => return
};

let descriptions = diagnostics::registry::Registry::new(&DIAGNOSTICS);
let descriptions = diagnostics_registry();
match matches.opt_str("explain") {
Some(ref code) => {
match descriptions.find_description(&code[]) {
Expand Down Expand Up @@ -659,8 +658,20 @@ pub fn monitor<F:FnOnce()+Send>(f: F) {
}
}

pub fn diagnostics_registry() -> diagnostics::registry::Registry {
use syntax::diagnostics::registry::Registry;

let all_errors = Vec::new() +
rustc::diagnostics::DIAGNOSTICS.as_slice() +
rustc_typeck::diagnostics::DIAGNOSTICS.as_slice() +
rustc_resolve::diagnostics::DIAGNOSTICS.as_slice();

Registry::new(&*all_errors)
}

pub fn main() {
let args = std::os::args();
let result = run(args);
std::os::set_exit_status(result);
}

18 changes: 18 additions & 0 deletions src/librustc_resolve/diagnostics.rs
@@ -0,0 +1,18 @@
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![allow(non_snake_case)]

register_diagnostics! {
E0157,
E0153
}

__build_diagnostic_array! { DIAGNOSTICS }
4 changes: 4 additions & 0 deletions src/librustc_resolve/lib.rs
Expand Up @@ -97,6 +97,10 @@ use std::mem::replace;
use std::rc::{Rc, Weak};
use std::uint;

// NB: This module needs to be declared first so diagnostics are
// registered before they are used.
pub mod diagnostics;

mod check_unused;
mod record_exports;
mod build_reduced_graph;
Expand Down
61 changes: 3 additions & 58 deletions src/librustc_typeck/diagnostics.rs
Expand Up @@ -10,38 +10,7 @@

#![allow(non_snake_case)]

register_diagnostic! {
E0001,
r##"
This error suggests that the expression arm corresponding to the noted pattern
will never be reached as for all possible values of the expression being matched,
one of the preceeding patterns will match.
This means that perhaps some of the preceeding patterns are too general, this
one is too specific or the ordering is incorrect.
"## }

register_diagnostics! {
E0002,
E0003,
E0004,
E0005,
E0006,
E0007,
E0008,
E0009,
E0010,
E0011,
E0012,
E0013,
E0014,
E0015,
E0016,
E0017,
E0018,
E0019,
E0020,
E0022,
E0023,
E0024,
E0025,
Expand All @@ -61,12 +30,9 @@ register_diagnostics! {
E0046,
E0049,
E0050,
E0051,
E0052,
E0053,
E0054,
E0055,
E0056,
E0057,
E0059,
E0060,
Expand Down Expand Up @@ -101,16 +67,12 @@ register_diagnostics! {
E0092,
E0093,
E0094,
E0100,
E0101,
E0102,
E0103,
E0104,
E0106,
E0107,
E0108,
E0109,
E0110,
E0116,
E0117,
E0118,
Expand All @@ -125,38 +87,21 @@ register_diagnostics! {
E0130,
E0131,
E0132,
E0133,
E0134,
E0135,
E0136,
E0137,
E0138,
E0139,
E0140,
E0141,
E0152,
E0153,
E0157,
E0158,
E0159,
E0161,
E0162,
E0163,
E0164,
E0165,
E0166,
E0167,
E0168,
E0169,
E0171,
E0172,
E0173, // manual implementations of unboxed closure traits are experimental
E0174, // explicit use of unboxed closure methods are experimental
E0177,
E0178,
E0180,
E0181,
E0182,
E0183,
E0184
}

__build_diagnostic_array! { DIAGNOSTICS }

4 changes: 4 additions & 0 deletions src/librustc_typeck/lib.rs
Expand Up @@ -111,6 +111,10 @@ use syntax::ast_util::local_def;

use std::cell::RefCell;

// NB: This module needs to be declared first so diagnostics are
// registered before they are used.
pub mod diagnostics;

mod check;
mod rscope;
mod astconv;
Expand Down
7 changes: 7 additions & 0 deletions src/libsyntax/diagnostics/plugin.rs
Expand Up @@ -65,6 +65,13 @@ pub fn expand_diagnostic_used<'cx>(ecx: &'cx mut ExtCtxt,
}
()
});
with_registered_diagnostics(|diagnostics| {
if !diagnostics.contains_key(&code.name) {
ecx.span_err(span, &format!(
"used diagnostic code {} not registered", token::get_ident(code).get()
)[]);
}
});
MacExpr::new(quote_expr!(ecx, ()))
}

Expand Down
2 changes: 1 addition & 1 deletion src/test/run-make/issue-19371/foo.rs
Expand Up @@ -44,7 +44,7 @@ fn basic_sess(sysroot: Path) -> Session {
opts.output_types = vec![OutputTypeExe];
opts.maybe_sysroot = Some(sysroot);

let descriptions = Registry::new(&rustc::DIAGNOSTICS);
let descriptions = Registry::new(&rustc::diagnostics::DIAGNOSTICS);
let sess = build_session(opts, None, descriptions);
sess
}
Expand Down

0 comments on commit 953d6df

Please sign in to comment.