Resolve $crate
s for pretty-printing at more appropriate time · rust-lang/rust@e40d7d9 (original) (raw)
1
1
`use {AmbiguityError, AmbiguityKind, AmbiguityErrorMisc};
`
2
2
`use {CrateLint, Resolver, ResolutionError, ScopeSet, Weak};
`
3
``
`-
use {Module, NameBinding, NameBindingKind, PathResult, Segment, ToNameBinding};
`
``
3
`+
use {Module, ModuleKind, NameBinding, NameBindingKind, PathResult, Segment, ToNameBinding};
`
4
4
`use {is_known_tool, resolve_error};
`
5
5
`use ModuleOrUniformRoot;
`
6
6
`use Namespace::*;
`
`@@ -15,12 +15,13 @@ use syntax::ast::{self, Ident};
`
15
15
`use syntax::attr;
`
16
16
`use syntax::errors::DiagnosticBuilder;
`
17
17
`use syntax::ext::base::{self, Determinacy};
`
18
``
`-
use syntax::ext::base::{MacroKind, SyntaxExtension};
`
``
18
`+
use syntax::ext::base::{Annotatable, MacroKind, SyntaxExtension};
`
19
19
`use syntax::ext::expand::{AstFragment, Invocation, InvocationKind};
`
20
20
`use syntax::ext:🪥:{self, Mark};
`
21
21
`use syntax::ext::tt::macro_rules;
`
22
22
`use syntax::feature_gate::{feature_err, is_builtin_attr_name, GateIssue};
`
23
23
`use syntax::symbol::{Symbol, keywords};
`
``
24
`+
use syntax::visit::Visitor;
`
24
25
`use syntax::util::lev_distance::find_best_match_for_name;
`
25
26
`use syntax_pos::{Span, DUMMY_SP};
`
26
27
`use errors::Applicability;
`
`@@ -126,6 +127,26 @@ impl<'a> base::Resolver for Resolver<'a> {
`
126
127
` mark
`
127
128
`}
`
128
129
``
``
130
`+
fn resolve_dollar_crates(&mut self, annotatable: &Annotatable) {
`
``
131
`+
pub struct ResolveDollarCrates<'a, 'b: 'a> {
`
``
132
`+
pub resolver: &'a mut Resolver<'b>,
`
``
133
`+
}
`
``
134
`+
impl<'a> Visitor<'a> for ResolveDollarCrates<'a, '_> {
`
``
135
`+
fn visit_ident(&mut self, ident: Ident) {
`
``
136
`+
if ident.name == keywords::DollarCrate.name() {
`
``
137
`+
let name = match self.resolver.resolve_crate_root(ident).kind {
`
``
138
`+
ModuleKind::Def(_, name) if name != keywords::Invalid.name() => name,
`
``
139
`+
_ => keywords::Crate.name(),
`
``
140
`+
};
`
``
141
`+
ident.span.ctxt().set_dollar_crate_name(name);
`
``
142
`+
}
`
``
143
`+
}
`
``
144
`+
fn visit_mac(&mut self, _: &ast::Mac) {}
`
``
145
`+
}
`
``
146
+
``
147
`+
annotatable.visit_with(&mut ResolveDollarCrates { resolver: self });
`
``
148
`+
}
`
``
149
+
129
150
`fn visit_ast_fragment_with_placeholders(&mut self, mark: Mark, fragment: &AstFragment,
`
130
151
`derives: &[Mark]) {
`
131
152
`let invocation = self.invocations[&mark];
`