mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-04 09:53:04 +03:00
rustc: fix fallout of merging ast::ViewItem into ast::Item.
This commit is contained in:
@@ -1202,17 +1202,17 @@ fn get_lints(&self) -> LintArray {
|
||||
lint_array!(UNUSED_IMPORT_BRACES)
|
||||
}
|
||||
|
||||
fn check_view_item(&mut self, cx: &Context, view_item: &ast::ViewItem) {
|
||||
match view_item.node {
|
||||
ast::ViewItemUse(ref view_path) => {
|
||||
fn check_item(&mut self, cx: &Context, item: &ast::Item) {
|
||||
match item.node {
|
||||
ast::ItemUse(ref view_path) => {
|
||||
match view_path.node {
|
||||
ast::ViewPathList(_, ref items, _) => {
|
||||
ast::ViewPathList(_, ref items) => {
|
||||
if items.len() == 1 {
|
||||
match items[0].node {
|
||||
ast::PathListIdent {ref name, ..} => {
|
||||
let m = format!("braces around {} is unnecessary",
|
||||
token::get_ident(*name).get());
|
||||
cx.span_lint(UNUSED_IMPORT_BRACES, view_item.span,
|
||||
cx.span_lint(UNUSED_IMPORT_BRACES, item.span,
|
||||
&m[]);
|
||||
},
|
||||
_ => ()
|
||||
@@ -1709,22 +1709,6 @@ fn check_crate(&mut self, _: &Context, c: &ast::Crate) {
|
||||
}
|
||||
}
|
||||
|
||||
fn check_view_item(&mut self, cx: &Context, item: &ast::ViewItem) {
|
||||
// compiler-generated `extern crate` statements have a dummy span.
|
||||
if item.span == DUMMY_SP { return }
|
||||
|
||||
let id = match item.node {
|
||||
ast::ViewItemExternCrate(_, _, id) => id,
|
||||
ast::ViewItemUse(..) => return,
|
||||
};
|
||||
let cnum = match cx.tcx.sess.cstore.find_extern_mod_stmt_cnum(id) {
|
||||
Some(cnum) => cnum,
|
||||
None => return,
|
||||
};
|
||||
let id = ast::DefId { krate: cnum, node: ast::CRATE_NODE_ID };
|
||||
self.lint(cx, id, item.span);
|
||||
}
|
||||
|
||||
fn check_expr(&mut self, cx: &Context, e: &ast::Expr) {
|
||||
if self.is_internal(cx, e.span) { return; }
|
||||
|
||||
@@ -1776,6 +1760,17 @@ fn check_item(&mut self, cx: &Context, item: &ast::Item) {
|
||||
if self.is_internal(cx, item.span) { return }
|
||||
|
||||
match item.node {
|
||||
ast::ItemExternCrate(_) => {
|
||||
// compiler-generated `extern crate` items have a dummy span.
|
||||
if item.span == DUMMY_SP { return }
|
||||
|
||||
let cnum = match cx.tcx.sess.cstore.find_extern_mod_stmt_cnum(item.id) {
|
||||
Some(cnum) => cnum,
|
||||
None => return,
|
||||
};
|
||||
let id = ast::DefId { krate: cnum, node: ast::CRATE_NODE_ID };
|
||||
self.lint(cx, id, item.span);
|
||||
}
|
||||
ast::ItemTrait(_, _, ref supertraits, _) => {
|
||||
for t in supertraits.iter() {
|
||||
if let ast::TraitTyParamBound(ref t, _) = *t {
|
||||
|
||||
@@ -603,14 +603,6 @@ fn visit_foreign_item(&mut self, it: &ast::ForeignItem) {
|
||||
})
|
||||
}
|
||||
|
||||
fn visit_view_item(&mut self, i: &ast::ViewItem) {
|
||||
self.with_lint_attrs(&i.attrs[], |cx| {
|
||||
run_lints!(cx, check_view_item, i);
|
||||
cx.visit_ids(|v| v.visit_view_item(i));
|
||||
visit::walk_view_item(cx, i);
|
||||
})
|
||||
}
|
||||
|
||||
fn visit_pat(&mut self, p: &ast::Pat) {
|
||||
run_lints!(self, check_pat, p);
|
||||
visit::walk_pat(self, p);
|
||||
|
||||
@@ -128,7 +128,6 @@ pub trait LintPass {
|
||||
fn check_crate(&mut self, _: &Context, _: &ast::Crate) { }
|
||||
fn check_ident(&mut self, _: &Context, _: Span, _: ast::Ident) { }
|
||||
fn check_mod(&mut self, _: &Context, _: &ast::Mod, _: Span, _: ast::NodeId) { }
|
||||
fn check_view_item(&mut self, _: &Context, _: &ast::ViewItem) { }
|
||||
fn check_foreign_item(&mut self, _: &Context, _: &ast::ForeignItem) { }
|
||||
fn check_item(&mut self, _: &Context, _: &ast::Item) { }
|
||||
fn check_local(&mut self, _: &Context, _: &ast::Local) { }
|
||||
|
||||
@@ -40,10 +40,6 @@ pub struct CrateReader<'a> {
|
||||
}
|
||||
|
||||
impl<'a, 'v> visit::Visitor<'v> for CrateReader<'a> {
|
||||
fn visit_view_item(&mut self, a: &ast::ViewItem) {
|
||||
self.process_view_item(a);
|
||||
visit::walk_view_item(self, a);
|
||||
}
|
||||
fn visit_item(&mut self, a: &ast::Item) {
|
||||
self.process_item(a);
|
||||
visit::walk_item(self, a);
|
||||
@@ -64,9 +60,8 @@ fn dump_crates(cstore: &CStore) {
|
||||
})
|
||||
}
|
||||
|
||||
fn should_link(i: &ast::ViewItem) -> bool {
|
||||
fn should_link(i: &ast::Item) -> bool {
|
||||
!attr::contains_name(&i.attrs[], "no_link")
|
||||
|
||||
}
|
||||
|
||||
struct CrateInfo {
|
||||
@@ -181,29 +176,10 @@ fn process_crate(&self, c: &ast::Crate) {
|
||||
}
|
||||
}
|
||||
|
||||
fn process_view_item(&mut self, i: &ast::ViewItem) {
|
||||
if !should_link(i) {
|
||||
return;
|
||||
}
|
||||
|
||||
match self.extract_crate_info(i) {
|
||||
Some(info) => {
|
||||
let (cnum, _, _) = self.resolve_crate(&None,
|
||||
&info.ident[],
|
||||
&info.name[],
|
||||
None,
|
||||
i.span,
|
||||
PathKind::Crate);
|
||||
self.sess.cstore.add_extern_mod_stmt_cnum(info.id, cnum);
|
||||
}
|
||||
None => ()
|
||||
}
|
||||
}
|
||||
|
||||
fn extract_crate_info(&self, i: &ast::ViewItem) -> Option<CrateInfo> {
|
||||
fn extract_crate_info(&self, i: &ast::Item) -> Option<CrateInfo> {
|
||||
match i.node {
|
||||
ast::ViewItemExternCrate(ident, ref path_opt, id) => {
|
||||
let ident = token::get_ident(ident);
|
||||
ast::ItemExternCrate(ref path_opt) => {
|
||||
let ident = token::get_ident(i.ident);
|
||||
debug!("resolving extern crate stmt. ident: {} path_opt: {:?}",
|
||||
ident, path_opt);
|
||||
let name = match *path_opt {
|
||||
@@ -218,7 +194,7 @@ fn extract_crate_info(&self, i: &ast::ViewItem) -> Option<CrateInfo> {
|
||||
Some(CrateInfo {
|
||||
ident: ident.get().to_string(),
|
||||
name: name,
|
||||
id: id,
|
||||
id: i.id,
|
||||
should_link: should_link(i),
|
||||
})
|
||||
}
|
||||
@@ -226,8 +202,26 @@ fn extract_crate_info(&self, i: &ast::ViewItem) -> Option<CrateInfo> {
|
||||
}
|
||||
}
|
||||
|
||||
fn process_item(&self, i: &ast::Item) {
|
||||
fn process_item(&mut self, i: &ast::Item) {
|
||||
match i.node {
|
||||
ast::ItemExternCrate(_) => {
|
||||
if !should_link(i) {
|
||||
return;
|
||||
}
|
||||
|
||||
match self.extract_crate_info(i) {
|
||||
Some(info) => {
|
||||
let (cnum, _, _) = self.resolve_crate(&None,
|
||||
&info.ident[],
|
||||
&info.name[],
|
||||
None,
|
||||
i.span,
|
||||
PathKind::Crate);
|
||||
self.sess.cstore.add_extern_mod_stmt_cnum(info.id, cnum);
|
||||
}
|
||||
None => ()
|
||||
}
|
||||
}
|
||||
ast::ItemForeignMod(ref fm) => {
|
||||
if fm.abi == abi::Rust || fm.abi == abi::RustIntrinsic {
|
||||
return;
|
||||
@@ -533,7 +527,7 @@ pub fn read_plugin_metadata<'b>(&'b mut self,
|
||||
|
||||
#[derive(Copy)]
|
||||
pub enum CrateOrString<'a> {
|
||||
Krate(&'a ast::ViewItem),
|
||||
Krate(&'a ast::Item),
|
||||
Str(&'a str)
|
||||
}
|
||||
|
||||
|
||||
@@ -1456,8 +1456,8 @@ fn add_to_index(item: &ast::Item, rbml_w: &Encoder,
|
||||
rbml_w.end_tag();
|
||||
}
|
||||
}
|
||||
ast::ItemMac(..) => {
|
||||
// macros are encoded separately
|
||||
ast::ItemExternCrate(_) | ast::ItemUse(_) |ast::ItemMac(..) => {
|
||||
// these are encoded separately
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -332,8 +332,6 @@ fn fold_block(&mut self, blk: P<ast::Block>) -> P<ast::Block> {
|
||||
}
|
||||
}).collect();
|
||||
let blk_sans_items = P(ast::Block {
|
||||
view_items: Vec::new(), // I don't know if we need the view_items
|
||||
// here, but it doesn't break tests!
|
||||
stmts: stmts_sans_items,
|
||||
expr: expr,
|
||||
id: id,
|
||||
|
||||
@@ -297,6 +297,7 @@ fn propagate_node(&mut self, node: &ast_map::Node,
|
||||
// These are normal, nothing reachable about these
|
||||
// inherently and their children are already in the
|
||||
// worklist, as determined by the privacy pass
|
||||
ast::ItemExternCrate(_) | ast::ItemUse(_) |
|
||||
ast::ItemTy(..) | ast::ItemStatic(_, _, _) |
|
||||
ast::ItemMod(..) | ast::ItemForeignMod(..) |
|
||||
ast::ItemImpl(..) | ast::ItemTrait(..) |
|
||||
|
||||
@@ -94,6 +94,8 @@ fn visit_item(&mut self, item: &ast::Item) {
|
||||
// Fn lifetimes get added in visit_fn below:
|
||||
visit::walk_item(this, item);
|
||||
}
|
||||
ast::ItemExternCrate(_) |
|
||||
ast::ItemUse(_) |
|
||||
ast::ItemMod(..) |
|
||||
ast::ItemMac(..) |
|
||||
ast::ItemForeignMod(..) |
|
||||
|
||||
@@ -73,8 +73,10 @@ pub fn load_plugins(sess: &Session, krate: &ast::Crate,
|
||||
// We need to error on `#[macro_use] extern crate` when it isn't at the
|
||||
// crate root, because `$crate` won't work properly. Identify these by
|
||||
// spans, because the crate map isn't set up yet.
|
||||
for vi in krate.module.view_items.iter() {
|
||||
loader.span_whitelist.insert(vi.span);
|
||||
for item in krate.module.items.iter() {
|
||||
if let ast::ItemExternCrate(_) = item.node {
|
||||
loader.span_whitelist.insert(item.span);
|
||||
}
|
||||
}
|
||||
|
||||
visit::walk_crate(&mut loader, krate);
|
||||
@@ -91,18 +93,21 @@ pub fn load_plugins(sess: &Session, krate: &ast::Crate,
|
||||
|
||||
// note that macros aren't expanded yet, and therefore macros can't add plugins.
|
||||
impl<'a, 'v> Visitor<'v> for PluginLoader<'a> {
|
||||
fn visit_view_item(&mut self, vi: &ast::ViewItem) {
|
||||
fn visit_item(&mut self, item: &ast::Item) {
|
||||
// We're only interested in `extern crate`.
|
||||
match vi.node {
|
||||
ast::ViewItemExternCrate(..) => (),
|
||||
_ => return,
|
||||
match item.node {
|
||||
ast::ItemExternCrate(_) => {}
|
||||
_ => {
|
||||
visit::walk_item(self, item);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Parse the attributes relating to macro / plugin loading.
|
||||
let mut plugin_attr = None;
|
||||
let mut macro_selection = Some(HashSet::new()); // None => load all
|
||||
let mut reexport = HashSet::new();
|
||||
for attr in vi.attrs.iter() {
|
||||
for attr in item.attrs.iter() {
|
||||
let mut used = true;
|
||||
match attr.name().get() {
|
||||
"phase" => {
|
||||
@@ -155,7 +160,10 @@ fn visit_view_item(&mut self, vi: &ast::ViewItem) {
|
||||
}
|
||||
}
|
||||
|
||||
self.load_plugin(CrateOrString::Krate(vi), plugin_attr, macro_selection, Some(reexport))
|
||||
self.load_plugin(CrateOrString::Krate(item),
|
||||
plugin_attr,
|
||||
macro_selection,
|
||||
Some(reexport))
|
||||
}
|
||||
|
||||
fn visit_mac(&mut self, _: &ast::Mac) {
|
||||
|
||||
+37
-59
@@ -830,6 +830,38 @@ fn check_method(&mut self, span: Span, origin: &MethodOrigin,
|
||||
|
||||
impl<'a, 'tcx, 'v> Visitor<'v> for PrivacyVisitor<'a, 'tcx> {
|
||||
fn visit_item(&mut self, item: &ast::Item) {
|
||||
match item.node {
|
||||
ast::ItemUse(ref vpath) => {
|
||||
match vpath.node {
|
||||
ast::ViewPathSimple(..) | ast::ViewPathGlob(..) => {}
|
||||
ast::ViewPathList(ref prefix, ref list) => {
|
||||
for pid in list.iter() {
|
||||
match pid.node {
|
||||
ast::PathListIdent { id, name } => {
|
||||
debug!("privacy - ident item {}", id);
|
||||
let seg = ast::PathSegment {
|
||||
identifier: name,
|
||||
parameters: ast::PathParameters::none(),
|
||||
};
|
||||
let segs = vec![seg];
|
||||
let path = ast::Path {
|
||||
global: false,
|
||||
span: pid.span,
|
||||
segments: segs,
|
||||
};
|
||||
self.check_path(pid.span, id, &path);
|
||||
}
|
||||
ast::PathListMod { id } => {
|
||||
debug!("privacy - mod item {}", id);
|
||||
self.check_path(pid.span, id, prefix);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
let orig_curitem = replace(&mut self.curitem, item.id);
|
||||
visit::walk_item(self, item);
|
||||
self.curitem = orig_curitem;
|
||||
@@ -926,42 +958,6 @@ struct type?!"),
|
||||
visit::walk_expr(self, expr);
|
||||
}
|
||||
|
||||
fn visit_view_item(&mut self, a: &ast::ViewItem) {
|
||||
match a.node {
|
||||
ast::ViewItemExternCrate(..) => {}
|
||||
ast::ViewItemUse(ref vpath) => {
|
||||
match vpath.node {
|
||||
ast::ViewPathSimple(..) | ast::ViewPathGlob(..) => {}
|
||||
ast::ViewPathList(ref prefix, ref list, _) => {
|
||||
for pid in list.iter() {
|
||||
match pid.node {
|
||||
ast::PathListIdent { id, name } => {
|
||||
debug!("privacy - ident item {}", id);
|
||||
let seg = ast::PathSegment {
|
||||
identifier: name,
|
||||
parameters: ast::PathParameters::none(),
|
||||
};
|
||||
let segs = vec![seg];
|
||||
let path = ast::Path {
|
||||
global: false,
|
||||
span: pid.span,
|
||||
segments: segs,
|
||||
};
|
||||
self.check_path(pid.span, id, &path);
|
||||
}
|
||||
ast::PathListMod { id } => {
|
||||
debug!("privacy - mod item {}", id);
|
||||
self.check_path(pid.span, id, prefix);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
visit::walk_view_item(self, a);
|
||||
}
|
||||
|
||||
fn visit_pat(&mut self, pattern: &ast::Pat) {
|
||||
// Foreign functions do not have their patterns mapped in the def_map,
|
||||
// and there's nothing really relevant there anyway, so don't bother
|
||||
@@ -1069,23 +1065,6 @@ fn visit_fn(&mut self, fk: visit::FnKind<'v>, fd: &'v ast::FnDecl,
|
||||
visit::walk_fn(self, fk, fd, b, s);
|
||||
self.in_fn = orig_in_fn;
|
||||
}
|
||||
|
||||
fn visit_view_item(&mut self, i: &ast::ViewItem) {
|
||||
match i.vis {
|
||||
ast::Inherited => {}
|
||||
ast::Public => {
|
||||
if self.in_fn {
|
||||
self.tcx.sess.span_err(i.span, "unnecessary `pub`, imports \
|
||||
in functions are never \
|
||||
reachable");
|
||||
} else if let ast::ViewItemExternCrate(..) = i.node {
|
||||
self.tcx.sess.span_err(i.span, "`pub` visibility \
|
||||
is not allowed");
|
||||
}
|
||||
}
|
||||
}
|
||||
visit::walk_view_item(self, i);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> SanePrivacyVisitor<'a, 'tcx> {
|
||||
@@ -1162,7 +1141,7 @@ fn check_sane_privacy(&self, item: &ast::Item) {
|
||||
|
||||
ast::ItemConst(..) | ast::ItemStatic(..) | ast::ItemStruct(..) |
|
||||
ast::ItemFn(..) | ast::ItemMod(..) | ast::ItemTy(..) |
|
||||
ast::ItemMac(..) => {}
|
||||
ast::ItemExternCrate(_) | ast::ItemUse(_) | ast::ItemMac(..) => {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1219,6 +1198,7 @@ fn check_inherited(tcx: &ty::ctxt, sp: Span, vis: ast::Visibility) {
|
||||
}
|
||||
}
|
||||
|
||||
ast::ItemExternCrate(_) | ast::ItemUse(_) |
|
||||
ast::ItemStatic(..) | ast::ItemConst(..) |
|
||||
ast::ItemFn(..) | ast::ItemMod(..) | ast::ItemTy(..) |
|
||||
ast::ItemMac(..) => {}
|
||||
@@ -1521,11 +1501,9 @@ fn visit_struct_field(&mut self, s: &ast::StructField) {
|
||||
|
||||
|
||||
// we don't need to introspect into these at all: an
|
||||
// expression/block context can't possibly contain exported
|
||||
// things, and neither do view_items. (Making them no-ops stops us
|
||||
// from traversing the whole AST without having to be super
|
||||
// careful about our `walk_...` calls above.)
|
||||
fn visit_view_item(&mut self, _: &ast::ViewItem) {}
|
||||
// expression/block context can't possibly contain exported things.
|
||||
// (Making them no-ops stops us from traversing the whole AST without
|
||||
// having to be super careful about our `walk_...` calls above.)
|
||||
fn visit_block(&mut self, _: &ast::Block) {}
|
||||
fn visit_expr(&mut self, _: &ast::Expr) {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user