Auto merge of #48917 - petrochenkov:import, r=oli-obk
syntax: Make imports in AST closer to the source and cleanup their parsing This is a continuation of https://github.com/rust-lang/rust/pull/45846 in some sense.
This commit is contained in:
commit
5e3ecdce4e
39 changed files with 228 additions and 260 deletions
src
librustc
librustc_allocator
librustc_driver
librustc_lint
librustc_metadata
librustc_mir/build
librustc_resolve
librustc_save_analysis
librustc_typeck/check
librustdoc
libsyntax
libsyntax_ext
libsyntax_pos
test/compile-fail
|
@ -444,10 +444,10 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) {
|
||||||
visitor.visit_vis(&item.vis);
|
visitor.visit_vis(&item.vis);
|
||||||
visitor.visit_name(item.span, item.name);
|
visitor.visit_name(item.span, item.name);
|
||||||
match item.node {
|
match item.node {
|
||||||
ItemExternCrate(opt_name) => {
|
ItemExternCrate(orig_name) => {
|
||||||
visitor.visit_id(item.id);
|
visitor.visit_id(item.id);
|
||||||
if let Some(name) = opt_name {
|
if let Some(orig_name) = orig_name {
|
||||||
visitor.visit_name(item.span, name);
|
visitor.visit_name(item.span, orig_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ItemUse(ref path, _) => {
|
ItemUse(ref path, _) => {
|
||||||
|
|
|
@ -879,7 +879,7 @@ impl<'a> LoweringContext<'a> {
|
||||||
TyKind::Slice(ref ty) => hir::TySlice(self.lower_ty(ty, itctx)),
|
TyKind::Slice(ref ty) => hir::TySlice(self.lower_ty(ty, itctx)),
|
||||||
TyKind::Ptr(ref mt) => hir::TyPtr(self.lower_mt(mt, itctx)),
|
TyKind::Ptr(ref mt) => hir::TyPtr(self.lower_mt(mt, itctx)),
|
||||||
TyKind::Rptr(ref region, ref mt) => {
|
TyKind::Rptr(ref region, ref mt) => {
|
||||||
let span = t.span.with_hi(t.span.lo());
|
let span = t.span.shrink_to_lo();
|
||||||
let lifetime = match *region {
|
let lifetime = match *region {
|
||||||
Some(ref lt) => self.lower_lifetime(lt),
|
Some(ref lt) => self.lower_lifetime(lt),
|
||||||
None => self.elided_lifetime(span)
|
None => self.elided_lifetime(span)
|
||||||
|
@ -1355,17 +1355,11 @@ impl<'a> LoweringContext<'a> {
|
||||||
id: NodeId,
|
id: NodeId,
|
||||||
p: &Path,
|
p: &Path,
|
||||||
name: Option<Name>,
|
name: Option<Name>,
|
||||||
param_mode: ParamMode,
|
param_mode: ParamMode)
|
||||||
defaults_to_global: bool)
|
|
||||||
-> hir::Path {
|
-> hir::Path {
|
||||||
let mut segments = p.segments.iter();
|
|
||||||
if defaults_to_global && p.is_global() {
|
|
||||||
segments.next();
|
|
||||||
}
|
|
||||||
|
|
||||||
hir::Path {
|
hir::Path {
|
||||||
def: self.expect_full_def(id),
|
def: self.expect_full_def(id),
|
||||||
segments: segments.map(|segment| {
|
segments: p.segments.iter().map(|segment| {
|
||||||
self.lower_path_segment(p.span, segment, param_mode, 0,
|
self.lower_path_segment(p.span, segment, param_mode, 0,
|
||||||
ParenthesizedGenericArgs::Err,
|
ParenthesizedGenericArgs::Err,
|
||||||
ImplTraitContext::Disallowed)
|
ImplTraitContext::Disallowed)
|
||||||
|
@ -1378,10 +1372,9 @@ impl<'a> LoweringContext<'a> {
|
||||||
fn lower_path(&mut self,
|
fn lower_path(&mut self,
|
||||||
id: NodeId,
|
id: NodeId,
|
||||||
p: &Path,
|
p: &Path,
|
||||||
param_mode: ParamMode,
|
param_mode: ParamMode)
|
||||||
defaults_to_global: bool)
|
|
||||||
-> hir::Path {
|
-> hir::Path {
|
||||||
self.lower_path_extra(id, p, None, param_mode, defaults_to_global)
|
self.lower_path_extra(id, p, None, param_mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lower_path_segment(&mut self,
|
fn lower_path_segment(&mut self,
|
||||||
|
@ -1904,7 +1897,7 @@ impl<'a> LoweringContext<'a> {
|
||||||
i: &ItemKind)
|
i: &ItemKind)
|
||||||
-> hir::Item_ {
|
-> hir::Item_ {
|
||||||
match *i {
|
match *i {
|
||||||
ItemKind::ExternCrate(string) => hir::ItemExternCrate(string),
|
ItemKind::ExternCrate(orig_name) => hir::ItemExternCrate(orig_name),
|
||||||
ItemKind::Use(ref use_tree) => {
|
ItemKind::Use(ref use_tree) => {
|
||||||
// Start with an empty prefix
|
// Start with an empty prefix
|
||||||
let prefix = Path {
|
let prefix = Path {
|
||||||
|
@ -2047,8 +2040,8 @@ impl<'a> LoweringContext<'a> {
|
||||||
let path = &tree.prefix;
|
let path = &tree.prefix;
|
||||||
|
|
||||||
match tree.kind {
|
match tree.kind {
|
||||||
UseTreeKind::Simple(ident) => {
|
UseTreeKind::Simple(rename) => {
|
||||||
*name = ident.name;
|
*name = tree.ident().name;
|
||||||
|
|
||||||
// First apply the prefix to the path
|
// First apply the prefix to the path
|
||||||
let mut path = Path {
|
let mut path = Path {
|
||||||
|
@ -2064,12 +2057,12 @@ impl<'a> LoweringContext<'a> {
|
||||||
if path.segments.len() > 1 &&
|
if path.segments.len() > 1 &&
|
||||||
path.segments.last().unwrap().identifier.name == keywords::SelfValue.name() {
|
path.segments.last().unwrap().identifier.name == keywords::SelfValue.name() {
|
||||||
let _ = path.segments.pop();
|
let _ = path.segments.pop();
|
||||||
if ident.name == keywords::SelfValue.name() {
|
if rename.is_none() {
|
||||||
*name = path.segments.last().unwrap().identifier.name;
|
*name = path.segments.last().unwrap().identifier.name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let path = P(self.lower_path(id, &path, ParamMode::Explicit, true));
|
let path = P(self.lower_path(id, &path, ParamMode::Explicit));
|
||||||
hir::ItemUse(path, hir::UseKind::Single)
|
hir::ItemUse(path, hir::UseKind::Single)
|
||||||
}
|
}
|
||||||
UseTreeKind::Glob => {
|
UseTreeKind::Glob => {
|
||||||
|
@ -2080,7 +2073,7 @@ impl<'a> LoweringContext<'a> {
|
||||||
.cloned()
|
.cloned()
|
||||||
.collect(),
|
.collect(),
|
||||||
span: path.span,
|
span: path.span,
|
||||||
}, ParamMode::Explicit, true));
|
}, ParamMode::Explicit));
|
||||||
hir::ItemUse(path, hir::UseKind::Glob)
|
hir::ItemUse(path, hir::UseKind::Glob)
|
||||||
}
|
}
|
||||||
UseTreeKind::Nested(ref trees) => {
|
UseTreeKind::Nested(ref trees) => {
|
||||||
|
@ -2136,7 +2129,7 @@ impl<'a> LoweringContext<'a> {
|
||||||
// Privatize the degenerate import base, used only to check
|
// Privatize the degenerate import base, used only to check
|
||||||
// the stability of `use a::{};`, to avoid it showing up as
|
// the stability of `use a::{};`, to avoid it showing up as
|
||||||
// a re-export by accident when `pub`, e.g. in documentation.
|
// a re-export by accident when `pub`, e.g. in documentation.
|
||||||
let path = P(self.lower_path(id, &prefix, ParamMode::Explicit, true));
|
let path = P(self.lower_path(id, &prefix, ParamMode::Explicit));
|
||||||
*vis = hir::Inherited;
|
*vis = hir::Inherited;
|
||||||
hir::ItemUse(path, hir::UseKind::ListStem)
|
hir::ItemUse(path, hir::UseKind::ListStem)
|
||||||
}
|
}
|
||||||
|
@ -3379,7 +3372,7 @@ impl<'a> LoweringContext<'a> {
|
||||||
VisibilityKind::Crate(..) => hir::Visibility::Crate,
|
VisibilityKind::Crate(..) => hir::Visibility::Crate,
|
||||||
VisibilityKind::Restricted { ref path, id, .. } => {
|
VisibilityKind::Restricted { ref path, id, .. } => {
|
||||||
hir::Visibility::Restricted {
|
hir::Visibility::Restricted {
|
||||||
path: P(self.lower_path(id, path, ParamMode::Explicit, true)),
|
path: P(self.lower_path(id, path, ParamMode::Explicit)),
|
||||||
id: if let Some(owner) = explicit_owner {
|
id: if let Some(owner) = explicit_owner {
|
||||||
self.lower_node_id_with_owner(id, owner).node_id
|
self.lower_node_id_with_owner(id, owner).node_id
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -2011,9 +2011,9 @@ pub struct Item {
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
|
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
|
||||||
pub enum Item_ {
|
pub enum Item_ {
|
||||||
/// An `extern crate` item, with optional original crate name,
|
/// An `extern crate` item, with optional *original* crate name if the crate was renamed.
|
||||||
///
|
///
|
||||||
/// e.g. `extern crate foo` or `extern crate foo_bar as foo`
|
/// E.g. `extern crate foo` or `extern crate foo_bar as foo`
|
||||||
ItemExternCrate(Option<Name>),
|
ItemExternCrate(Option<Name>),
|
||||||
|
|
||||||
/// `use foo::bar::*;` or `use foo::bar::baz as quux;`
|
/// `use foo::bar::*;` or `use foo::bar::baz as quux;`
|
||||||
|
|
|
@ -524,15 +524,10 @@ impl<'a> State<'a> {
|
||||||
self.print_outer_attributes(&item.attrs)?;
|
self.print_outer_attributes(&item.attrs)?;
|
||||||
self.ann.pre(self, NodeItem(item))?;
|
self.ann.pre(self, NodeItem(item))?;
|
||||||
match item.node {
|
match item.node {
|
||||||
hir::ItemExternCrate(ref optional_path) => {
|
hir::ItemExternCrate(orig_name) => {
|
||||||
self.head(&visibility_qualified(&item.vis, "extern crate"))?;
|
self.head(&visibility_qualified(&item.vis, "extern crate"))?;
|
||||||
if let Some(p) = *optional_path {
|
if let Some(orig_name) = orig_name {
|
||||||
let val = p.as_str();
|
self.print_name(orig_name)?;
|
||||||
if val.contains("-") {
|
|
||||||
self.print_string(&val, ast::StrStyle::Cooked)?;
|
|
||||||
} else {
|
|
||||||
self.print_name(p)?;
|
|
||||||
}
|
|
||||||
self.s.space()?;
|
self.s.space()?;
|
||||||
self.s.word("as")?;
|
self.s.word("as")?;
|
||||||
self.s.space()?;
|
self.s.space()?;
|
||||||
|
|
|
@ -851,7 +851,7 @@ impl<'a> HashStable<StableHashingContext<'a>> for hir::Item {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl_stable_hash_for!(enum hir::Item_ {
|
impl_stable_hash_for!(enum hir::Item_ {
|
||||||
ItemExternCrate(name),
|
ItemExternCrate(orig_name),
|
||||||
ItemUse(path, use_kind),
|
ItemUse(path, use_kind),
|
||||||
ItemStatic(ty, mutability, body_id),
|
ItemStatic(ty, mutability, body_id),
|
||||||
ItemConst(ty, body_id),
|
ItemConst(ty, body_id),
|
||||||
|
|
|
@ -385,7 +385,7 @@ top_level_options!(
|
||||||
externs: Externs [UNTRACKED],
|
externs: Externs [UNTRACKED],
|
||||||
crate_name: Option<String> [TRACKED],
|
crate_name: Option<String> [TRACKED],
|
||||||
// An optional name to use as the crate for std during std injection,
|
// An optional name to use as the crate for std during std injection,
|
||||||
// written `extern crate std = "name"`. Default to "std". Used by
|
// written `extern crate name as std`. Defaults to `std`. Used by
|
||||||
// out-of-tree drivers.
|
// out-of-tree drivers.
|
||||||
alt_std_name: Option<String> [TRACKED],
|
alt_std_name: Option<String> [TRACKED],
|
||||||
// Indicates how the compiler should treat unstable features
|
// Indicates how the compiler should treat unstable features
|
||||||
|
|
|
@ -99,7 +99,7 @@ impl<'a> Folder for ExpandAllocatorDirectives<'a> {
|
||||||
f.cx.item_extern_crate(f.span, f.alloc),
|
f.cx.item_extern_crate(f.span, f.alloc),
|
||||||
f.cx.item_use_simple(
|
f.cx.item_use_simple(
|
||||||
f.span,
|
f.span,
|
||||||
respan(f.span.empty(), VisibilityKind::Inherited),
|
respan(f.span.shrink_to_lo(), VisibilityKind::Inherited),
|
||||||
super_path,
|
super_path,
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
|
@ -683,7 +683,7 @@ pub fn phase_2_configure_and_expand_inner<'a, F>(sess: &'a Session,
|
||||||
});
|
});
|
||||||
|
|
||||||
krate = time(sess, "crate injection", || {
|
krate = time(sess, "crate injection", || {
|
||||||
let alt_std_name = sess.opts.alt_std_name.clone();
|
let alt_std_name = sess.opts.alt_std_name.as_ref().map(|s| &**s);
|
||||||
syntax::std_inject::maybe_inject_crates_ref(krate, alt_std_name)
|
syntax::std_inject::maybe_inject_crates_ref(krate, alt_std_name)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1082,7 +1082,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidNoMangleItems {
|
||||||
if !cx.access_levels.is_reachable(it.id) {
|
if !cx.access_levels.is_reachable(it.id) {
|
||||||
let msg = "function is marked #[no_mangle], but not exported";
|
let msg = "function is marked #[no_mangle], but not exported";
|
||||||
let mut err = cx.struct_span_lint(PRIVATE_NO_MANGLE_FNS, it.span, msg);
|
let mut err = cx.struct_span_lint(PRIVATE_NO_MANGLE_FNS, it.span, msg);
|
||||||
let insertion_span = it.span.with_hi(it.span.lo());
|
let insertion_span = it.span.shrink_to_lo();
|
||||||
if it.vis == hir::Visibility::Inherited {
|
if it.vis == hir::Visibility::Inherited {
|
||||||
err.span_suggestion(insertion_span,
|
err.span_suggestion(insertion_span,
|
||||||
"try making it public",
|
"try making it public",
|
||||||
|
@ -1107,7 +1107,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidNoMangleItems {
|
||||||
!cx.access_levels.is_reachable(it.id) {
|
!cx.access_levels.is_reachable(it.id) {
|
||||||
let msg = "static is marked #[no_mangle], but not exported";
|
let msg = "static is marked #[no_mangle], but not exported";
|
||||||
let mut err = cx.struct_span_lint(PRIVATE_NO_MANGLE_STATICS, it.span, msg);
|
let mut err = cx.struct_span_lint(PRIVATE_NO_MANGLE_STATICS, it.span, msg);
|
||||||
let insertion_span = it.span.with_hi(it.span.lo());
|
let insertion_span = it.span.shrink_to_lo();
|
||||||
if it.vis == hir::Visibility::Inherited {
|
if it.vis == hir::Visibility::Inherited {
|
||||||
err.span_suggestion(insertion_span,
|
err.span_suggestion(insertion_span,
|
||||||
"try making it public",
|
"try making it public",
|
||||||
|
|
|
@ -377,11 +377,12 @@ impl UnusedImportBraces {
|
||||||
// Trigger the lint if the nested item is a non-self single item
|
// Trigger the lint if the nested item is a non-self single item
|
||||||
let node_ident;
|
let node_ident;
|
||||||
match items[0].0.kind {
|
match items[0].0.kind {
|
||||||
ast::UseTreeKind::Simple(ident) => {
|
ast::UseTreeKind::Simple(rename) => {
|
||||||
if ident.name == keywords::SelfValue.name() {
|
let orig_ident = items[0].0.prefix.segments.last().unwrap().identifier;
|
||||||
|
if orig_ident.name == keywords::SelfValue.name() {
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
node_ident = ident;
|
node_ident = rename.unwrap_or(orig_ident);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast::UseTreeKind::Glob => {
|
ast::UseTreeKind::Glob => {
|
||||||
|
|
|
@ -1055,12 +1055,14 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
|
||||||
|
|
||||||
fn process_item(&mut self, item: &ast::Item, definitions: &Definitions) {
|
fn process_item(&mut self, item: &ast::Item, definitions: &Definitions) {
|
||||||
match item.node {
|
match item.node {
|
||||||
ast::ItemKind::ExternCrate(rename) => {
|
ast::ItemKind::ExternCrate(orig_name) => {
|
||||||
debug!("resolving extern crate stmt. ident: {} rename: {:?}", item.ident, rename);
|
debug!("resolving extern crate stmt. ident: {} orig_name: {:?}",
|
||||||
let rename = match rename {
|
item.ident, orig_name);
|
||||||
Some(rename) => {
|
let orig_name = match orig_name {
|
||||||
validate_crate_name(Some(self.sess), &rename.as_str(), Some(item.span));
|
Some(orig_name) => {
|
||||||
rename
|
validate_crate_name(Some(self.sess), &orig_name.as_str(),
|
||||||
|
Some(item.span));
|
||||||
|
orig_name
|
||||||
}
|
}
|
||||||
None => item.ident.name,
|
None => item.ident.name,
|
||||||
};
|
};
|
||||||
|
@ -1071,7 +1073,7 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
|
||||||
};
|
};
|
||||||
|
|
||||||
let (cnum, ..) = self.resolve_crate(
|
let (cnum, ..) = self.resolve_crate(
|
||||||
&None, item.ident.name, rename, None, item.span, PathKind::Crate, dep_kind,
|
&None, item.ident.name, orig_name, None, item.span, PathKind::Crate, dep_kind,
|
||||||
);
|
);
|
||||||
|
|
||||||
let def_id = definitions.opt_local_def_id(item.id).unwrap();
|
let def_id = definitions.opt_local_def_id(item.id).unwrap();
|
||||||
|
|
|
@ -533,7 +533,7 @@ impl CrateStore for cstore::CStore {
|
||||||
tokens: body.into(),
|
tokens: body.into(),
|
||||||
legacy: def.legacy,
|
legacy: def.legacy,
|
||||||
}),
|
}),
|
||||||
vis: codemap::respan(local_span.empty(), ast::VisibilityKind::Inherited),
|
vis: codemap::respan(local_span.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||||
tokens: None,
|
tokens: None,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -422,7 +422,7 @@ fn construct_fn<'a, 'gcx, 'tcx, A>(hir: Cx<'a, 'gcx, 'tcx>,
|
||||||
builder.args_and_body(block, &arguments, arg_scope, &body.value)
|
builder.args_and_body(block, &arguments, arg_scope, &body.value)
|
||||||
}));
|
}));
|
||||||
// Attribute epilogue to function's closing brace
|
// Attribute epilogue to function's closing brace
|
||||||
let fn_end = span.with_lo(span.hi());
|
let fn_end = span.shrink_to_hi();
|
||||||
let source_info = builder.source_info(fn_end);
|
let source_info = builder.source_info(fn_end);
|
||||||
let return_block = builder.return_block();
|
let return_block = builder.return_block();
|
||||||
builder.cfg.terminate(block, source_info,
|
builder.cfg.terminate(block, source_info,
|
||||||
|
|
|
@ -119,7 +119,8 @@ impl<'a> Resolver<'a> {
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
match use_tree.kind {
|
match use_tree.kind {
|
||||||
ast::UseTreeKind::Simple(mut ident) => {
|
ast::UseTreeKind::Simple(rename) => {
|
||||||
|
let mut ident = use_tree.ident();
|
||||||
let mut source = module_path.pop().unwrap().node;
|
let mut source = module_path.pop().unwrap().node;
|
||||||
let mut type_ns_only = false;
|
let mut type_ns_only = false;
|
||||||
|
|
||||||
|
@ -142,7 +143,7 @@ impl<'a> Resolver<'a> {
|
||||||
// Replace `use foo::self;` with `use foo;`
|
// Replace `use foo::self;` with `use foo;`
|
||||||
let _ = module_path.pop();
|
let _ = module_path.pop();
|
||||||
source = last_segment.node;
|
source = last_segment.node;
|
||||||
if ident.name == keywords::SelfValue.name() {
|
if rename.is_none() {
|
||||||
ident = last_segment.node;
|
ident = last_segment.node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -162,7 +163,7 @@ impl<'a> Resolver<'a> {
|
||||||
ModuleKind::Block(..) => unreachable!(),
|
ModuleKind::Block(..) => unreachable!(),
|
||||||
};
|
};
|
||||||
source.name = crate_name;
|
source.name = crate_name;
|
||||||
if ident.name == keywords::DollarCrate.name() {
|
if rename.is_none() {
|
||||||
ident.name = crate_name;
|
ident.name = crate_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,8 +207,8 @@ impl<'a> Resolver<'a> {
|
||||||
|
|
||||||
// Ensure there is at most one `self` in the list
|
// Ensure there is at most one `self` in the list
|
||||||
let self_spans = items.iter().filter_map(|&(ref use_tree, _)| {
|
let self_spans = items.iter().filter_map(|&(ref use_tree, _)| {
|
||||||
if let ast::UseTreeKind::Simple(ident) = use_tree.kind {
|
if let ast::UseTreeKind::Simple(..) = use_tree.kind {
|
||||||
if ident.name == keywords::SelfValue.name() {
|
if use_tree.ident().name == keywords::SelfValue.name() {
|
||||||
return Some(use_tree.span);
|
return Some(use_tree.span);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -244,9 +245,9 @@ impl<'a> Resolver<'a> {
|
||||||
|
|
||||||
match item.node {
|
match item.node {
|
||||||
ItemKind::Use(ref use_tree) => {
|
ItemKind::Use(ref use_tree) => {
|
||||||
// Just an empty prefix to start out
|
// Imports are resolved as global by default, add starting root segment.
|
||||||
let prefix = ast::Path {
|
let prefix = ast::Path {
|
||||||
segments: vec![],
|
segments: use_tree.prefix.make_root().into_iter().collect(),
|
||||||
span: use_tree.span,
|
span: use_tree.span,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -255,7 +256,7 @@ impl<'a> Resolver<'a> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemKind::ExternCrate(as_name) => {
|
ItemKind::ExternCrate(orig_name) => {
|
||||||
self.crate_loader.process_item(item, &self.definitions);
|
self.crate_loader.process_item(item, &self.definitions);
|
||||||
|
|
||||||
// n.b. we don't need to look at the path option here, because cstore already did
|
// n.b. we don't need to look at the path option here, because cstore already did
|
||||||
|
@ -274,7 +275,7 @@ impl<'a> Resolver<'a> {
|
||||||
id: item.id,
|
id: item.id,
|
||||||
parent,
|
parent,
|
||||||
imported_module: Cell::new(Some(module)),
|
imported_module: Cell::new(Some(module)),
|
||||||
subclass: ImportDirectiveSubclass::ExternCrate(as_name),
|
subclass: ImportDirectiveSubclass::ExternCrate(orig_name),
|
||||||
span: item.span,
|
span: item.span,
|
||||||
module_path: Vec::new(),
|
module_path: Vec::new(),
|
||||||
vis: Cell::new(vis),
|
vis: Cell::new(vis),
|
||||||
|
|
|
@ -756,7 +756,7 @@ impl<'tcx> Visitor<'tcx> for UsePlacementFinder {
|
||||||
// don't suggest placing a use before the prelude
|
// don't suggest placing a use before the prelude
|
||||||
// import or other generated ones
|
// import or other generated ones
|
||||||
if item.span.ctxt().outer().expn_info().is_none() {
|
if item.span.ctxt().outer().expn_info().is_none() {
|
||||||
self.span = Some(item.span.with_hi(item.span.lo()));
|
self.span = Some(item.span.shrink_to_lo());
|
||||||
self.found_use = true;
|
self.found_use = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -768,12 +768,12 @@ impl<'tcx> Visitor<'tcx> for UsePlacementFinder {
|
||||||
if item.span.ctxt().outer().expn_info().is_none() {
|
if item.span.ctxt().outer().expn_info().is_none() {
|
||||||
// don't insert between attributes and an item
|
// don't insert between attributes and an item
|
||||||
if item.attrs.is_empty() {
|
if item.attrs.is_empty() {
|
||||||
self.span = Some(item.span.with_hi(item.span.lo()));
|
self.span = Some(item.span.shrink_to_lo());
|
||||||
} else {
|
} else {
|
||||||
// find the first attribute on the item
|
// find the first attribute on the item
|
||||||
for attr in &item.attrs {
|
for attr in &item.attrs {
|
||||||
if self.span.map_or(true, |span| attr.span < span) {
|
if self.span.map_or(true, |span| attr.span < span) {
|
||||||
self.span = Some(attr.span.with_hi(attr.span.lo()));
|
self.span = Some(attr.span.shrink_to_lo());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2164,8 +2164,9 @@ impl<'a> Resolver<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemKind::Use(ref use_tree) => {
|
ItemKind::Use(ref use_tree) => {
|
||||||
|
// Imports are resolved as global by default, add starting root segment.
|
||||||
let path = Path {
|
let path = Path {
|
||||||
segments: vec![],
|
segments: use_tree.prefix.make_root().into_iter().collect(),
|
||||||
span: use_tree.span,
|
span: use_tree.span,
|
||||||
};
|
};
|
||||||
self.resolve_use_tree(item.id, use_tree, &path);
|
self.resolve_use_tree(item.id, use_tree, &path);
|
||||||
|
@ -2300,7 +2301,6 @@ impl<'a> Resolver<'a> {
|
||||||
None,
|
None,
|
||||||
&path,
|
&path,
|
||||||
trait_ref.path.span,
|
trait_ref.path.span,
|
||||||
trait_ref.path.segments.last().unwrap().span,
|
|
||||||
PathSource::Trait(AliasPossibility::No)
|
PathSource::Trait(AliasPossibility::No)
|
||||||
).base_def();
|
).base_def();
|
||||||
if def != Def::Err {
|
if def != Def::Err {
|
||||||
|
@ -2731,8 +2731,7 @@ impl<'a> Resolver<'a> {
|
||||||
let segments = &path.segments.iter()
|
let segments = &path.segments.iter()
|
||||||
.map(|seg| respan(seg.span, seg.identifier))
|
.map(|seg| respan(seg.span, seg.identifier))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
let ident_span = path.segments.last().map_or(path.span, |seg| seg.span);
|
self.smart_resolve_path_fragment(id, qself, segments, path.span, source)
|
||||||
self.smart_resolve_path_fragment(id, qself, segments, path.span, ident_span, source)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn smart_resolve_path_fragment(&mut self,
|
fn smart_resolve_path_fragment(&mut self,
|
||||||
|
@ -2740,9 +2739,9 @@ impl<'a> Resolver<'a> {
|
||||||
qself: Option<&QSelf>,
|
qself: Option<&QSelf>,
|
||||||
path: &[SpannedIdent],
|
path: &[SpannedIdent],
|
||||||
span: Span,
|
span: Span,
|
||||||
ident_span: Span,
|
|
||||||
source: PathSource)
|
source: PathSource)
|
||||||
-> PathResolution {
|
-> PathResolution {
|
||||||
|
let ident_span = path.last().map_or(span, |ident| ident.span);
|
||||||
let ns = source.namespace();
|
let ns = source.namespace();
|
||||||
let is_expected = &|def| source.is_expected(def);
|
let is_expected = &|def| source.is_expected(def);
|
||||||
let is_enum_variant = &|def| if let Def::Variant(..) = def { true } else { false };
|
let is_enum_variant = &|def| if let Def::Variant(..) = def { true } else { false };
|
||||||
|
@ -3090,7 +3089,7 @@ impl<'a> Resolver<'a> {
|
||||||
// Make sure `A::B` in `<T as A>::B::C` is a trait item.
|
// Make sure `A::B` in `<T as A>::B::C` is a trait item.
|
||||||
let ns = if qself.position + 1 == path.len() { ns } else { TypeNS };
|
let ns = if qself.position + 1 == path.len() { ns } else { TypeNS };
|
||||||
let res = self.smart_resolve_path_fragment(id, None, &path[..qself.position + 1],
|
let res = self.smart_resolve_path_fragment(id, None, &path[..qself.position + 1],
|
||||||
span, span, PathSource::TraitItem(ns));
|
span, PathSource::TraitItem(ns));
|
||||||
return Some(PathResolution::with_unresolved_segments(
|
return Some(PathResolution::with_unresolved_segments(
|
||||||
res.base_def(), res.unresolved_segments() + path.len() - qself.position - 1
|
res.base_def(), res.unresolved_segments() + path.len() - qself.position - 1
|
||||||
));
|
));
|
||||||
|
@ -3941,8 +3940,12 @@ impl<'a> Resolver<'a> {
|
||||||
ty::Visibility::Restricted(self.current_module.normal_ancestor_id)
|
ty::Visibility::Restricted(self.current_module.normal_ancestor_id)
|
||||||
}
|
}
|
||||||
ast::VisibilityKind::Restricted { ref path, id, .. } => {
|
ast::VisibilityKind::Restricted { ref path, id, .. } => {
|
||||||
let def = self.smart_resolve_path(id, None, path,
|
// Visibilities are resolved as global by default, add starting root segment.
|
||||||
PathSource::Visibility).base_def();
|
let segments = path.make_root().iter().chain(path.segments.iter())
|
||||||
|
.map(|seg| respan(seg.span, seg.identifier))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
let def = self.smart_resolve_path_fragment(id, None, &segments, path.span,
|
||||||
|
PathSource::Visibility).base_def();
|
||||||
if def == Def::Err {
|
if def == Def::Err {
|
||||||
ty::Visibility::Public
|
ty::Visibility::Public
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -667,11 +667,10 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> {
|
||||||
}
|
}
|
||||||
PathResult::Failed(span, msg, true) => {
|
PathResult::Failed(span, msg, true) => {
|
||||||
let (mut self_path, mut self_result) = (module_path.clone(), None);
|
let (mut self_path, mut self_result) = (module_path.clone(), None);
|
||||||
if !self_path.is_empty() &&
|
let is_special = |ident| token::Ident(ident).is_path_segment_keyword() &&
|
||||||
!token::Ident(self_path[0].node).is_path_segment_keyword() &&
|
ident.name != keywords::CrateRoot.name();
|
||||||
!(self_path.len() > 1 &&
|
if !self_path.is_empty() && !is_special(self_path[0].node) &&
|
||||||
token::Ident(self_path[1].node).is_path_segment_keyword())
|
!(self_path.len() > 1 && is_special(self_path[1].node)) {
|
||||||
{
|
|
||||||
self_path[0].node.name = keywords::SelfValue.name();
|
self_path[0].node.name = keywords::SelfValue.name();
|
||||||
self_result = Some(self.resolve_path(&self_path, None, false, span));
|
self_result = Some(self.resolve_path(&self_path, None, false, span));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1209,7 +1209,7 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
|
||||||
|
|
||||||
fn process_trait_item(&mut self, trait_item: &'l ast::TraitItem, trait_id: DefId) {
|
fn process_trait_item(&mut self, trait_item: &'l ast::TraitItem, trait_id: DefId) {
|
||||||
self.process_macro_use(trait_item.span);
|
self.process_macro_use(trait_item.span);
|
||||||
let vis_span = trait_item.span.empty();
|
let vis_span = trait_item.span.shrink_to_lo();
|
||||||
match trait_item.node {
|
match trait_item.node {
|
||||||
ast::TraitItemKind::Const(ref ty, ref expr) => {
|
ast::TraitItemKind::Const(ref ty, ref expr) => {
|
||||||
self.process_assoc_const(
|
self.process_assoc_const(
|
||||||
|
@ -1342,7 +1342,8 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
|
||||||
.map(::id_from_def_id);
|
.map(::id_from_def_id);
|
||||||
|
|
||||||
match use_tree.kind {
|
match use_tree.kind {
|
||||||
ast::UseTreeKind::Simple(ident) => {
|
ast::UseTreeKind::Simple(..) => {
|
||||||
|
let ident = use_tree.ident();
|
||||||
let path = ast::Path {
|
let path = ast::Path {
|
||||||
segments: prefix.segments
|
segments: prefix.segments
|
||||||
.iter()
|
.iter()
|
||||||
|
|
|
@ -767,7 +767,7 @@ impl<'a, 'tcx, 'gcx> hir::intravisit::Visitor<'tcx> for UsePlacementFinder<'a, '
|
||||||
// don't suggest placing a use before the prelude
|
// don't suggest placing a use before the prelude
|
||||||
// import or other generated ones
|
// import or other generated ones
|
||||||
if item.span.ctxt().outer().expn_info().is_none() {
|
if item.span.ctxt().outer().expn_info().is_none() {
|
||||||
self.span = Some(item.span.with_hi(item.span.lo()));
|
self.span = Some(item.span.shrink_to_lo());
|
||||||
self.found_use = true;
|
self.found_use = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -779,12 +779,12 @@ impl<'a, 'tcx, 'gcx> hir::intravisit::Visitor<'tcx> for UsePlacementFinder<'a, '
|
||||||
if item.span.ctxt().outer().expn_info().is_none() {
|
if item.span.ctxt().outer().expn_info().is_none() {
|
||||||
// don't insert between attributes and an item
|
// don't insert between attributes and an item
|
||||||
if item.attrs.is_empty() {
|
if item.attrs.is_empty() {
|
||||||
self.span = Some(item.span.with_hi(item.span.lo()));
|
self.span = Some(item.span.shrink_to_lo());
|
||||||
} else {
|
} else {
|
||||||
// find the first attribute on the item
|
// find the first attribute on the item
|
||||||
for attr in &item.attrs {
|
for attr in &item.attrs {
|
||||||
if self.span.map_or(true, |span| attr.span < span) {
|
if self.span.map_or(true, |span| attr.span < span) {
|
||||||
self.span = Some(attr.span.with_hi(attr.span.lo()));
|
self.span = Some(attr.span.shrink_to_lo());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2520,7 +2520,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||||
if sugg_unit {
|
if sugg_unit {
|
||||||
let sugg_span = sess.codemap().end_point(expr_sp);
|
let sugg_span = sess.codemap().end_point(expr_sp);
|
||||||
// remove closing `)` from the span
|
// remove closing `)` from the span
|
||||||
let sugg_span = sugg_span.with_hi(sugg_span.lo());
|
let sugg_span = sugg_span.shrink_to_lo();
|
||||||
err.span_suggestion(
|
err.span_suggestion(
|
||||||
sugg_span,
|
sugg_span,
|
||||||
"expected the unit value `()`; create it with empty parentheses",
|
"expected the unit value `()`; create it with empty parentheses",
|
||||||
|
|
|
@ -406,13 +406,13 @@ impl<'a, 'tcx, 'rcx> RustdocVisitor<'a, 'tcx, 'rcx> {
|
||||||
// If we're inlining, skip private items.
|
// If we're inlining, skip private items.
|
||||||
_ if self.inlining && item.vis != hir::Public => {}
|
_ if self.inlining && item.vis != hir::Public => {}
|
||||||
hir::ItemGlobalAsm(..) => {}
|
hir::ItemGlobalAsm(..) => {}
|
||||||
hir::ItemExternCrate(ref p) => {
|
hir::ItemExternCrate(orig_name) => {
|
||||||
let def_id = self.cx.tcx.hir.local_def_id(item.id);
|
let def_id = self.cx.tcx.hir.local_def_id(item.id);
|
||||||
om.extern_crates.push(ExternCrate {
|
om.extern_crates.push(ExternCrate {
|
||||||
cnum: self.cx.tcx.extern_mod_stmt_cnum(def_id)
|
cnum: self.cx.tcx.extern_mod_stmt_cnum(def_id)
|
||||||
.unwrap_or(LOCAL_CRATE),
|
.unwrap_or(LOCAL_CRATE),
|
||||||
name,
|
name,
|
||||||
path: p.map(|x|x.to_string()),
|
path: orig_name.map(|x|x.to_string()),
|
||||||
vis: item.vis.clone(),
|
vis: item.vis.clone(),
|
||||||
attrs: item.attrs.clone(),
|
attrs: item.attrs.clone(),
|
||||||
whence: item.span,
|
whence: item.span,
|
||||||
|
|
|
@ -108,17 +108,16 @@ impl Path {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add starting "crate root" segment to all paths except those that
|
// Make a "crate root" segment for this path unless it already has it
|
||||||
// already have it or start with `self`, `super`, `Self` or `$crate`.
|
// or starts with something like `self`/`super`/`$crate`/etc.
|
||||||
pub fn default_to_global(mut self) -> Path {
|
pub fn make_root(&self) -> Option<PathSegment> {
|
||||||
if !self.is_global() {
|
if let Some(ident) = self.segments.get(0).map(|seg| seg.identifier) {
|
||||||
let ident = self.segments[0].identifier;
|
if ::parse::token::Ident(ident).is_path_segment_keyword() &&
|
||||||
if !::parse::token::Ident(ident).is_path_segment_keyword() ||
|
ident.name != keywords::Crate.name() {
|
||||||
ident.name == keywords::Crate.name() {
|
return None;
|
||||||
self.segments.insert(0, PathSegment::crate_root(self.span));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self
|
Some(PathSegment::crate_root(self.span.shrink_to_lo()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_global(&self) -> bool {
|
pub fn is_global(&self) -> bool {
|
||||||
|
@ -1878,20 +1877,37 @@ pub struct Variant_ {
|
||||||
|
|
||||||
pub type Variant = Spanned<Variant_>;
|
pub type Variant = Spanned<Variant_>;
|
||||||
|
|
||||||
|
/// Part of `use` item to the right of its prefix.
|
||||||
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
|
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
|
||||||
pub enum UseTreeKind {
|
pub enum UseTreeKind {
|
||||||
Simple(Ident),
|
/// `use prefix` or `use prefix as rename`
|
||||||
Glob,
|
Simple(Option<Ident>),
|
||||||
|
/// `use prefix::{...}`
|
||||||
Nested(Vec<(UseTree, NodeId)>),
|
Nested(Vec<(UseTree, NodeId)>),
|
||||||
|
/// `use prefix::*`
|
||||||
|
Glob,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A tree of paths sharing common prefixes.
|
||||||
|
/// Used in `use` items both at top-level and inside of braces in import groups.
|
||||||
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
|
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
|
||||||
pub struct UseTree {
|
pub struct UseTree {
|
||||||
pub kind: UseTreeKind,
|
|
||||||
pub prefix: Path,
|
pub prefix: Path,
|
||||||
|
pub kind: UseTreeKind,
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl UseTree {
|
||||||
|
pub fn ident(&self) -> Ident {
|
||||||
|
match self.kind {
|
||||||
|
UseTreeKind::Simple(Some(rename)) => rename,
|
||||||
|
UseTreeKind::Simple(None) =>
|
||||||
|
self.prefix.segments.last().expect("empty prefix in a simple import").identifier,
|
||||||
|
_ => panic!("`UseTree::ident` can only be used on a simple import"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Distinguishes between Attributes that decorate items and Attributes that
|
/// Distinguishes between Attributes that decorate items and Attributes that
|
||||||
/// are contained as statements within items. These two cases need to be
|
/// are contained as statements within items. These two cases need to be
|
||||||
/// distinguished for pretty-printing.
|
/// distinguished for pretty-printing.
|
||||||
|
@ -2055,7 +2071,7 @@ pub struct Item {
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
|
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
|
||||||
pub enum ItemKind {
|
pub enum ItemKind {
|
||||||
/// An `extern crate` item, with optional original crate name.
|
/// An `extern crate` item, with optional *original* crate name if the crate was renamed.
|
||||||
///
|
///
|
||||||
/// E.g. `extern crate foo` or `extern crate foo_bar as foo`
|
/// E.g. `extern crate foo` or `extern crate foo_bar as foo`
|
||||||
ExternCrate(Option<Name>),
|
ExternCrate(Option<Name>),
|
||||||
|
|
|
@ -220,7 +220,7 @@ pub fn expand_build_diagnostic_array<'cx>(ecx: &'cx mut ExtCtxt,
|
||||||
ty,
|
ty,
|
||||||
expr,
|
expr,
|
||||||
),
|
),
|
||||||
vis: codemap::respan(span.empty(), ast::VisibilityKind::Public),
|
vis: codemap::respan(span.shrink_to_lo(), ast::VisibilityKind::Public),
|
||||||
span,
|
span,
|
||||||
tokens: None,
|
tokens: None,
|
||||||
})
|
})
|
||||||
|
|
|
@ -294,7 +294,7 @@ pub trait AstBuilder {
|
||||||
vis: ast::Visibility, vp: P<ast::UseTree>) -> P<ast::Item>;
|
vis: ast::Visibility, vp: P<ast::UseTree>) -> P<ast::Item>;
|
||||||
fn item_use_simple(&self, sp: Span, vis: ast::Visibility, path: ast::Path) -> P<ast::Item>;
|
fn item_use_simple(&self, sp: Span, vis: ast::Visibility, path: ast::Path) -> P<ast::Item>;
|
||||||
fn item_use_simple_(&self, sp: Span, vis: ast::Visibility,
|
fn item_use_simple_(&self, sp: Span, vis: ast::Visibility,
|
||||||
ident: ast::Ident, path: ast::Path) -> P<ast::Item>;
|
ident: Option<ast::Ident>, path: ast::Path) -> P<ast::Item>;
|
||||||
fn item_use_list(&self, sp: Span, vis: ast::Visibility,
|
fn item_use_list(&self, sp: Span, vis: ast::Visibility,
|
||||||
path: Vec<ast::Ident>, imports: &[ast::Ident]) -> P<ast::Item>;
|
path: Vec<ast::Ident>, imports: &[ast::Ident]) -> P<ast::Item>;
|
||||||
fn item_use_glob(&self, sp: Span,
|
fn item_use_glob(&self, sp: Span,
|
||||||
|
@ -329,9 +329,13 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
segments.push(ast::PathSegment { identifier: last_identifier, span, parameters });
|
segments.push(ast::PathSegment { identifier: last_identifier, span, parameters });
|
||||||
let path = ast::Path { span, segments };
|
let mut path = ast::Path { span, segments };
|
||||||
|
if global {
|
||||||
if global { path.default_to_global() } else { path }
|
if let Some(seg) = path.make_root() {
|
||||||
|
path.segments.insert(0, seg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
path
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Constructs a qualified path.
|
/// Constructs a qualified path.
|
||||||
|
@ -983,7 +987,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
|
||||||
attrs,
|
attrs,
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
node,
|
node,
|
||||||
vis: respan(span.empty(), ast::VisibilityKind::Inherited),
|
vis: respan(span.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||||
span,
|
span,
|
||||||
tokens: None,
|
tokens: None,
|
||||||
})
|
})
|
||||||
|
@ -1029,7 +1033,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
|
||||||
span: ty.span,
|
span: ty.span,
|
||||||
ty,
|
ty,
|
||||||
ident: None,
|
ident: None,
|
||||||
vis: respan(span.empty(), ast::VisibilityKind::Inherited),
|
vis: respan(span.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||||
attrs: Vec::new(),
|
attrs: Vec::new(),
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
}
|
}
|
||||||
|
@ -1159,16 +1163,15 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn item_use_simple(&self, sp: Span, vis: ast::Visibility, path: ast::Path) -> P<ast::Item> {
|
fn item_use_simple(&self, sp: Span, vis: ast::Visibility, path: ast::Path) -> P<ast::Item> {
|
||||||
let last = path.segments.last().unwrap().identifier;
|
self.item_use_simple_(sp, vis, None, path)
|
||||||
self.item_use_simple_(sp, vis, last, path)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn item_use_simple_(&self, sp: Span, vis: ast::Visibility,
|
fn item_use_simple_(&self, sp: Span, vis: ast::Visibility,
|
||||||
ident: ast::Ident, path: ast::Path) -> P<ast::Item> {
|
rename: Option<ast::Ident>, path: ast::Path) -> P<ast::Item> {
|
||||||
self.item_use(sp, vis, P(ast::UseTree {
|
self.item_use(sp, vis, P(ast::UseTree {
|
||||||
span: sp,
|
span: sp,
|
||||||
prefix: path,
|
prefix: path,
|
||||||
kind: ast::UseTreeKind::Simple(ident),
|
kind: ast::UseTreeKind::Simple(rename),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1178,7 +1181,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
|
||||||
(ast::UseTree {
|
(ast::UseTree {
|
||||||
span: sp,
|
span: sp,
|
||||||
prefix: self.path(sp, vec![*id]),
|
prefix: self.path(sp, vec![*id]),
|
||||||
kind: ast::UseTreeKind::Simple(*id),
|
kind: ast::UseTreeKind::Simple(None),
|
||||||
}, ast::DUMMY_NODE_ID)
|
}, ast::DUMMY_NODE_ID)
|
||||||
}).collect();
|
}).collect();
|
||||||
|
|
||||||
|
|
|
@ -239,7 +239,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
||||||
node: ast::ItemKind::Mod(krate.module),
|
node: ast::ItemKind::Mod(krate.module),
|
||||||
ident: keywords::Invalid.ident(),
|
ident: keywords::Invalid.ident(),
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
vis: respan(krate.span.empty(), ast::VisibilityKind::Public),
|
vis: respan(krate.span.shrink_to_lo(), ast::VisibilityKind::Public),
|
||||||
tokens: None,
|
tokens: None,
|
||||||
})));
|
})));
|
||||||
|
|
||||||
|
|
|
@ -857,7 +857,7 @@ fn expand_wrapper(cx: &ExtCtxt,
|
||||||
let path = path.iter().map(|s| s.to_string()).collect();
|
let path = path.iter().map(|s| s.to_string()).collect();
|
||||||
let use_item = cx.item_use_glob(
|
let use_item = cx.item_use_glob(
|
||||||
sp,
|
sp,
|
||||||
respan(sp.empty(), ast::VisibilityKind::Inherited),
|
respan(sp.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||||
ids_ext(path),
|
ids_ext(path),
|
||||||
);
|
);
|
||||||
cx.stmt_item(sp, use_item)
|
cx.stmt_item(sp, use_item)
|
||||||
|
|
|
@ -1438,7 +1438,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_use_tree(&mut self, use_tree: &'a ast::UseTree, id: NodeId, _nested: bool) {
|
fn visit_use_tree(&mut self, use_tree: &'a ast::UseTree, id: NodeId, _nested: bool) {
|
||||||
if let ast::UseTreeKind::Simple(ident) = use_tree.kind {
|
if let ast::UseTreeKind::Simple(Some(ident)) = use_tree.kind {
|
||||||
if ident.name == "_" {
|
if ident.name == "_" {
|
||||||
gate_feature_post!(&self, underscore_imports, use_tree.span,
|
gate_feature_post!(&self, underscore_imports, use_tree.span,
|
||||||
"renaming imports with `_` is unstable");
|
"renaming imports with `_` is unstable");
|
||||||
|
|
|
@ -323,7 +323,8 @@ pub fn noop_fold_use_tree<T: Folder>(use_tree: UseTree, fld: &mut T) -> UseTree
|
||||||
span: fld.new_span(use_tree.span),
|
span: fld.new_span(use_tree.span),
|
||||||
prefix: fld.fold_path(use_tree.prefix),
|
prefix: fld.fold_path(use_tree.prefix),
|
||||||
kind: match use_tree.kind {
|
kind: match use_tree.kind {
|
||||||
UseTreeKind::Simple(ident) => UseTreeKind::Simple(fld.fold_ident(ident)),
|
UseTreeKind::Simple(rename) =>
|
||||||
|
UseTreeKind::Simple(rename.map(|ident| fld.fold_ident(ident))),
|
||||||
UseTreeKind::Glob => UseTreeKind::Glob,
|
UseTreeKind::Glob => UseTreeKind::Glob,
|
||||||
UseTreeKind::Nested(items) => UseTreeKind::Nested(items.move_map(|(tree, id)| {
|
UseTreeKind::Nested(items) => UseTreeKind::Nested(items.move_map(|(tree, id)| {
|
||||||
(fld.fold_use_tree(tree), fld.new_id(id))
|
(fld.fold_use_tree(tree), fld.new_id(id))
|
||||||
|
@ -886,7 +887,7 @@ pub fn noop_fold_block<T: Folder>(b: P<Block>, folder: &mut T) -> P<Block> {
|
||||||
|
|
||||||
pub fn noop_fold_item_kind<T: Folder>(i: ItemKind, folder: &mut T) -> ItemKind {
|
pub fn noop_fold_item_kind<T: Folder>(i: ItemKind, folder: &mut T) -> ItemKind {
|
||||||
match i {
|
match i {
|
||||||
ItemKind::ExternCrate(string) => ItemKind::ExternCrate(string),
|
ItemKind::ExternCrate(orig_name) => ItemKind::ExternCrate(orig_name),
|
||||||
ItemKind::Use(use_tree) => {
|
ItemKind::Use(use_tree) => {
|
||||||
ItemKind::Use(use_tree.map(|tree| folder.fold_use_tree(tree)))
|
ItemKind::Use(use_tree.map(|tree| folder.fold_use_tree(tree)))
|
||||||
}
|
}
|
||||||
|
@ -1018,7 +1019,7 @@ pub fn noop_fold_crate<T: Folder>(Crate {module, attrs, span}: Crate,
|
||||||
ident: keywords::Invalid.ident(),
|
ident: keywords::Invalid.ident(),
|
||||||
attrs,
|
attrs,
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
vis: respan(span.empty(), ast::VisibilityKind::Public),
|
vis: respan(span.shrink_to_lo(), ast::VisibilityKind::Public),
|
||||||
span,
|
span,
|
||||||
node: ast::ItemKind::Mod(module),
|
node: ast::ItemKind::Mod(module),
|
||||||
tokens: None,
|
tokens: None,
|
||||||
|
|
|
@ -214,7 +214,7 @@ impl<'a> StringReader<'a> {
|
||||||
|
|
||||||
// Make the range zero-length if the span is invalid.
|
// Make the range zero-length if the span is invalid.
|
||||||
if span.lo() > span.hi() || begin.fm.start_pos != end.fm.start_pos {
|
if span.lo() > span.hi() || begin.fm.start_pos != end.fm.start_pos {
|
||||||
span = span.with_hi(span.lo());
|
span = span.shrink_to_lo();
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut sr = StringReader::new_raw_internal(sess, begin.fm);
|
let mut sr = StringReader::new_raw_internal(sess, begin.fm);
|
||||||
|
|
|
@ -713,7 +713,7 @@ mod tests {
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
node: ast::ExprKind::Path(None, ast::Path {
|
node: ast::ExprKind::Path(None, ast::Path {
|
||||||
span: sp(0, 6),
|
span: sp(0, 6),
|
||||||
segments: vec![ast::PathSegment::crate_root(sp(0, 2)),
|
segments: vec![ast::PathSegment::crate_root(sp(0, 0)),
|
||||||
str2seg("a", 2, 3),
|
str2seg("a", 2, 3),
|
||||||
str2seg("b", 5, 6)]
|
str2seg("b", 5, 6)]
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -1508,7 +1508,7 @@ impl<'a> Parser<'a> {
|
||||||
if self.eat(&token::RArrow) {
|
if self.eat(&token::RArrow) {
|
||||||
Ok(FunctionRetTy::Ty(self.parse_ty_common(allow_plus, true)?))
|
Ok(FunctionRetTy::Ty(self.parse_ty_common(allow_plus, true)?))
|
||||||
} else {
|
} else {
|
||||||
Ok(FunctionRetTy::Default(self.span.with_hi(self.span.lo())))
|
Ok(FunctionRetTy::Default(self.span.shrink_to_lo()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1986,7 +1986,7 @@ impl<'a> Parser<'a> {
|
||||||
let lo = self.meta_var_span.unwrap_or(self.span);
|
let lo = self.meta_var_span.unwrap_or(self.span);
|
||||||
let mut segments = Vec::new();
|
let mut segments = Vec::new();
|
||||||
if self.eat(&token::ModSep) {
|
if self.eat(&token::ModSep) {
|
||||||
segments.push(PathSegment::crate_root(lo));
|
segments.push(PathSegment::crate_root(lo.shrink_to_lo()));
|
||||||
}
|
}
|
||||||
self.parse_path_segments(&mut segments, style, enable_warning)?;
|
self.parse_path_segments(&mut segments, style, enable_warning)?;
|
||||||
|
|
||||||
|
@ -2021,7 +2021,7 @@ impl<'a> Parser<'a> {
|
||||||
loop {
|
loop {
|
||||||
segments.push(self.parse_path_segment(style, enable_warning)?);
|
segments.push(self.parse_path_segment(style, enable_warning)?);
|
||||||
|
|
||||||
if self.is_import_coupler(false) || !self.eat(&token::ModSep) {
|
if self.is_import_coupler() || !self.eat(&token::ModSep) {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5863,7 +5863,7 @@ impl<'a> Parser<'a> {
|
||||||
// `pub(in path)`
|
// `pub(in path)`
|
||||||
self.bump(); // `(`
|
self.bump(); // `(`
|
||||||
self.bump(); // `in`
|
self.bump(); // `in`
|
||||||
let path = self.parse_path(PathStyle::Mod)?.default_to_global(); // `path`
|
let path = self.parse_path(PathStyle::Mod)?; // `path`
|
||||||
self.expect(&token::CloseDelim(token::Paren))?; // `)`
|
self.expect(&token::CloseDelim(token::Paren))?; // `)`
|
||||||
let vis = respan(lo.to(self.prev_span), VisibilityKind::Restricted {
|
let vis = respan(lo.to(self.prev_span), VisibilityKind::Restricted {
|
||||||
path: P(path),
|
path: P(path),
|
||||||
|
@ -5876,7 +5876,7 @@ impl<'a> Parser<'a> {
|
||||||
{
|
{
|
||||||
// `pub(self)` or `pub(super)`
|
// `pub(self)` or `pub(super)`
|
||||||
self.bump(); // `(`
|
self.bump(); // `(`
|
||||||
let path = self.parse_path(PathStyle::Mod)?.default_to_global(); // `super`/`self`
|
let path = self.parse_path(PathStyle::Mod)?; // `super`/`self`
|
||||||
self.expect(&token::CloseDelim(token::Paren))?; // `)`
|
self.expect(&token::CloseDelim(token::Paren))?; // `)`
|
||||||
let vis = respan(lo.to(self.prev_span), VisibilityKind::Restricted {
|
let vis = respan(lo.to(self.prev_span), VisibilityKind::Restricted {
|
||||||
path: P(path),
|
path: P(path),
|
||||||
|
@ -6285,23 +6285,17 @@ impl<'a> Parser<'a> {
|
||||||
lo: Span,
|
lo: Span,
|
||||||
visibility: Visibility,
|
visibility: Visibility,
|
||||||
attrs: Vec<Attribute>)
|
attrs: Vec<Attribute>)
|
||||||
-> PResult<'a, P<Item>> {
|
-> PResult<'a, P<Item>> {
|
||||||
|
let orig_name = self.parse_ident()?;
|
||||||
let crate_name = self.parse_ident()?;
|
let (item_name, orig_name) = if let Some(rename) = self.parse_rename()? {
|
||||||
let (maybe_path, ident) = if let Some(ident) = self.parse_rename()? {
|
(rename, Some(orig_name.name))
|
||||||
(Some(crate_name.name), ident)
|
|
||||||
} else {
|
} else {
|
||||||
(None, crate_name)
|
(orig_name, None)
|
||||||
};
|
};
|
||||||
self.expect(&token::Semi)?;
|
self.expect(&token::Semi)?;
|
||||||
|
|
||||||
let prev_span = self.prev_span;
|
let span = lo.to(self.prev_span);
|
||||||
|
Ok(self.mk_item(span, item_name, ItemKind::ExternCrate(orig_name), visibility, attrs))
|
||||||
Ok(self.mk_item(lo.to(prev_span),
|
|
||||||
ident,
|
|
||||||
ItemKind::ExternCrate(maybe_path),
|
|
||||||
visibility,
|
|
||||||
attrs))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parse `extern` for foreign ABIs
|
/// Parse `extern` for foreign ABIs
|
||||||
|
@ -6480,12 +6474,11 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
if self.eat_keyword(keywords::Use) {
|
if self.eat_keyword(keywords::Use) {
|
||||||
// USE ITEM
|
// USE ITEM
|
||||||
let item_ = ItemKind::Use(P(self.parse_use_tree(false)?));
|
let item_ = ItemKind::Use(P(self.parse_use_tree()?));
|
||||||
self.expect(&token::Semi)?;
|
self.expect(&token::Semi)?;
|
||||||
|
|
||||||
let prev_span = self.prev_span;
|
let span = lo.to(self.prev_span);
|
||||||
let invalid = keywords::Invalid.ident();
|
let item = self.mk_item(span, keywords::Invalid.ident(), item_, visibility, attrs);
|
||||||
let item = self.mk_item(lo.to(prev_span), invalid, item_, visibility, attrs);
|
|
||||||
return Ok(Some(item));
|
return Ok(Some(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6960,90 +6953,53 @@ impl<'a> Parser<'a> {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `{` or `::{` or `*` or `::*`
|
/// `::{` or `::*`
|
||||||
/// `::{` or `::*` (also `{` or `*` if unprefixed is true)
|
fn is_import_coupler(&mut self) -> bool {
|
||||||
fn is_import_coupler(&mut self, unprefixed: bool) -> bool {
|
self.check(&token::ModSep) &&
|
||||||
self.is_import_coupler_inner(&token::OpenDelim(token::Brace), unprefixed) ||
|
self.look_ahead(1, |t| *t == token::OpenDelim(token::Brace) ||
|
||||||
self.is_import_coupler_inner(&token::BinOp(token::Star), unprefixed)
|
*t == token::BinOp(token::Star))
|
||||||
}
|
|
||||||
|
|
||||||
fn is_import_coupler_inner(&mut self, token: &token::Token, unprefixed: bool) -> bool {
|
|
||||||
if self.check(&token::ModSep) {
|
|
||||||
self.look_ahead(1, |t| t == token)
|
|
||||||
} else if unprefixed {
|
|
||||||
self.check(token)
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parse UseTree
|
/// Parse UseTree
|
||||||
///
|
///
|
||||||
/// USE_TREE = `*` |
|
/// USE_TREE = [`::`] `*` |
|
||||||
/// `{` USE_TREE_LIST `}` |
|
/// [`::`] `{` USE_TREE_LIST `}` |
|
||||||
/// PATH `::` `*` |
|
/// PATH `::` `*` |
|
||||||
/// PATH `::` `{` USE_TREE_LIST `}` |
|
/// PATH `::` `{` USE_TREE_LIST `}` |
|
||||||
/// PATH [`as` IDENT]
|
/// PATH [`as` IDENT]
|
||||||
fn parse_use_tree(&mut self, nested: bool) -> PResult<'a, UseTree> {
|
fn parse_use_tree(&mut self) -> PResult<'a, UseTree> {
|
||||||
let lo = self.span;
|
let lo = self.span;
|
||||||
|
|
||||||
let mut prefix = ast::Path {
|
let mut prefix = ast::Path { segments: Vec::new(), span: lo.shrink_to_lo() };
|
||||||
segments: vec![],
|
let kind = if self.check(&token::OpenDelim(token::Brace)) ||
|
||||||
span: lo.to(self.span),
|
self.check(&token::BinOp(token::Star)) ||
|
||||||
};
|
self.is_import_coupler() {
|
||||||
|
// `use *;` or `use ::*;` or `use {...};` or `use ::{...};`
|
||||||
let kind = if self.is_import_coupler(true) {
|
|
||||||
// `use *;` or `use ::*;` or `use {...};` `use ::{...};`
|
|
||||||
|
|
||||||
// Remove the first `::`
|
|
||||||
if self.eat(&token::ModSep) {
|
if self.eat(&token::ModSep) {
|
||||||
prefix.segments.push(PathSegment::crate_root(self.prev_span));
|
prefix.segments.push(PathSegment::crate_root(lo.shrink_to_lo()));
|
||||||
} else if !nested {
|
|
||||||
prefix.segments.push(PathSegment::crate_root(self.span));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.eat(&token::BinOp(token::Star)) {
|
if self.eat(&token::BinOp(token::Star)) {
|
||||||
// `use *;`
|
|
||||||
UseTreeKind::Glob
|
UseTreeKind::Glob
|
||||||
} else if self.check(&token::OpenDelim(token::Brace)) {
|
|
||||||
// `use {...};`
|
|
||||||
UseTreeKind::Nested(self.parse_use_tree_list()?)
|
|
||||||
} else {
|
} else {
|
||||||
return self.unexpected();
|
UseTreeKind::Nested(self.parse_use_tree_list()?)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// `use path::...;`
|
// `use path::*;` or `use path::{...};` or `use path;` or `use path as bar;`
|
||||||
let mut parsed = self.parse_path(PathStyle::Mod)?;
|
prefix = self.parse_path(PathStyle::Mod)?;
|
||||||
if !nested {
|
|
||||||
parsed = parsed.default_to_global();
|
|
||||||
}
|
|
||||||
|
|
||||||
prefix.segments.append(&mut parsed.segments);
|
|
||||||
prefix.span = prefix.span.to(parsed.span);
|
|
||||||
|
|
||||||
if self.eat(&token::ModSep) {
|
if self.eat(&token::ModSep) {
|
||||||
if self.eat(&token::BinOp(token::Star)) {
|
if self.eat(&token::BinOp(token::Star)) {
|
||||||
// `use path::*;`
|
|
||||||
UseTreeKind::Glob
|
UseTreeKind::Glob
|
||||||
} else if self.check(&token::OpenDelim(token::Brace)) {
|
|
||||||
// `use path::{...};`
|
|
||||||
UseTreeKind::Nested(self.parse_use_tree_list()?)
|
|
||||||
} else {
|
} else {
|
||||||
return self.unexpected();
|
UseTreeKind::Nested(self.parse_use_tree_list()?)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// `use path::foo;` or `use path::foo as bar;`
|
UseTreeKind::Simple(self.parse_rename()?)
|
||||||
let rename = self.parse_rename()?.
|
|
||||||
unwrap_or(prefix.segments.last().unwrap().identifier);
|
|
||||||
UseTreeKind::Simple(rename)
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(UseTree {
|
Ok(UseTree { prefix, kind, span: lo.to(self.prev_span) })
|
||||||
span: lo.to(self.prev_span),
|
|
||||||
kind,
|
|
||||||
prefix,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parse UseTreeKind::Nested(list)
|
/// Parse UseTreeKind::Nested(list)
|
||||||
|
@ -7053,7 +7009,7 @@ impl<'a> Parser<'a> {
|
||||||
self.parse_unspanned_seq(&token::OpenDelim(token::Brace),
|
self.parse_unspanned_seq(&token::OpenDelim(token::Brace),
|
||||||
&token::CloseDelim(token::Brace),
|
&token::CloseDelim(token::Brace),
|
||||||
SeqSep::trailing_allowed(token::Comma), |this| {
|
SeqSep::trailing_allowed(token::Comma), |this| {
|
||||||
Ok((this.parse_use_tree(true)?, ast::DUMMY_NODE_ID))
|
Ok((this.parse_use_tree()?, ast::DUMMY_NODE_ID))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -361,6 +361,7 @@ impl Token {
|
||||||
id.name == keywords::SelfType.name() ||
|
id.name == keywords::SelfType.name() ||
|
||||||
id.name == keywords::Extern.name() ||
|
id.name == keywords::Extern.name() ||
|
||||||
id.name == keywords::Crate.name() ||
|
id.name == keywords::Crate.name() ||
|
||||||
|
id.name == keywords::CrateRoot.name() ||
|
||||||
id.name == keywords::DollarCrate.name(),
|
id.name == keywords::DollarCrate.name(),
|
||||||
None => false,
|
None => false,
|
||||||
}
|
}
|
||||||
|
|
|
@ -352,7 +352,7 @@ pub fn fn_block_to_string(p: &ast::FnDecl) -> String {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn path_to_string(p: &ast::Path) -> String {
|
pub fn path_to_string(p: &ast::Path) -> String {
|
||||||
to_string(|s| s.print_path(p, false, 0, false))
|
to_string(|s| s.print_path(p, false, 0))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn path_segment_to_string(p: &ast::PathSegment) -> String {
|
pub fn path_segment_to_string(p: &ast::PathSegment) -> String {
|
||||||
|
@ -1050,7 +1050,7 @@ impl<'a> State<'a> {
|
||||||
&f.generic_params)?;
|
&f.generic_params)?;
|
||||||
}
|
}
|
||||||
ast::TyKind::Path(None, ref path) => {
|
ast::TyKind::Path(None, ref path) => {
|
||||||
self.print_path(path, false, 0, false)?;
|
self.print_path(path, false, 0)?;
|
||||||
}
|
}
|
||||||
ast::TyKind::Path(Some(ref qself), ref path) => {
|
ast::TyKind::Path(Some(ref qself), ref path) => {
|
||||||
self.print_qpath(path, qself, false)?
|
self.print_qpath(path, qself, false)?
|
||||||
|
@ -1173,15 +1173,10 @@ impl<'a> State<'a> {
|
||||||
self.print_outer_attributes(&item.attrs)?;
|
self.print_outer_attributes(&item.attrs)?;
|
||||||
self.ann.pre(self, NodeItem(item))?;
|
self.ann.pre(self, NodeItem(item))?;
|
||||||
match item.node {
|
match item.node {
|
||||||
ast::ItemKind::ExternCrate(ref optional_path) => {
|
ast::ItemKind::ExternCrate(orig_name) => {
|
||||||
self.head(&visibility_qualified(&item.vis, "extern crate"))?;
|
self.head(&visibility_qualified(&item.vis, "extern crate"))?;
|
||||||
if let Some(p) = *optional_path {
|
if let Some(orig_name) = orig_name {
|
||||||
let val = p.as_str();
|
self.print_name(orig_name)?;
|
||||||
if val.contains('-') {
|
|
||||||
self.print_string(&val, ast::StrStyle::Cooked)?;
|
|
||||||
} else {
|
|
||||||
self.print_name(p)?;
|
|
||||||
}
|
|
||||||
self.s.space()?;
|
self.s.space()?;
|
||||||
self.s.word("as")?;
|
self.s.word("as")?;
|
||||||
self.s.space()?;
|
self.s.space()?;
|
||||||
|
@ -1382,7 +1377,7 @@ impl<'a> State<'a> {
|
||||||
self.s.word(";")?;
|
self.s.word(";")?;
|
||||||
}
|
}
|
||||||
ast::ItemKind::Mac(codemap::Spanned { ref node, .. }) => {
|
ast::ItemKind::Mac(codemap::Spanned { ref node, .. }) => {
|
||||||
self.print_path(&node.path, false, 0, false)?;
|
self.print_path(&node.path, false, 0)?;
|
||||||
self.s.word("! ")?;
|
self.s.word("! ")?;
|
||||||
self.print_ident(item.ident)?;
|
self.print_ident(item.ident)?;
|
||||||
self.cbox(INDENT_UNIT)?;
|
self.cbox(INDENT_UNIT)?;
|
||||||
|
@ -1407,7 +1402,7 @@ impl<'a> State<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_trait_ref(&mut self, t: &ast::TraitRef) -> io::Result<()> {
|
fn print_trait_ref(&mut self, t: &ast::TraitRef) -> io::Result<()> {
|
||||||
self.print_path(&t.path, false, 0, false)
|
self.print_path(&t.path, false, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_formal_generic_params(
|
fn print_formal_generic_params(
|
||||||
|
@ -1464,7 +1459,7 @@ impl<'a> State<'a> {
|
||||||
ast::CrateSugar::JustCrate => self.word_nbsp("crate")
|
ast::CrateSugar::JustCrate => self.word_nbsp("crate")
|
||||||
}
|
}
|
||||||
ast::VisibilityKind::Restricted { ref path, .. } => {
|
ast::VisibilityKind::Restricted { ref path, .. } => {
|
||||||
let path = to_string(|s| s.print_path(path, false, 0, true));
|
let path = to_string(|s| s.print_path(path, false, 0));
|
||||||
if path == "self" || path == "super" {
|
if path == "self" || path == "super" {
|
||||||
self.word_nbsp(&format!("pub({})", path))
|
self.word_nbsp(&format!("pub({})", path))
|
||||||
} else {
|
} else {
|
||||||
|
@ -1572,7 +1567,7 @@ impl<'a> State<'a> {
|
||||||
ti.ident,
|
ti.ident,
|
||||||
ty,
|
ty,
|
||||||
default.as_ref().map(|expr| &**expr),
|
default.as_ref().map(|expr| &**expr),
|
||||||
&codemap::respan(ti.span.empty(), ast::VisibilityKind::Inherited),
|
&codemap::respan(ti.span.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
ast::TraitItemKind::Method(ref sig, ref body) => {
|
ast::TraitItemKind::Method(ref sig, ref body) => {
|
||||||
|
@ -1583,7 +1578,7 @@ impl<'a> State<'a> {
|
||||||
ti.ident,
|
ti.ident,
|
||||||
&ti.generics,
|
&ti.generics,
|
||||||
sig,
|
sig,
|
||||||
&codemap::respan(ti.span.empty(), ast::VisibilityKind::Inherited),
|
&codemap::respan(ti.span.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||||
)?;
|
)?;
|
||||||
if let Some(ref body) = *body {
|
if let Some(ref body) = *body {
|
||||||
self.nbsp()?;
|
self.nbsp()?;
|
||||||
|
@ -1598,7 +1593,7 @@ impl<'a> State<'a> {
|
||||||
}
|
}
|
||||||
ast::TraitItemKind::Macro(codemap::Spanned { ref node, .. }) => {
|
ast::TraitItemKind::Macro(codemap::Spanned { ref node, .. }) => {
|
||||||
// code copied from ItemKind::Mac:
|
// code copied from ItemKind::Mac:
|
||||||
self.print_path(&node.path, false, 0, false)?;
|
self.print_path(&node.path, false, 0)?;
|
||||||
self.s.word("! ")?;
|
self.s.word("! ")?;
|
||||||
self.cbox(INDENT_UNIT)?;
|
self.cbox(INDENT_UNIT)?;
|
||||||
self.popen()?;
|
self.popen()?;
|
||||||
|
@ -1632,7 +1627,7 @@ impl<'a> State<'a> {
|
||||||
}
|
}
|
||||||
ast::ImplItemKind::Macro(codemap::Spanned { ref node, .. }) => {
|
ast::ImplItemKind::Macro(codemap::Spanned { ref node, .. }) => {
|
||||||
// code copied from ItemKind::Mac:
|
// code copied from ItemKind::Mac:
|
||||||
self.print_path(&node.path, false, 0, false)?;
|
self.print_path(&node.path, false, 0)?;
|
||||||
self.s.word("! ")?;
|
self.s.word("! ")?;
|
||||||
self.cbox(INDENT_UNIT)?;
|
self.cbox(INDENT_UNIT)?;
|
||||||
self.popen()?;
|
self.popen()?;
|
||||||
|
@ -1818,7 +1813,7 @@ impl<'a> State<'a> {
|
||||||
|
|
||||||
pub fn print_mac(&mut self, m: &ast::Mac, delim: token::DelimToken)
|
pub fn print_mac(&mut self, m: &ast::Mac, delim: token::DelimToken)
|
||||||
-> io::Result<()> {
|
-> io::Result<()> {
|
||||||
self.print_path(&m.node.path, false, 0, false)?;
|
self.print_path(&m.node.path, false, 0)?;
|
||||||
self.s.word("!")?;
|
self.s.word("!")?;
|
||||||
match delim {
|
match delim {
|
||||||
token::Paren => self.popen()?,
|
token::Paren => self.popen()?,
|
||||||
|
@ -1919,7 +1914,7 @@ impl<'a> State<'a> {
|
||||||
fields: &[ast::Field],
|
fields: &[ast::Field],
|
||||||
wth: &Option<P<ast::Expr>>,
|
wth: &Option<P<ast::Expr>>,
|
||||||
attrs: &[Attribute]) -> io::Result<()> {
|
attrs: &[Attribute]) -> io::Result<()> {
|
||||||
self.print_path(path, true, 0, false)?;
|
self.print_path(path, true, 0)?;
|
||||||
self.s.word("{")?;
|
self.s.word("{")?;
|
||||||
self.print_inner_attributes_inline(attrs)?;
|
self.print_inner_attributes_inline(attrs)?;
|
||||||
self.commasep_cmnt(
|
self.commasep_cmnt(
|
||||||
|
@ -2240,7 +2235,7 @@ impl<'a> State<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast::ExprKind::Path(None, ref path) => {
|
ast::ExprKind::Path(None, ref path) => {
|
||||||
self.print_path(path, true, 0, false)?
|
self.print_path(path, true, 0)?
|
||||||
}
|
}
|
||||||
ast::ExprKind::Path(Some(ref qself), ref path) => {
|
ast::ExprKind::Path(Some(ref qself), ref path) => {
|
||||||
self.print_qpath(path, qself, true)?
|
self.print_qpath(path, qself, true)?
|
||||||
|
@ -2400,17 +2395,12 @@ impl<'a> State<'a> {
|
||||||
fn print_path(&mut self,
|
fn print_path(&mut self,
|
||||||
path: &ast::Path,
|
path: &ast::Path,
|
||||||
colons_before_params: bool,
|
colons_before_params: bool,
|
||||||
depth: usize,
|
depth: usize)
|
||||||
defaults_to_global: bool)
|
|
||||||
-> io::Result<()>
|
-> io::Result<()>
|
||||||
{
|
{
|
||||||
self.maybe_print_comment(path.span.lo())?;
|
self.maybe_print_comment(path.span.lo())?;
|
||||||
|
|
||||||
let mut segments = path.segments[..path.segments.len()-depth].iter();
|
for (i, segment) in path.segments[..path.segments.len() - depth].iter().enumerate() {
|
||||||
if defaults_to_global && path.is_global() {
|
|
||||||
segments.next();
|
|
||||||
}
|
|
||||||
for (i, segment) in segments.enumerate() {
|
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
self.s.word("::")?
|
self.s.word("::")?
|
||||||
}
|
}
|
||||||
|
@ -2449,7 +2439,7 @@ impl<'a> State<'a> {
|
||||||
self.s.space()?;
|
self.s.space()?;
|
||||||
self.word_space("as")?;
|
self.word_space("as")?;
|
||||||
let depth = path.segments.len() - qself.position;
|
let depth = path.segments.len() - qself.position;
|
||||||
self.print_path(path, false, depth, false)?;
|
self.print_path(path, false, depth)?;
|
||||||
}
|
}
|
||||||
self.s.word(">")?;
|
self.s.word(">")?;
|
||||||
self.s.word("::")?;
|
self.s.word("::")?;
|
||||||
|
@ -2552,7 +2542,7 @@ impl<'a> State<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PatKind::TupleStruct(ref path, ref elts, ddpos) => {
|
PatKind::TupleStruct(ref path, ref elts, ddpos) => {
|
||||||
self.print_path(path, true, 0, false)?;
|
self.print_path(path, true, 0)?;
|
||||||
self.popen()?;
|
self.popen()?;
|
||||||
if let Some(ddpos) = ddpos {
|
if let Some(ddpos) = ddpos {
|
||||||
self.commasep(Inconsistent, &elts[..ddpos], |s, p| s.print_pat(p))?;
|
self.commasep(Inconsistent, &elts[..ddpos], |s, p| s.print_pat(p))?;
|
||||||
|
@ -2570,13 +2560,13 @@ impl<'a> State<'a> {
|
||||||
self.pclose()?;
|
self.pclose()?;
|
||||||
}
|
}
|
||||||
PatKind::Path(None, ref path) => {
|
PatKind::Path(None, ref path) => {
|
||||||
self.print_path(path, true, 0, false)?;
|
self.print_path(path, true, 0)?;
|
||||||
}
|
}
|
||||||
PatKind::Path(Some(ref qself), ref path) => {
|
PatKind::Path(Some(ref qself), ref path) => {
|
||||||
self.print_qpath(path, qself, false)?;
|
self.print_qpath(path, qself, false)?;
|
||||||
}
|
}
|
||||||
PatKind::Struct(ref path, ref fields, etc) => {
|
PatKind::Struct(ref path, ref fields, etc) => {
|
||||||
self.print_path(path, true, 0, false)?;
|
self.print_path(path, true, 0)?;
|
||||||
self.nbsp()?;
|
self.nbsp()?;
|
||||||
self.word_space("{")?;
|
self.word_space("{")?;
|
||||||
self.commasep_cmnt(
|
self.commasep_cmnt(
|
||||||
|
@ -2953,18 +2943,17 @@ impl<'a> State<'a> {
|
||||||
|
|
||||||
pub fn print_use_tree(&mut self, tree: &ast::UseTree) -> io::Result<()> {
|
pub fn print_use_tree(&mut self, tree: &ast::UseTree) -> io::Result<()> {
|
||||||
match tree.kind {
|
match tree.kind {
|
||||||
ast::UseTreeKind::Simple(ref ident) => {
|
ast::UseTreeKind::Simple(rename) => {
|
||||||
self.print_path(&tree.prefix, false, 0, true)?;
|
self.print_path(&tree.prefix, false, 0)?;
|
||||||
|
if let Some(rename) = rename {
|
||||||
if tree.prefix.segments.last().unwrap().identifier.name != ident.name {
|
|
||||||
self.s.space()?;
|
self.s.space()?;
|
||||||
self.word_space("as")?;
|
self.word_space("as")?;
|
||||||
self.print_ident(*ident)?;
|
self.print_ident(rename)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast::UseTreeKind::Glob => {
|
ast::UseTreeKind::Glob => {
|
||||||
if !tree.prefix.segments.is_empty() {
|
if !tree.prefix.segments.is_empty() {
|
||||||
self.print_path(&tree.prefix, false, 0, true)?;
|
self.print_path(&tree.prefix, false, 0)?;
|
||||||
self.s.word("::")?;
|
self.s.word("::")?;
|
||||||
}
|
}
|
||||||
self.s.word("*")?;
|
self.s.word("*")?;
|
||||||
|
@ -2973,7 +2962,7 @@ impl<'a> State<'a> {
|
||||||
if tree.prefix.segments.is_empty() {
|
if tree.prefix.segments.is_empty() {
|
||||||
self.s.word("{")?;
|
self.s.word("{")?;
|
||||||
} else {
|
} else {
|
||||||
self.print_path(&tree.prefix, false, 0, true)?;
|
self.print_path(&tree.prefix, false, 0)?;
|
||||||
self.s.word("::{")?;
|
self.s.word("::{")?;
|
||||||
}
|
}
|
||||||
self.commasep(Inconsistent, &items[..], |this, &(ref tree, _)| {
|
self.commasep(Inconsistent, &items[..], |this, &(ref tree, _)| {
|
||||||
|
|
|
@ -43,7 +43,7 @@ thread_local! {
|
||||||
static INJECTED_CRATE_NAME: Cell<Option<&'static str>> = Cell::new(None);
|
static INJECTED_CRATE_NAME: Cell<Option<&'static str>> = Cell::new(None);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn maybe_inject_crates_ref(mut krate: ast::Crate, alt_std_name: Option<String>) -> ast::Crate {
|
pub fn maybe_inject_crates_ref(mut krate: ast::Crate, alt_std_name: Option<&str>) -> ast::Crate {
|
||||||
let name = if attr::contains_name(&krate.attrs, "no_core") {
|
let name = if attr::contains_name(&krate.attrs, "no_core") {
|
||||||
return krate;
|
return krate;
|
||||||
} else if attr::contains_name(&krate.attrs, "no_std") {
|
} else if attr::contains_name(&krate.attrs, "no_std") {
|
||||||
|
@ -54,14 +54,12 @@ pub fn maybe_inject_crates_ref(mut krate: ast::Crate, alt_std_name: Option<Strin
|
||||||
|
|
||||||
INJECTED_CRATE_NAME.with(|opt_name| opt_name.set(Some(name)));
|
INJECTED_CRATE_NAME.with(|opt_name| opt_name.set(Some(name)));
|
||||||
|
|
||||||
let crate_name = Symbol::intern(&alt_std_name.unwrap_or_else(|| name.to_string()));
|
|
||||||
|
|
||||||
krate.module.items.insert(0, P(ast::Item {
|
krate.module.items.insert(0, P(ast::Item {
|
||||||
attrs: vec![attr::mk_attr_outer(DUMMY_SP,
|
attrs: vec![attr::mk_attr_outer(DUMMY_SP,
|
||||||
attr::mk_attr_id(),
|
attr::mk_attr_id(),
|
||||||
attr::mk_word_item(Symbol::intern("macro_use")))],
|
attr::mk_word_item(Symbol::intern("macro_use")))],
|
||||||
vis: dummy_spanned(ast::VisibilityKind::Inherited),
|
vis: dummy_spanned(ast::VisibilityKind::Inherited),
|
||||||
node: ast::ItemKind::ExternCrate(Some(crate_name)),
|
node: ast::ItemKind::ExternCrate(alt_std_name.map(Symbol::intern)),
|
||||||
ident: ast::Ident::from_str(name),
|
ident: ast::Ident::from_str(name),
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
span: DUMMY_SP,
|
span: DUMMY_SP,
|
||||||
|
@ -78,10 +76,10 @@ pub fn maybe_inject_crates_ref(mut krate: ast::Crate, alt_std_name: Option<Strin
|
||||||
is_sugared_doc: false,
|
is_sugared_doc: false,
|
||||||
span,
|
span,
|
||||||
}],
|
}],
|
||||||
vis: respan(span.empty(), ast::VisibilityKind::Inherited),
|
vis: respan(span.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||||
node: ast::ItemKind::Use(P(ast::UseTree {
|
node: ast::ItemKind::Use(P(ast::UseTree {
|
||||||
prefix: ast::Path {
|
prefix: ast::Path {
|
||||||
segments: ["{{root}}", name, "prelude", "v1"].into_iter().map(|name| {
|
segments: [name, "prelude", "v1"].into_iter().map(|name| {
|
||||||
ast::PathSegment::from_ident(ast::Ident::from_str(name), DUMMY_SP)
|
ast::PathSegment::from_ident(ast::Ident::from_str(name), DUMMY_SP)
|
||||||
}).collect(),
|
}).collect(),
|
||||||
span,
|
span,
|
||||||
|
|
|
@ -78,7 +78,7 @@ pub fn modify_for_testing(sess: &ParseSess,
|
||||||
span_diagnostic: &errors::Handler,
|
span_diagnostic: &errors::Handler,
|
||||||
features: &Features) -> ast::Crate {
|
features: &Features) -> ast::Crate {
|
||||||
// Check for #[reexport_test_harness_main = "some_name"] which
|
// Check for #[reexport_test_harness_main = "some_name"] which
|
||||||
// creates a `use some_name = __test::main;`. This needs to be
|
// creates a `use __test::main as some_name;`. This needs to be
|
||||||
// unconditional, so that the attribute is still marked as used in
|
// unconditional, so that the attribute is still marked as used in
|
||||||
// non-test builds.
|
// non-test builds.
|
||||||
let reexport_test_harness_main =
|
let reexport_test_harness_main =
|
||||||
|
@ -240,7 +240,8 @@ fn mk_reexport_mod(cx: &mut TestCtxt,
|
||||||
cx.ext_cx.path(DUMMY_SP, vec![super_, r]))
|
cx.ext_cx.path(DUMMY_SP, vec![super_, r]))
|
||||||
}).chain(tested_submods.into_iter().map(|(r, sym)| {
|
}).chain(tested_submods.into_iter().map(|(r, sym)| {
|
||||||
let path = cx.ext_cx.path(DUMMY_SP, vec![super_, r, sym]);
|
let path = cx.ext_cx.path(DUMMY_SP, vec![super_, r, sym]);
|
||||||
cx.ext_cx.item_use_simple_(DUMMY_SP, dummy_spanned(ast::VisibilityKind::Public), r, path)
|
cx.ext_cx.item_use_simple_(DUMMY_SP, dummy_spanned(ast::VisibilityKind::Public),
|
||||||
|
Some(r), path)
|
||||||
})).collect();
|
})).collect();
|
||||||
|
|
||||||
let reexport_mod = ast::Mod {
|
let reexport_mod = ast::Mod {
|
||||||
|
@ -502,7 +503,7 @@ fn mk_std(cx: &TestCtxt) -> P<ast::Item> {
|
||||||
(ast::ItemKind::Use(P(ast::UseTree {
|
(ast::ItemKind::Use(P(ast::UseTree {
|
||||||
span: DUMMY_SP,
|
span: DUMMY_SP,
|
||||||
prefix: path_node(vec![id_test]),
|
prefix: path_node(vec![id_test]),
|
||||||
kind: ast::UseTreeKind::Simple(id_test),
|
kind: ast::UseTreeKind::Simple(None),
|
||||||
})),
|
})),
|
||||||
ast::VisibilityKind::Public, keywords::Invalid.ident())
|
ast::VisibilityKind::Public, keywords::Invalid.ident())
|
||||||
} else {
|
} else {
|
||||||
|
@ -590,13 +591,13 @@ fn mk_test_module(cx: &mut TestCtxt) -> (P<ast::Item>, Option<P<ast::Item>>) {
|
||||||
tokens: None,
|
tokens: None,
|
||||||
})).pop().unwrap();
|
})).pop().unwrap();
|
||||||
let reexport = cx.reexport_test_harness_main.map(|s| {
|
let reexport = cx.reexport_test_harness_main.map(|s| {
|
||||||
// building `use <ident> = __test::main`
|
// building `use __test::main as <ident>;`
|
||||||
let reexport_ident = Ident::with_empty_ctxt(s);
|
let rename = Ident::with_empty_ctxt(s);
|
||||||
|
|
||||||
let use_path = ast::UseTree {
|
let use_path = ast::UseTree {
|
||||||
span: DUMMY_SP,
|
span: DUMMY_SP,
|
||||||
prefix: path_node(vec![mod_ident, Ident::from_str("main")]),
|
prefix: path_node(vec![mod_ident, Ident::from_str("main")]),
|
||||||
kind: ast::UseTreeKind::Simple(reexport_ident),
|
kind: ast::UseTreeKind::Simple(Some(rename)),
|
||||||
};
|
};
|
||||||
|
|
||||||
expander.fold_item(P(ast::Item {
|
expander.fold_item(P(ast::Item {
|
||||||
|
|
|
@ -213,9 +213,9 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
|
||||||
visitor.visit_vis(&item.vis);
|
visitor.visit_vis(&item.vis);
|
||||||
visitor.visit_ident(item.span, item.ident);
|
visitor.visit_ident(item.span, item.ident);
|
||||||
match item.node {
|
match item.node {
|
||||||
ItemKind::ExternCrate(opt_name) => {
|
ItemKind::ExternCrate(orig_name) => {
|
||||||
if let Some(name) = opt_name {
|
if let Some(orig_name) = orig_name {
|
||||||
visitor.visit_name(item.span, name);
|
visitor.visit_name(item.span, orig_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ItemKind::Use(ref use_tree) => {
|
ItemKind::Use(ref use_tree) => {
|
||||||
|
@ -354,10 +354,11 @@ pub fn walk_use_tree<'a, V: Visitor<'a>>(
|
||||||
visitor: &mut V, use_tree: &'a UseTree, id: NodeId,
|
visitor: &mut V, use_tree: &'a UseTree, id: NodeId,
|
||||||
) {
|
) {
|
||||||
visitor.visit_path(&use_tree.prefix, id);
|
visitor.visit_path(&use_tree.prefix, id);
|
||||||
|
|
||||||
match use_tree.kind {
|
match use_tree.kind {
|
||||||
UseTreeKind::Simple(ident) => {
|
UseTreeKind::Simple(rename) => {
|
||||||
visitor.visit_ident(use_tree.span, ident);
|
if let Some(rename) = rename {
|
||||||
|
visitor.visit_ident(use_tree.span, rename);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
UseTreeKind::Glob => {},
|
UseTreeKind::Glob => {},
|
||||||
UseTreeKind::Nested(ref use_trees) => {
|
UseTreeKind::Nested(ref use_trees) => {
|
||||||
|
|
|
@ -530,7 +530,7 @@ impl<'a> TraitDef<'a> {
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
span: self.span,
|
span: self.span,
|
||||||
ident,
|
ident,
|
||||||
vis: respan(self.span.empty(), ast::VisibilityKind::Inherited),
|
vis: respan(self.span.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||||
defaultness: ast::Defaultness::Final,
|
defaultness: ast::Defaultness::Final,
|
||||||
attrs: Vec::new(),
|
attrs: Vec::new(),
|
||||||
generics: Generics::default(),
|
generics: Generics::default(),
|
||||||
|
@ -977,7 +977,7 @@ impl<'a> MethodDef<'a> {
|
||||||
attrs: self.attributes.clone(),
|
attrs: self.attributes.clone(),
|
||||||
generics: fn_generics,
|
generics: fn_generics,
|
||||||
span: trait_.span,
|
span: trait_.span,
|
||||||
vis: respan(trait_.span.empty(), ast::VisibilityKind::Inherited),
|
vis: respan(trait_.span.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||||
defaultness: ast::Defaultness::Final,
|
defaultness: ast::Defaultness::Final,
|
||||||
ident: method_ident,
|
ident: method_ident,
|
||||||
node: ast::ImplItemKind::Method(ast::MethodSig {
|
node: ast::ImplItemKind::Method(ast::MethodSig {
|
||||||
|
|
|
@ -60,7 +60,7 @@ pub fn expand_global_asm<'cx>(cx: &'cx mut ExtCtxt,
|
||||||
asm,
|
asm,
|
||||||
ctxt: cx.backtrace(),
|
ctxt: cx.backtrace(),
|
||||||
})),
|
})),
|
||||||
vis: respan(sp.empty(), ast::VisibilityKind::Inherited),
|
vis: respan(sp.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||||
span: sp,
|
span: sp,
|
||||||
tokens: None,
|
tokens: None,
|
||||||
})))
|
})))
|
||||||
|
|
|
@ -239,8 +239,15 @@ impl Span {
|
||||||
|
|
||||||
/// Returns a new span representing an empty span at the beginning of this span
|
/// Returns a new span representing an empty span at the beginning of this span
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn empty(self) -> Span {
|
pub fn shrink_to_lo(self) -> Span {
|
||||||
self.with_hi(self.lo())
|
let span = self.data();
|
||||||
|
span.with_hi(span.lo)
|
||||||
|
}
|
||||||
|
/// Returns a new span representing an empty span at the end of this span
|
||||||
|
#[inline]
|
||||||
|
pub fn shrink_to_hi(self) -> Span {
|
||||||
|
let span = self.data();
|
||||||
|
span.with_lo(span.hi)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `self` if `self` is not the dummy span, and `other` otherwise.
|
/// Returns `self` if `self` is not the dummy span, and `other` otherwise.
|
||||||
|
|
|
@ -9,12 +9,12 @@
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#![deny(unused_import_braces)]
|
#![deny(unused_import_braces)]
|
||||||
#![allow(dead_code)]
|
|
||||||
#![allow(unused_imports)]
|
|
||||||
|
|
||||||
use test::{A}; //~ ERROR braces around A is unnecessary
|
use test::{A}; //~ ERROR braces around A is unnecessary
|
||||||
|
|
||||||
mod test {
|
mod test {
|
||||||
|
use test::{self}; // OK
|
||||||
|
use test::{self as rename}; // OK
|
||||||
pub struct A;
|
pub struct A;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue