Skip to content

Commit 85d19b3

Browse files
committed
Improve pretty printing $crate:: paths.
1 parent f79c7e4 commit 85d19b3

File tree

6 files changed

+44
-21
lines changed

6 files changed

+44
-21
lines changed

src/librustc/hir/lowering.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ pub fn lower_crate(sess: &Session,
175175
let _ignore = dep_graph.in_ignore();
176176

177177
LoweringContext {
178-
crate_root: std_inject::injected_crate_name(krate),
178+
crate_root: std_inject::injected_crate_name(),
179179
sess,
180180
cstore,
181181
parent_def: None,

src/librustc_resolve/build_reduced_graph.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ use syntax::ext::base::Determinacy::Undetermined;
4040
use syntax::ext::hygiene::Mark;
4141
use syntax::ext::tt::macro_rules;
4242
use syntax::parse::token::{self, Token};
43+
use syntax::std_inject::injected_crate_name;
4344
use syntax::symbol::keywords;
4445
use syntax::symbol::Symbol;
4546
use syntax::visit::{self, Visitor};
@@ -262,7 +263,7 @@ impl<'a> Resolver<'a> {
262263
let module =
263264
self.get_module(DefId { krate: crate_id, index: CRATE_DEF_INDEX });
264265
self.populate_module_if_necessary(module);
265-
if self.injected_crate_name.map_or(false, |name| item.ident.name == name) {
266+
if injected_crate_name().map_or(false, |name| item.ident.name == name) {
266267
self.injected_crate = Some(module);
267268
}
268269

src/librustc_resolve/lib.rs

-3
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ use syntax::ast::{Item, ItemKind, ImplItem, ImplItemKind};
5858
use syntax::ast::{Local, Mutability, Pat, PatKind, Path};
5959
use syntax::ast::{QSelf, TraitItemKind, TraitRef, Ty, TyKind};
6060
use syntax::feature_gate::{feature_err, emit_feature_err, GateIssue};
61-
use syntax::std_inject::injected_crate_name;
6261

6362
use syntax_pos::{Span, DUMMY_SP, MultiSpan};
6463
use errors::{DiagnosticBuilder, DiagnosticId};
@@ -1335,7 +1334,6 @@ pub struct Resolver<'a> {
13351334
// Only used for better errors on `fn(): fn()`
13361335
current_type_ascription: Vec<Span>,
13371336

1338-
injected_crate_name: Option<&'static str>,
13391337
injected_crate: Option<Module<'a>>,
13401338
}
13411339

@@ -1536,7 +1534,6 @@ impl<'a> Resolver<'a> {
15361534
found_unresolved_macro: false,
15371535
unused_macros: FxHashSet(),
15381536
current_type_ascription: Vec::new(),
1539-
injected_crate_name: injected_crate_name(krate),
15401537
injected_crate: None,
15411538
}
15421539
}

src/librustc_resolve/macros.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use syntax::errors::DiagnosticBuilder;
2525
use syntax::ext::base::{self, Annotatable, Determinacy, MultiModifier, MultiDecorator};
2626
use syntax::ext::base::{MacroKind, SyntaxExtension, Resolver as SyntaxResolver};
2727
use syntax::ext::expand::{Expansion, ExpansionKind, Invocation, InvocationKind, find_attr_invoc};
28-
use syntax::ext::hygiene::Mark;
28+
use syntax::ext::hygiene::{Mark, MarkKind};
2929
use syntax::ext::placeholders::placeholder;
3030
use syntax::ext::tt::macro_rules;
3131
use syntax::feature_gate::{self, emit_feature_err, GateIssue};
@@ -297,16 +297,19 @@ impl<'a> base::Resolver for Resolver<'a> {
297297
InvocationKind::Attr { attr: None, .. } => return Ok(None),
298298
_ => self.resolve_invoc_to_def(invoc, scope, force)?,
299299
};
300+
let def_id = def.def_id();
300301

301-
self.macro_defs.insert(invoc.expansion_data.mark, def.def_id());
302+
self.macro_defs.insert(invoc.expansion_data.mark, def_id);
302303
let normal_module_def_id =
303304
self.macro_def_scope(invoc.expansion_data.mark).normal_ancestor_id;
304305
self.definitions.add_macro_def_scope(invoc.expansion_data.mark, normal_module_def_id);
305306

306-
self.unused_macros.remove(&def.def_id());
307+
self.unused_macros.remove(&def_id);
307308
let ext = self.get_macro(def);
308309
if ext.is_modern() {
309-
invoc.expansion_data.mark.set_modern();
310+
invoc.expansion_data.mark.set_kind(MarkKind::Modern);
311+
} else if def_id.krate == BUILTIN_MACROS_CRATE {
312+
invoc.expansion_data.mark.set_kind(MarkKind::Builtin);
310313
}
311314
Ok(Some(ext))
312315
}

src/libsyntax/print/pprust.rs

+19-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use util::parser::{self, AssocOp, Fixity};
1818
use attr;
1919
use codemap::{self, CodeMap};
2020
use syntax_pos::{self, BytePos};
21+
use syntax_pos::hygiene::{Mark, MarkKind, SyntaxContext};
2122
use parse::token::{self, BinOpToken, Token};
2223
use parse::lexer::comments;
2324
use parse::{self, ParseSess};
@@ -93,7 +94,7 @@ pub fn print_crate<'a>(cm: &'a CodeMap,
9394
is_expanded: bool) -> io::Result<()> {
9495
let mut s = State::new_from_input(cm, sess, filename, input, out, ann, is_expanded);
9596

96-
if is_expanded && !std_inject::injected_crate_name(krate).is_none() {
97+
if is_expanded && !std_inject::injected_crate_name().is_none() {
9798
// We need to print `#![no_std]` (and its feature gate) so that
9899
// compiling pretty-printed source won't inject libstd again.
99100
// However we don't want these attributes in the AST because
@@ -734,6 +735,8 @@ pub trait PrintState<'a> {
734735
if segment.identifier.name != keywords::CrateRoot.name() &&
735736
segment.identifier.name != keywords::DollarCrate.name() {
736737
self.writer().word(&segment.identifier.name.as_str())?;
738+
} else if segment.identifier.name == keywords::DollarCrate.name() {
739+
self.print_dollar_crate(segment.identifier.ctxt)?;
737740
}
738741
}
739742
self.writer().space()?;
@@ -822,6 +825,19 @@ pub trait PrintState<'a> {
822825
}
823826

824827
fn nbsp(&mut self) -> io::Result<()> { self.writer().word(" ") }
828+
829+
fn print_dollar_crate(&mut self, mut ctxt: SyntaxContext) -> io::Result<()> {
830+
if let Some(mark) = ctxt.adjust(Mark::root()) {
831+
// Make a best effort to print something that complies
832+
if mark.kind() == MarkKind::Builtin {
833+
if let Some(name) = std_inject::injected_crate_name() {
834+
self.writer().word("::")?;
835+
self.writer().word(name)?;
836+
}
837+
}
838+
}
839+
Ok(())
840+
}
825841
}
826842

827843
impl<'a> PrintState<'a> for State<'a> {
@@ -2411,6 +2427,8 @@ impl<'a> State<'a> {
24112427
if let Some(ref parameters) = segment.parameters {
24122428
self.print_path_parameters(parameters, colons_before_params)?;
24132429
}
2430+
} else if segment.identifier.name == keywords::DollarCrate.name() {
2431+
self.print_dollar_crate(segment.identifier.ctxt)?;
24142432
}
24152433
Ok(())
24162434
}

src/libsyntax/std_inject.rs

+15-11
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
use ast;
1212
use attr;
13+
use std::cell::Cell;
1314
use ext::hygiene::{Mark, SyntaxContext};
1415
use symbol::{Symbol, keywords};
1516
use syntax_pos::{DUMMY_SP, Span};
@@ -34,22 +35,25 @@ fn ignored_span(sp: Span) -> Span {
3435
sp.with_ctxt(SyntaxContext::empty().apply_mark(mark))
3536
}
3637

37-
pub fn injected_crate_name(krate: &ast::Crate) -> Option<&'static str> {
38-
if attr::contains_name(&krate.attrs, "no_core") {
39-
None
40-
} else if attr::contains_name(&krate.attrs, "no_std") {
41-
Some("core")
42-
} else {
43-
Some("std")
44-
}
38+
pub fn injected_crate_name() -> Option<&'static str> {
39+
INJECTED_CRATE_NAME.with(|name| name.get())
40+
}
41+
42+
thread_local! {
43+
static INJECTED_CRATE_NAME: Cell<Option<&'static str>> = Cell::new(None);
4544
}
4645

4746
pub fn maybe_inject_crates_ref(mut krate: ast::Crate, alt_std_name: Option<String>) -> ast::Crate {
48-
let name = match injected_crate_name(&krate) {
49-
Some(name) => name,
50-
None => return krate,
47+
let name = if attr::contains_name(&krate.attrs, "no_core") {
48+
return krate;
49+
} else if attr::contains_name(&krate.attrs, "no_std") {
50+
"core"
51+
} else {
52+
"std"
5153
};
5254

55+
INJECTED_CRATE_NAME.with(|opt_name| opt_name.set(Some(name)));
56+
5357
let crate_name = Symbol::intern(&alt_std_name.unwrap_or_else(|| name.to_string()));
5458

5559
krate.module.items.insert(0, P(ast::Item {

0 commit comments

Comments
 (0)