macros.rs 54.9 KB
Newer Older
1 2 3
//! A bunch of methods and structures more or less related to resolving macros and
//! interface provided by `Resolver` to macro expander.

4
use crate::imports::ImportResolver;
M
Mark Rousskov 已提交
5
use crate::Namespace::*;
6
use crate::{AmbiguityError, AmbiguityErrorMisc, AmbiguityKind, BuiltinMacroState, Determinacy};
7
use crate::{CrateLint, DeriveData, ParentScope, ResolutionError, Resolver, Scope, ScopeSet, Weak};
M
Mark Rousskov 已提交
8
use crate::{ModuleKind, ModuleOrUniformRoot, NameBinding, PathResult, Segment, ToNameBinding};
9
use rustc_ast::{self as ast, Inline, ItemKind, ModKind, NodeId};
10
use rustc_ast_lowering::ResolverAstLowering;
11
use rustc_ast_pretty::pprust;
12
use rustc_attr::StabilityLevel;
13
use rustc_data_structures::fx::FxHashSet;
14
use rustc_data_structures::ptr_key::PtrKey;
15
use rustc_data_structures::sync::Lrc;
16
use rustc_errors::struct_span_err;
17 18
use rustc_expand::base::{Annotatable, DeriveResolutions, Indeterminate, ResolverExpand};
use rustc_expand::base::{SyntaxExtension, SyntaxExtensionKind};
19
use rustc_expand::compile_declarative_macro;
20
use rustc_expand::expand::{AstFragment, Invocation, InvocationKind, SupportsMacroExpansion};
21
use rustc_feature::is_builtin_attr_name;
22 23
use rustc_hir::def::{self, DefKind, NonMacroAttrKind};
use rustc_hir::def_id;
24
use rustc_hir::PrimTy;
25
use rustc_middle::middle::stability;
26
use rustc_middle::ty;
27 28
use rustc_session::lint::builtin::{LEGACY_DERIVE_HELPERS, PROC_MACRO_DERIVE_RESOLUTION_FALLBACK};
use rustc_session::lint::builtin::{SOFT_UNSTABLE, UNUSED_MACROS};
29
use rustc_session::lint::BuiltinLintDiagnostics;
30
use rustc_session::parse::feature_err;
31
use rustc_session::Session;
32
use rustc_span::edition::Edition;
33
use rustc_span::hygiene::{self, ExpnData, ExpnId, ExpnKind};
34
use rustc_span::hygiene::{AstPass, MacroKind};
35
use rustc_span::symbol::{kw, sym, Ident, Symbol};
36
use rustc_span::{Span, DUMMY_SP};
37
use std::cell::Cell;
M
Mark Rousskov 已提交
38
use std::{mem, ptr};
39

40
type Res = def::Res<NodeId>;
L
ljedrz 已提交
41

42
/// Binding produced by a `macro_rules` item.
43
/// Not modularized, can shadow previous `macro_rules` bindings, etc.
44
#[derive(Debug)]
45
pub struct MacroRulesBinding<'a> {
46
    crate binding: &'a NameBinding<'a>,
47
    /// `macro_rules` scope into which the `macro_rules` item was planted.
48
    crate parent_macro_rules_scope: MacroRulesScopeRef<'a>,
49
    crate ident: Ident,
50 51
}

A
Alexander Regueiro 已提交
52 53 54
/// The scope introduced by a `macro_rules!` macro.
/// This starts at the macro's definition and ends at the end of the macro's parent
/// module (named or unnamed), or even further if it escapes with `#[macro_use]`.
55
/// Some macro invocations need to introduce `macro_rules` scopes too because they
A
Alexander Regueiro 已提交
56
/// can potentially expand into macro definitions.
57
#[derive(Copy, Clone, Debug)]
58
pub enum MacroRulesScope<'a> {
59
    /// Empty "root" scope at the crate start containing no names.
J
Jeffrey Seyfried 已提交
60
    Empty,
A
Alexander Regueiro 已提交
61
    /// The scope introduced by a `macro_rules!` macro definition.
62
    Binding(&'a MacroRulesBinding<'a>),
A
Alexander Regueiro 已提交
63
    /// The scope introduced by a macro invocation that can potentially
64
    /// create a `macro_rules!` macro definition.
65
    Invocation(ExpnId),
66 67
}

68
/// `macro_rules!` scopes are always kept by reference and inside a cell.
69 70
/// The reason is that we update scopes with value `MacroRulesScope::Invocation(invoc_id)`
/// in-place after `invoc_id` gets expanded.
71 72 73 74 75
/// This helps to avoid uncontrollable growth of `macro_rules!` scope chains,
/// which usually grow lineraly with the number of macro invocations
/// in a module (including derives) and hurt performance.
pub(crate) type MacroRulesScopeRef<'a> = PtrKey<'a, Cell<MacroRulesScope<'a>>>;

76 77 78
// Macro namespace is separated into two sub-namespaces, one for bang macros and
// one for attribute-like macros (attributes, derives).
// We ignore resolutions from one sub-namespace when searching names in scope for another.
79
fn sub_namespace_match(candidate: Option<MacroKind>, requirement: Option<MacroKind>) -> bool {
80
    #[derive(PartialEq)]
M
Mark Rousskov 已提交
81 82 83 84
    enum SubNS {
        Bang,
        AttrLike,
    }
85
    let sub_ns = |kind| match kind {
86 87
        MacroKind::Bang => SubNS::Bang,
        MacroKind::Attr | MacroKind::Derive => SubNS::AttrLike,
88
    };
89 90
    let candidate = candidate.map(sub_ns);
    let requirement = requirement.map(sub_ns);
91
    // "No specific sub-namespace" means "matches anything" for both requirements and candidates.
92
    candidate.is_none() || requirement.is_none() || candidate == requirement
93 94
}

95 96 97
// We don't want to format a path using pretty-printing,
// `format!("{}", path)`, because that tries to insert
// line-breaks and is slow.
98 99
fn fast_print_path(path: &ast::Path) -> Symbol {
    if path.segments.len() == 1 {
100
        path.segments[0].ident.name
101 102 103 104 105 106 107 108 109
    } else {
        let mut path_str = String::with_capacity(64);
        for (i, segment) in path.segments.iter().enumerate() {
            if i != 0 {
                path_str.push_str("::");
            }
            if segment.ident.name != kw::PathRoot {
                path_str.push_str(&segment.ident.as_str())
            }
110
        }
111
        Symbol::intern(&path_str)
112 113 114
    }
}

V
Vadim Petrochenkov 已提交
115
/// The code common between processing `#![register_tool]` and `#![register_attr]`.
116 117 118 119 120 121 122
fn registered_idents(
    sess: &Session,
    attrs: &[ast::Attribute],
    attr_name: Symbol,
    descr: &str,
) -> FxHashSet<Ident> {
    let mut registered = FxHashSet::default();
123
    for attr in sess.filter_by_name(attrs, attr_name) {
124 125
        for nested_meta in attr.meta_item_list().unwrap_or_default() {
            match nested_meta.ident() {
M
Mark Rousskov 已提交
126 127 128 129 130 131 132
                Some(ident) => {
                    if let Some(old_ident) = registered.replace(ident) {
                        let msg = format!("{} `{}` was already registered", descr, ident);
                        sess.struct_span_err(ident.span, &msg)
                            .span_label(old_ident.span, "already registered here")
                            .emit();
                    }
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
                }
                None => {
                    let msg = format!("`{}` only accepts identifiers", attr_name);
                    let span = nested_meta.span();
                    sess.struct_span_err(span, &msg).span_label(span, "not an identifier").emit();
                }
            }
        }
    }
    registered
}

crate fn registered_attrs_and_tools(
    sess: &Session,
    attrs: &[ast::Attribute],
) -> (FxHashSet<Ident>, FxHashSet<Ident>) {
    let registered_attrs = registered_idents(sess, attrs, sym::register_attr, "attribute");
    let mut registered_tools = registered_idents(sess, attrs, sym::register_tool, "tool");
    // We implicitly add `rustfmt` and `clippy` to known tools,
    // but it's not an error to register them explicitly.
    let predefined_tools = [sym::clippy, sym::rustfmt];
    registered_tools.extend(predefined_tools.iter().cloned().map(Ident::with_dummy_span));
    (registered_attrs, registered_tools)
}

158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
// Some feature gates for inner attributes are reported as lints for backward compatibility.
fn soft_custom_inner_attributes_gate(path: &ast::Path, invoc: &Invocation) -> bool {
    match &path.segments[..] {
        // `#![test]`
        [seg] if seg.ident.name == sym::test => return true,
        // `#![rustfmt::skip]` on out-of-line modules
        [seg1, seg2] if seg1.ident.name == sym::rustfmt && seg2.ident.name == sym::skip => {
            if let InvocationKind::Attr { item, .. } = &invoc.kind {
                if let Annotatable::Item(item) = item {
                    if let ItemKind::Mod(_, ModKind::Loaded(_, Inline::No, _)) = item.kind {
                        return true;
                    }
                }
            }
        }
        _ => {}
    }
    false
}

178
impl<'a> ResolverExpand for Resolver<'a> {
179
    fn next_node_id(&mut self) -> NodeId {
M
Mark Rousskov 已提交
180
        self.next_node_id()
181 182
    }

183 184 185 186
    fn resolve_dollar_crates(&mut self) {
        hygiene::update_dollar_crate_names(|ctxt| {
            let ident = Ident::new(kw::DollarCrate, DUMMY_SP.with_ctxt(ctxt));
            match self.resolve_crate_root(ident).kind {
J
Joshua Nelson 已提交
187
                ModuleKind::Def(.., name) if name != kw::Empty => name,
188
                _ => kw::Crate,
189
            }
190
        });
191 192
    }

193
    fn visit_ast_fragment_with_placeholders(&mut self, expansion: ExpnId, fragment: &AstFragment) {
194
        // Integrate the new AST fragment into all the definition and module structures.
195 196
        // We are inside the `expansion` now, but other parent scope components are still the same.
        let parent_scope = ParentScope { expansion, ..self.invocation_parent_scopes[&expansion] };
197 198
        let output_macro_rules_scope = self.build_reduced_graph(fragment, parent_scope);
        self.output_macro_rules_scopes.insert(expansion, output_macro_rules_scope);
199

200
        parent_scope.module.unexpanded_invocations.borrow_mut().remove(&expansion);
201 202
    }

203 204
    fn register_builtin_macro(&mut self, name: Symbol, ext: SyntaxExtensionKind) {
        if self.builtin_macros.insert(name, BuiltinMacroState::NotYetSeen(ext)).is_some() {
M
Mark Rousskov 已提交
205
            self.session
206 207
                .diagnostic()
                .bug(&format!("built-in macro `{}` was already registered", name));
208
        }
209 210
    }

M
Matthew Jasper 已提交
211 212
    // Create a new Expansion with a definition site of the provided module, or
    // a fake empty `#[no_implicit_prelude]` module if no module is provided.
213
    fn expansion_for_ast_pass(
214
        &mut self,
215
        call_site: Span,
216 217 218
        pass: AstPass,
        features: &[Symbol],
        parent_module_id: Option<NodeId>,
219 220 221 222 223 224
    ) -> ExpnId {
        let expn_id = ExpnId::fresh(Some(ExpnData::allow_unstable(
            ExpnKind::AstPass(pass),
            call_site,
            self.session.edition(),
            features.into(),
A
Aaron Hill 已提交
225
            None,
226 227
        )));

228
        let parent_scope = if let Some(module_id) = parent_module_id {
229
            let parent_def_id = self.local_def_id(module_id);
230
            self.definitions.add_parent_module_of_macro_def(expn_id, parent_def_id.to_def_id());
231 232 233 234 235 236 237 238 239
            self.module_map[&parent_def_id]
        } else {
            self.definitions.add_parent_module_of_macro_def(
                expn_id,
                def_id::DefId::local(def_id::CRATE_DEF_INDEX),
            );
            self.empty_module
        };
        self.ast_transform_scopes.insert(expn_id, parent_scope);
240
        expn_id
241 242
    }

243
    fn resolve_imports(&mut self) {
244
        ImportResolver { r: self }.resolve_imports()
245 246
    }

247
    fn resolve_macro_invocation(
M
Mark Rousskov 已提交
248 249 250 251
        &mut self,
        invoc: &Invocation,
        eager_expansion_root: ExpnId,
        force: bool,
252
    ) -> Result<Lrc<SyntaxExtension>, Indeterminate> {
253 254 255 256 257 258 259
        let invoc_id = invoc.expansion_data.id;
        let parent_scope = match self.invocation_parent_scopes.get(&invoc_id) {
            Some(parent_scope) => *parent_scope,
            None => {
                // If there's no entry in the table, then we are resolving an eagerly expanded
                // macro, which should inherit its parent scope from its eager expansion root -
                // the macro that requested this eager expansion.
M
Mark Rousskov 已提交
260 261 262
                let parent_scope = *self
                    .invocation_parent_scopes
                    .get(&eager_expansion_root)
263 264 265 266 267 268
                    .expect("non-eager expansion without a parent scope");
                self.invocation_parent_scopes.insert(invoc_id, parent_scope);
                parent_scope
            }
        };

269 270
        let (path, kind, inner_attr, derives) = match invoc.kind {
            InvocationKind::Attr { ref attr, ref derives, .. } => (
M
Mark Rousskov 已提交
271 272
                &attr.get_normal_item().path,
                MacroKind::Attr,
273
                attr.style == ast::AttrStyle::Inner,
M
Mark Rousskov 已提交
274 275
                self.arenas.alloc_ast_paths(derives),
            ),
276 277
            InvocationKind::Bang { ref mac, .. } => (&mac.path, MacroKind::Bang, false, &[][..]),
            InvocationKind::Derive { ref path, .. } => (path, MacroKind::Derive, false, &[][..]),
278
        };
279

280
        // Derives are not included when `invocations` are collected, so we have to add them here.
281
        let parent_scope = &ParentScope { derives, ..parent_scope };
282
        let supports_macro_expansion = invoc.fragment_kind.supports_macro_expansion();
283
        let node_id = self.lint_node_id(eager_expansion_root);
284 285 286
        let (ext, res) = self.smart_resolve_macro_path(
            path,
            kind,
287
            supports_macro_expansion,
288 289 290 291
            inner_attr,
            parent_scope,
            node_id,
            force,
292
            soft_custom_inner_attributes_gate(path, invoc),
293
        )?;
294

295
        let span = invoc.span();
A
Aaron Hill 已提交
296 297 298 299 300 301
        invoc_id.set_expn_data(ext.expn_data(
            parent_scope.expansion,
            span,
            fast_print_path(path),
            res.opt_def_id(),
        ));
302

A
Aaron Hill 已提交
303
        if let Res::Def(_, _) = res {
C
Camelid 已提交
304
            let normal_module_def_id = self.macro_def_scope(invoc_id).nearest_parent_mod;
305
            self.definitions.add_parent_module_of_macro_def(invoc_id, normal_module_def_id);
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335

            // Gate macro attributes in `#[derive]` output.
            if !self.session.features_untracked().macro_attributes_in_derive_output
                && kind == MacroKind::Attr
                && ext.builtin_name != Some(sym::derive)
            {
                let mut expn_id = parent_scope.expansion;
                loop {
                    // Helper attr table is a quick way to determine whether the attr is `derive`.
                    if self.helper_attrs.contains_key(&expn_id) {
                        feature_err(
                            &self.session.parse_sess,
                            sym::macro_attributes_in_derive_output,
                            path.span,
                            "macro attributes in `#[derive]` output are unstable",
                        )
                        .emit();
                        break;
                    } else {
                        let expn_data = expn_id.expn_data();
                        match expn_data.kind {
                            ExpnKind::Root
                            | ExpnKind::Macro(MacroKind::Bang | MacroKind::Derive, _) => {
                                break;
                            }
                            _ => expn_id = expn_data.parent,
                        }
                    }
                }
            }
336
        }
337

338
        Ok(ext)
339 340
    }

341
    fn check_unused_macros(&mut self) {
342
        for (_, &(node_id, span)) in self.unused_macros.iter() {
343
            self.lint_buffer.buffer_lint(UNUSED_MACROS, node_id, span, "unused macro definition");
E
est31 已提交
344
        }
345
    }
346

347
    fn lint_node_id(&self, expn_id: ExpnId) -> NodeId {
348 349
        // FIXME - make this more precise. This currently returns the NodeId of the
        // nearest closing item - we should try to return the closest parent of the ExpnId
350 351
        self.invocation_parents
            .get(&expn_id)
352
            .map_or(ast::CRATE_NODE_ID, |id| self.def_id_to_node_id[id.0])
353 354
    }

355
    fn has_derive_copy(&self, expn_id: ExpnId) -> bool {
356
        self.containers_deriving_copy.contains(&expn_id)
357 358
    }

359 360 361 362
    fn resolve_derives(
        &mut self,
        expn_id: ExpnId,
        force: bool,
363
        derive_paths: &dyn Fn() -> DeriveResolutions,
364 365 366 367 368 369 370
    ) -> Result<(), Indeterminate> {
        // Block expansion of the container until we resolve all derives in it.
        // This is required for two reasons:
        // - Derive helper attributes are in scope for the item to which the `#[derive]`
        //   is applied, so they have to be produced by the container's expansion rather
        //   than by individual derives.
        // - Derives in the container need to know whether one of them is a built-in `Copy`.
371 372 373 374 375 376 377
        // Temporarily take the data to avoid borrow checker conflicts.
        let mut derive_data = mem::take(&mut self.derive_data);
        let entry = derive_data.entry(expn_id).or_insert_with(|| DeriveData {
            resolutions: derive_paths(),
            helper_attrs: Vec::new(),
            has_derive_copy: false,
        });
378
        let parent_scope = self.invocation_parent_scopes[&expn_id];
379
        for (i, (path, opt_ext)) in entry.resolutions.iter_mut().enumerate() {
380 381 382 383 384 385 386 387 388 389 390 391 392 393
            if opt_ext.is_none() {
                *opt_ext = Some(
                    match self.resolve_macro_path(
                        &path,
                        Some(MacroKind::Derive),
                        &parent_scope,
                        true,
                        force,
                    ) {
                        Ok((Some(ext), _)) => {
                            if !ext.helper_attrs.is_empty() {
                                let last_seg = path.segments.last().unwrap();
                                let span = last_seg.ident.span.normalize_to_macros_2_0();
                                entry.helper_attrs.extend(
394 395 396
                                    ext.helper_attrs
                                        .iter()
                                        .map(|name| (i, Ident::new(*name, span))),
397 398 399 400 401 402 403 404 405 406 407 408 409 410
                                );
                            }
                            entry.has_derive_copy |= ext.builtin_name == Some(sym::Copy);
                            ext
                        }
                        Ok(_) | Err(Determinacy::Determined) => self.dummy_ext(MacroKind::Derive),
                        Err(Determinacy::Undetermined) => {
                            assert!(self.derive_data.is_empty());
                            self.derive_data = derive_data;
                            return Err(Indeterminate);
                        }
                    },
                );
            }
411
        }
412 413 414 415
        // Sort helpers in a stable way independent from the derive resolution order.
        entry.helper_attrs.sort_by_key(|(i, _)| *i);
        self.helper_attrs
            .insert(expn_id, entry.helper_attrs.iter().map(|(_, ident)| *ident).collect());
416 417
        // Mark this derive as having `Copy` either if it has `Copy` itself or if its parent derive
        // has `Copy`, to support cases like `#[derive(Clone, Copy)] #[derive(Debug)]`.
418
        if entry.has_derive_copy || self.has_derive_copy(parent_scope.expansion) {
419 420
            self.containers_deriving_copy.insert(expn_id);
        }
421 422
        assert!(self.derive_data.is_empty());
        self.derive_data = derive_data;
423 424 425
        Ok(())
    }

426 427
    fn take_derive_resolutions(&mut self, expn_id: ExpnId) -> Option<DeriveResolutions> {
        self.derive_data.remove(&expn_id).map(|data| data.resolutions)
428 429
    }

430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
    // The function that implements the resolution logic of `#[cfg_accessible(path)]`.
    // Returns true if the path can certainly be resolved in one of three namespaces,
    // returns false if the path certainly cannot be resolved in any of the three namespaces.
    // Returns `Indeterminate` if we cannot give a certain answer yet.
    fn cfg_accessible(&mut self, expn_id: ExpnId, path: &ast::Path) -> Result<bool, Indeterminate> {
        let span = path.span;
        let path = &Segment::from_path(path);
        let parent_scope = self.invocation_parent_scopes[&expn_id];

        let mut indeterminate = false;
        for ns in [TypeNS, ValueNS, MacroNS].iter().copied() {
            match self.resolve_path(path, Some(ns), &parent_scope, false, span, CrateLint::No) {
                PathResult::Module(ModuleOrUniformRoot::Module(_)) => return Ok(true),
                PathResult::NonModule(partial_res) if partial_res.unresolved_segments() == 0 => {
                    return Ok(true);
                }
                PathResult::Indeterminate => indeterminate = true,
                // FIXME: `resolve_path` is not ready to report partially resolved paths
                // correctly, so we just report an error if the path was reported as unresolved.
                // This needs to be fixed for `cfg_accessible` to be useful.
                PathResult::NonModule(..) | PathResult::Failed { .. } => {}
                PathResult::Module(_) => panic!("unexpected path resolution"),
            }
        }

        if indeterminate {
            return Err(Indeterminate);
        }

        self.session
            .struct_span_err(span, "not sure whether the path is accessible or not")
            .span_note(span, "`cfg_accessible` is not fully implemented")
            .emit();
        Ok(false)
    }
465 466
}

J
John Kåre Alsaker 已提交
467
impl<'a> Resolver<'a> {
468
    /// Resolve macro path with error reporting and recovery.
469 470
    /// Uses dummy syntax extensions for unresolved macros or macros with unexpected resolutions
    /// for better error recovery.
471
    fn smart_resolve_macro_path(
472 473 474
        &mut self,
        path: &ast::Path,
        kind: MacroKind,
475
        supports_macro_expansion: SupportsMacroExpansion,
476
        inner_attr: bool,
477
        parent_scope: &ParentScope<'a>,
478
        node_id: NodeId,
479
        force: bool,
480
        soft_custom_inner_attributes_gate: bool,
481
    ) -> Result<(Lrc<SyntaxExtension>, Res), Indeterminate> {
M
Mark Rousskov 已提交
482 483
        let (ext, res) = match self.resolve_macro_path(path, Some(kind), parent_scope, true, force)
        {
484 485 486 487 488
            Ok((Some(ext), res)) => (ext, res),
            Ok((None, res)) => (self.dummy_ext(kind), res),
            Err(Determinacy::Determined) => (self.dummy_ext(kind), Res::Err),
            Err(Determinacy::Undetermined) => return Err(Indeterminate),
        };
489

490
        // Report errors for the resolved macro.
491 492 493
        for segment in &path.segments {
            if let Some(args) = &segment.args {
                self.session.span_err(args.span(), "generic arguments in macro path");
494
            }
495 496 497 498 499
            if kind == MacroKind::Attr && segment.ident.as_str().starts_with("rustc") {
                self.session.span_err(
                    segment.ident.span,
                    "attributes starting with `rustc` are reserved for use by the `rustc` compiler",
                );
500
            }
501
        }
502

503
        match res {
504
            Res::Def(DefKind::Macro(_), def_id) => {
505 506 507
                if let Some(def_id) = def_id.as_local() {
                    self.unused_macros.remove(&def_id);
                    if self.proc_macro_stubs.contains(&def_id) {
508 509 510 511 512
                        self.session.span_err(
                            path.span,
                            "can't use a procedural macro from the same crate that defines it",
                        );
                    }
513
                }
514
            }
515
            Res::NonMacroAttr(..) | Res::Err => {}
516
            _ => panic!("expected `DefKind::Macro` or `Res::NonMacroAttr`"),
517
        };
518

519
        self.check_stability_and_deprecation(&ext, path, node_id);
520

521 522
        let unexpected_res = if ext.macro_kind() != kind {
            Some((kind.article(), kind.descr_expected()))
523 524 525 526 527 528 529 530 531 532 533
        } else if matches!(res, Res::Def(..)) {
            match supports_macro_expansion {
                SupportsMacroExpansion::No => Some(("a", "non-macro attribute")),
                SupportsMacroExpansion::Yes { supports_inner_attrs } => {
                    if inner_attr && !supports_inner_attrs {
                        Some(("a", "non-macro inner attribute"))
                    } else {
                        None
                    }
                }
            }
534 535 536 537
        } else {
            None
        };
        if let Some((article, expected)) = unexpected_res {
538 539
            let path_str = pprust::path_to_string(path);
            let msg = format!("expected {}, found {} `{}`", expected, res.descr(), path_str);
M
Mark Rousskov 已提交
540 541
            self.session
                .struct_span_err(path.span, &msg)
542
                .span_label(path.span, format!("not {} {}", article, expected))
M
Mark Rousskov 已提交
543
                .emit();
544 545 546 547
            return Ok((self.dummy_ext(kind), Res::Err));
        }

        // We are trying to avoid reporting this error if other related errors were reported.
548 549
        if res != Res::Err
            && inner_attr
550 551
            && !self.session.features_untracked().custom_inner_attributes
        {
552 553 554 555 556
            let msg = match res {
                Res::Def(..) => "inner macro attributes are unstable",
                Res::NonMacroAttr(..) => "custom inner attributes are unstable",
                _ => unreachable!(),
            };
557
            if soft_custom_inner_attributes_gate {
558 559 560 561 562
                self.session.parse_sess.buffer_lint(SOFT_UNSTABLE, path.span, node_id, msg);
            } else {
                feature_err(&self.session.parse_sess, sym::custom_inner_attributes, path.span, msg)
                    .emit();
            }
563 564 565
        }

        Ok((ext, res))
566
    }
567

568
    pub fn resolve_macro_path(
569 570
        &mut self,
        path: &ast::Path,
571
        kind: Option<MacroKind>,
572
        parent_scope: &ParentScope<'a>,
573
        trace: bool,
574
        force: bool,
575
    ) -> Result<(Option<Lrc<SyntaxExtension>>, Res), Determinacy> {
576
        let path_span = path.span;
N
Nick Cameron 已提交
577
        let mut path = Segment::from_path(path);
578

579
        // Possibly apply the macro helper hack
M
Mark Rousskov 已提交
580 581 582 583
        if kind == Some(MacroKind::Bang)
            && path.len() == 1
            && path[0].ident.span.ctxt().outer_expn_data().local_inner_macros
        {
584
            let root = Ident::new(kw::DollarCrate, path[0].ident.span);
N
Nick Cameron 已提交
585
            path.insert(0, Segment::from_ident(root));
586 587
        }

588
        let res = if path.len() > 1 {
M
Mark Rousskov 已提交
589 590 591 592 593 594 595 596
            let res = match self.resolve_path(
                &path,
                Some(MacroNS),
                parent_scope,
                false,
                path_span,
                CrateLint::No,
            ) {
597
                PathResult::NonModule(path_res) if path_res.unresolved_segments() == 0 => {
598
                    Ok(path_res.base_res())
599
                }
600
                PathResult::Indeterminate if !force => return Err(Determinacy::Undetermined),
601 602 603
                PathResult::NonModule(..)
                | PathResult::Indeterminate
                | PathResult::Failed { .. } => Err(Determinacy::Determined),
604
                PathResult::Module(..) => unreachable!(),
605
            };
606

607
            if trace {
608
                let kind = kind.expect("macro kind must be specified if tracing is enabled");
M
Mark Rousskov 已提交
609 610 611 612 613 614 615
                self.multi_segment_macro_resolutions.push((
                    path,
                    path_span,
                    kind,
                    *parent_scope,
                    res.ok(),
                ));
616
            }
617

618 619
            self.prohibit_imported_non_macro_attrs(None, res.ok(), path_span);
            res
620
        } else {
621
            let scope_set = kind.map_or(ScopeSet::All(MacroNS, false), ScopeSet::Macro);
622
            let binding = self.early_resolve_ident_in_lexical_scope(
M
Mark Rousskov 已提交
623 624 625 626 627 628
                path[0].ident,
                scope_set,
                parent_scope,
                false,
                force,
                path_span,
629
            );
630 631
            if let Err(Determinacy::Undetermined) = binding {
                return Err(Determinacy::Undetermined);
632
            }
633

634
            if trace {
635
                let kind = kind.expect("macro kind must be specified if tracing is enabled");
M
Mark Rousskov 已提交
636 637 638 639 640 641
                self.single_segment_macro_resolutions.push((
                    path[0].ident,
                    kind,
                    *parent_scope,
                    binding.ok(),
                ));
642
            }
643

644 645 646
            let res = binding.map(|binding| binding.res());
            self.prohibit_imported_non_macro_attrs(binding.ok(), res.ok(), path_span);
            res
647 648 649
        };

        res.map(|res| (self.get_macro(res), res))
650
    }
651

652
    // Resolve an identifier in lexical scope.
653 654
    // This is a variation of `fn resolve_ident_in_lexical_scope` that can be run during
    // expansion and import resolution (perhaps they can be merged in the future).
655
    // The function is used for resolving initial segments of macro paths (e.g., `foo` in
656
    // `foo::bar!(); or `foo!();`) and also for import paths on 2018 edition.
657
    crate fn early_resolve_ident_in_lexical_scope(
658
        &mut self,
659
        orig_ident: Ident,
660
        scope_set: ScopeSet<'a>,
661
        parent_scope: &ParentScope<'a>,
662 663
        record_used: bool,
        force: bool,
664
        path_span: Span,
665
    ) -> Result<&'a NameBinding<'a>, Determinacy> {
T
Taiki Endo 已提交
666
        bitflags::bitflags! {
667
            struct Flags: u8 {
668 669
                const MACRO_RULES          = 1 << 0;
                const MODULE               = 1 << 1;
670 671 672
                const MISC_SUGGEST_CRATE   = 1 << 2;
                const MISC_SUGGEST_SELF    = 1 << 3;
                const MISC_FROM_PRELUDE    = 1 << 4;
673 674
            }
        }
675

V
Vadim Petrochenkov 已提交
676
        assert!(force || !record_used); // `record_used` implies `force`
677

678
        // Make sure `self`, `super` etc produce an error when passed to here.
679
        if orig_ident.is_path_segment_keyword() {
680 681 682
            return Err(Determinacy::Determined);
        }

683
        let (ns, macro_kind, is_import) = match scope_set {
684
            ScopeSet::All(ns, is_import) => (ns, None, is_import),
685 686
            ScopeSet::AbsolutePath(ns) => (ns, None, false),
            ScopeSet::Macro(macro_kind) => (MacroNS, Some(macro_kind), false),
687
            ScopeSet::Late(ns, ..) => (ns, None, false),
688 689
        };

690 691 692 693
        // This is *the* result, resolution from the scope closest to the resolved identifier.
        // However, sometimes this result is "weak" because it comes from a glob import or
        // a macro expansion, and in this case it cannot shadow names from outer scopes, e.g.
        // mod m { ... } // solution in outer scope
694
        // {
695 696
        //     use prefix::*; // imports another `m` - innermost solution
        //                    // weak, cannot shadow the outer `m`, need to report ambiguity error
697 698
        //     m::mac!();
        // }
699 700
        // So we have to save the innermost solution and continue searching in outer scopes
        // to detect potential ambiguities.
T
Taiki Endo 已提交
701
        let mut innermost_result: Option<(&NameBinding<'_>, Flags)> = None;
702
        let mut determinacy = Determinacy::Determined;
703 704

        // Go through all the scopes and try to resolve the name.
M
Mark Rousskov 已提交
705 706 707
        let break_result = self.visit_scopes(
            scope_set,
            parent_scope,
708 709 710
            orig_ident.span.ctxt(),
            |this, scope, use_prelude, ctxt| {
                let ident = Ident::new(orig_ident.name, orig_ident.span.with_ctxt(ctxt));
M
Mark Rousskov 已提交
711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734
                let ok = |res, span, arenas| {
                    Ok((
                        (res, ty::Visibility::Public, span, ExpnId::root()).to_name_binding(arenas),
                        Flags::empty(),
                    ))
                };
                let result = match scope {
                    Scope::DeriveHelpers(expn_id) => {
                        if let Some(attr) = this
                            .helper_attrs
                            .get(&expn_id)
                            .and_then(|attrs| attrs.iter().rfind(|i| ident == **i))
                        {
                            let binding = (
                                Res::NonMacroAttr(NonMacroAttrKind::DeriveHelper),
                                ty::Visibility::Public,
                                attr.span,
                                expn_id,
                            )
                                .to_name_binding(this.arenas);
                            Ok((binding, Flags::empty()))
                        } else {
                            Err(Determinacy::Determined)
                        }
735
                    }
M
Mark Rousskov 已提交
736 737 738 739 740 741 742 743 744 745 746 747 748
                    Scope::DeriveHelpersCompat => {
                        let mut result = Err(Determinacy::Determined);
                        for derive in parent_scope.derives {
                            let parent_scope = &ParentScope { derives: &[], ..*parent_scope };
                            match this.resolve_macro_path(
                                derive,
                                Some(MacroKind::Derive),
                                parent_scope,
                                true,
                                force,
                            ) {
                                Ok((Some(ext), _)) => {
                                    if ext.helper_attrs.contains(&ident.name) {
749 750
                                        result = ok(
                                            Res::NonMacroAttr(NonMacroAttrKind::DeriveHelperCompat),
M
Mark Rousskov 已提交
751
                                            derive.span,
752 753
                                            this.arenas,
                                        );
M
Mark Rousskov 已提交
754 755 756 757 758 759 760
                                        break;
                                    }
                                }
                                Ok(_) | Err(Determinacy::Determined) => {}
                                Err(Determinacy::Undetermined) => {
                                    result = Err(Determinacy::Undetermined)
                                }
761 762
                            }
                        }
M
Mark Rousskov 已提交
763
                        result
764
                    }
765
                    Scope::MacroRules(macro_rules_scope) => match macro_rules_scope.get() {
766 767 768 769
                        MacroRulesScope::Binding(macro_rules_binding)
                            if ident == macro_rules_binding.ident =>
                        {
                            Ok((macro_rules_binding.binding, Flags::MACRO_RULES))
770
                        }
771
                        MacroRulesScope::Invocation(_) => Err(Determinacy::Undetermined),
M
Mark Rousskov 已提交
772 773 774 775 776 777 778
                        _ => Err(Determinacy::Determined),
                    },
                    Scope::CrateRoot => {
                        let root_ident = Ident::new(kw::PathRoot, ident.span);
                        let root_module = this.resolve_crate_root(root_ident);
                        let binding = this.resolve_ident_in_module_ext(
                            ModuleOrUniformRoot::Module(root_module),
779 780
                            ident,
                            ns,
781
                            parent_scope,
M
Mark Rousskov 已提交
782
                            record_used,
783
                            path_span,
M
Mark Rousskov 已提交
784 785 786 787 788 789 790 791
                        );
                        match binding {
                            Ok(binding) => Ok((binding, Flags::MODULE | Flags::MISC_SUGGEST_CRATE)),
                            Err((Determinacy::Undetermined, Weak::No)) => {
                                return Some(Err(Determinacy::determined(force)));
                            }
                            Err((Determinacy::Undetermined, Weak::Yes)) => {
                                Err(Determinacy::Undetermined)
792
                            }
M
Mark Rousskov 已提交
793
                            Err((Determinacy::Determined, _)) => Err(Determinacy::Determined),
794 795
                        }
                    }
796
                    Scope::Module(module, derive_fallback_lint_id) => {
M
Mark Rousskov 已提交
797 798 799 800 801 802
                        let adjusted_parent_scope = &ParentScope { module, ..*parent_scope };
                        let binding = this.resolve_ident_in_module_unadjusted_ext(
                            ModuleOrUniformRoot::Module(module),
                            ident,
                            ns,
                            adjusted_parent_scope,
803
                            !matches!(scope_set, ScopeSet::Late(..)),
M
Mark Rousskov 已提交
804 805 806 807 808
                            record_used,
                            path_span,
                        );
                        match binding {
                            Ok(binding) => {
809 810 811 812 813 814 815 816 817 818 819 820 821 822 823
                                if let Some(lint_id) = derive_fallback_lint_id {
                                    this.lint_buffer.buffer_lint_with_diagnostic(
                                        PROC_MACRO_DERIVE_RESOLUTION_FALLBACK,
                                        lint_id,
                                        orig_ident.span,
                                        &format!(
                                            "cannot find {} `{}` in this scope",
                                            ns.descr(),
                                            ident
                                        ),
                                        BuiltinLintDiagnostics::ProcMacroDeriveResolutionFallback(
                                            orig_ident.span,
                                        ),
                                    );
                                }
M
Mark Rousskov 已提交
824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859
                                let misc_flags = if ptr::eq(module, this.graph_root) {
                                    Flags::MISC_SUGGEST_CRATE
                                } else if module.is_normal() {
                                    Flags::MISC_SUGGEST_SELF
                                } else {
                                    Flags::empty()
                                };
                                Ok((binding, Flags::MODULE | misc_flags))
                            }
                            Err((Determinacy::Undetermined, Weak::No)) => {
                                return Some(Err(Determinacy::determined(force)));
                            }
                            Err((Determinacy::Undetermined, Weak::Yes)) => {
                                Err(Determinacy::Undetermined)
                            }
                            Err((Determinacy::Determined, _)) => Err(Determinacy::Determined),
                        }
                    }
                    Scope::RegisteredAttrs => match this.registered_attrs.get(&ident).cloned() {
                        Some(ident) => ok(
                            Res::NonMacroAttr(NonMacroAttrKind::Registered),
                            ident.span,
                            this.arenas,
                        ),
                        None => Err(Determinacy::Determined),
                    },
                    Scope::MacroUsePrelude => {
                        match this.macro_use_prelude.get(&ident.name).cloned() {
                            Some(binding) => Ok((binding, Flags::MISC_FROM_PRELUDE)),
                            None => Err(Determinacy::determined(
                                this.graph_root.unexpanded_invocations.borrow().is_empty(),
                            )),
                        }
                    }
                    Scope::BuiltinAttrs => {
                        if is_builtin_attr_name(ident.name) {
860 861 862 863 864
                            ok(
                                Res::NonMacroAttr(NonMacroAttrKind::Builtin(ident.name)),
                                DUMMY_SP,
                                this.arenas,
                            )
M
Mark Rousskov 已提交
865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895
                        } else {
                            Err(Determinacy::Determined)
                        }
                    }
                    Scope::ExternPrelude => match this.extern_prelude_get(ident, !record_used) {
                        Some(binding) => Ok((binding, Flags::empty())),
                        None => Err(Determinacy::determined(
                            this.graph_root.unexpanded_invocations.borrow().is_empty(),
                        )),
                    },
                    Scope::ToolPrelude => match this.registered_tools.get(&ident).cloned() {
                        Some(ident) => ok(Res::ToolMod, ident.span, this.arenas),
                        None => Err(Determinacy::Determined),
                    },
                    Scope::StdLibPrelude => {
                        let mut result = Err(Determinacy::Determined);
                        if let Some(prelude) = this.prelude {
                            if let Ok(binding) = this.resolve_ident_in_module_unadjusted(
                                ModuleOrUniformRoot::Module(prelude),
                                ident,
                                ns,
                                parent_scope,
                                false,
                                path_span,
                            ) {
                                if use_prelude || this.is_builtin_macro(binding.res()) {
                                    result = Ok((binding, Flags::MISC_FROM_PRELUDE));
                                }
                            }
                        }
                        result
896
                    }
897 898 899 900
                    Scope::BuiltinTypes => match PrimTy::from_name(ident.name) {
                        Some(prim_ty) => ok(Res::PrimTy(prim_ty), DUMMY_SP, this.arenas),
                        None => Err(Determinacy::Determined),
                    },
M
Mark Rousskov 已提交
901 902 903 904 905 906
                };

                match result {
                    Ok((binding, flags))
                        if sub_namespace_match(binding.macro_kind(), macro_kind) =>
                    {
907
                        if !record_used || matches!(scope_set, ScopeSet::Late(..)) {
M
Mark Rousskov 已提交
908 909 910 911 912 913 914
                            return Some(Ok(binding));
                        }

                        if let Some((innermost_binding, innermost_flags)) = innermost_result {
                            // Found another solution, if the first one was "weak", report an error.
                            let (res, innermost_res) = (binding.res(), innermost_binding.res());
                            if res != innermost_res {
915 916 917
                                let is_builtin = |res| {
                                    matches!(res, Res::NonMacroAttr(NonMacroAttrKind::Builtin(..)))
                                };
918 919
                                let derive_helper =
                                    Res::NonMacroAttr(NonMacroAttrKind::DeriveHelper);
920 921
                                let derive_helper_compat =
                                    Res::NonMacroAttr(NonMacroAttrKind::DeriveHelperCompat);
922

M
Mark Rousskov 已提交
923 924
                                let ambiguity_error_kind = if is_import {
                                    Some(AmbiguityKind::Import)
925
                                } else if is_builtin(innermost_res) || is_builtin(res) {
M
Mark Rousskov 已提交
926
                                    Some(AmbiguityKind::BuiltinAttr)
927
                                } else if innermost_res == derive_helper_compat
928
                                    || res == derive_helper_compat && innermost_res != derive_helper
M
Mark Rousskov 已提交
929 930 931 932
                                {
                                    Some(AmbiguityKind::DeriveHelper)
                                } else if innermost_flags.contains(Flags::MACRO_RULES)
                                    && flags.contains(Flags::MODULE)
933 934 935 936
                                    && !this.disambiguate_macro_rules_vs_modularized(
                                        innermost_binding,
                                        binding,
                                    )
M
Mark Rousskov 已提交
937 938
                                    || flags.contains(Flags::MACRO_RULES)
                                        && innermost_flags.contains(Flags::MODULE)
939
                                        && !this.disambiguate_macro_rules_vs_modularized(
M
Mark Rousskov 已提交
940 941 942 943
                                            binding,
                                            innermost_binding,
                                        )
                                {
944
                                    Some(AmbiguityKind::MacroRulesVsModularized)
M
Mark Rousskov 已提交
945 946 947 948 949 950
                                } else if innermost_binding.is_glob_import() {
                                    Some(AmbiguityKind::GlobVsOuter)
                                } else if innermost_binding
                                    .may_appear_after(parent_scope.expansion, binding)
                                {
                                    Some(AmbiguityKind::MoreExpandedVsOuter)
951
                                } else {
M
Mark Rousskov 已提交
952
                                    None
953
                                };
M
Mark Rousskov 已提交
954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975
                                if let Some(kind) = ambiguity_error_kind {
                                    let misc = |f: Flags| {
                                        if f.contains(Flags::MISC_SUGGEST_CRATE) {
                                            AmbiguityErrorMisc::SuggestCrate
                                        } else if f.contains(Flags::MISC_SUGGEST_SELF) {
                                            AmbiguityErrorMisc::SuggestSelf
                                        } else if f.contains(Flags::MISC_FROM_PRELUDE) {
                                            AmbiguityErrorMisc::FromPrelude
                                        } else {
                                            AmbiguityErrorMisc::None
                                        }
                                    };
                                    this.ambiguity_errors.push(AmbiguityError {
                                        kind,
                                        ident: orig_ident,
                                        b1: innermost_binding,
                                        b2: binding,
                                        misc1: misc(innermost_flags),
                                        misc2: misc(flags),
                                    });
                                    return Some(Ok(innermost_binding));
                                }
976
                            }
M
Mark Rousskov 已提交
977 978 979
                        } else {
                            // Found the first solution.
                            innermost_result = Some((binding, flags));
980
                        }
981
                    }
M
Mark Rousskov 已提交
982 983
                    Ok(..) | Err(Determinacy::Determined) => {}
                    Err(Determinacy::Undetermined) => determinacy = Determinacy::Undetermined,
984
                }
985

M
Mark Rousskov 已提交
986 987 988
                None
            },
        );
989

990 991
        if let Some(break_result) = break_result {
            return break_result;
992
        }
993

994
        // The first found solution was the only one, return it.
995
        if let Some((binding, _)) = innermost_result {
996
            return Ok(binding);
997
        }
998

999
        Err(Determinacy::determined(determinacy == Determinacy::Determined || force))
1000 1001
    }

1002
    crate fn finalize_macro_resolutions(&mut self) {
M
Mark Rousskov 已提交
1003 1004 1005 1006 1007 1008
        let check_consistency = |this: &mut Self,
                                 path: &[Segment],
                                 span,
                                 kind: MacroKind,
                                 initial_res: Option<Res>,
                                 res: Res| {
1009
            if let Some(initial_res) = initial_res {
1010
                if res != initial_res {
1011 1012
                    // Make sure compilation does not succeed if preferred macro resolution
                    // has changed after the macro had been expanded. In theory all such
1013 1014
                    // situations should be reported as errors, so this is a bug.
                    this.session.delay_span_bug(span, "inconsistent resolution for a macro");
1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
                }
            } else {
                // It's possible that the macro was unresolved (indeterminate) and silently
                // expanded into a dummy fragment for recovery during expansion.
                // Now, post-expansion, the resolution may succeed, but we can't change the
                // past and need to report an error.
                // However, non-speculative `resolve_path` can successfully return private items
                // even if speculative `resolve_path` returned nothing previously, so we skip this
                // less informative error if the privacy error is reported elsewhere.
                if this.privacy_errors.is_empty() {
M
Mark Rousskov 已提交
1025 1026 1027 1028 1029
                    let msg = format!(
                        "cannot determine resolution for the {} `{}`",
                        kind.descr(),
                        Segment::names_to_string(path)
                    );
1030 1031 1032 1033 1034 1035
                    let msg_note = "import resolution is stuck, try simplifying macro imports";
                    this.session.struct_span_err(span, &msg).note(msg_note).emit();
                }
            }
        };

1036
        let macro_resolutions = mem::take(&mut self.multi_segment_macro_resolutions);
1037
        for (mut path, path_span, kind, parent_scope, initial_res) in macro_resolutions {
1038
            // FIXME: Path resolution will ICE if segment IDs present.
M
Mark Rousskov 已提交
1039 1040 1041
            for seg in &mut path {
                seg.id = None;
            }
1042
            match self.resolve_path(
M
Mark Rousskov 已提交
1043 1044 1045 1046 1047 1048
                &path,
                Some(MacroNS),
                &parent_scope,
                true,
                path_span,
                CrateLint::No,
1049
            ) {
1050
                PathResult::NonModule(path_res) if path_res.unresolved_segments() == 0 => {
1051 1052
                    let res = path_res.base_res();
                    check_consistency(self, &path, path_span, kind, initial_res, res);
1053
                }
1054 1055 1056
                path_res @ PathResult::NonModule(..) | path_res @ PathResult::Failed { .. } => {
                    let (span, label) = if let PathResult::Failed { span, label, .. } = path_res {
                        (span, label)
1057
                    } else {
M
Mark Rousskov 已提交
1058 1059 1060 1061 1062 1063 1064 1065
                        (
                            path_span,
                            format!(
                                "partially resolved path in {} {}",
                                kind.article(),
                                kind.descr()
                            ),
                        )
1066
                    };
M
Mark Rousskov 已提交
1067 1068 1069 1070
                    self.report_error(
                        span,
                        ResolutionError::FailedToResolve { label, suggestion: None },
                    );
1071
                }
1072
                PathResult::Module(..) | PathResult::Indeterminate => unreachable!(),
1073 1074 1075
            }
        }

1076
        let macro_resolutions = mem::take(&mut self.single_segment_macro_resolutions);
1077
        for (ident, kind, parent_scope, initial_binding) in macro_resolutions {
M
Mark Rousskov 已提交
1078 1079 1080 1081 1082 1083 1084 1085
            match self.early_resolve_ident_in_lexical_scope(
                ident,
                ScopeSet::Macro(kind),
                &parent_scope,
                true,
                true,
                ident.span,
            ) {
1086
                Ok(binding) => {
1087
                    let initial_res = initial_binding.map(|initial_binding| {
1088
                        self.record_use(ident, MacroNS, initial_binding, false);
1089
                        initial_binding.res()
1090
                    });
1091
                    let res = binding.res();
V
Vadim Petrochenkov 已提交
1092
                    let seg = Segment::from_ident(ident);
1093
                    check_consistency(self, &[seg], ident.span, kind, initial_res, res);
1094 1095 1096 1097 1098 1099 1100 1101 1102
                    if res == Res::NonMacroAttr(NonMacroAttrKind::DeriveHelperCompat) {
                        self.lint_buffer.buffer_lint_with_diagnostic(
                            LEGACY_DERIVE_HELPERS,
                            self.lint_node_id(parent_scope.expansion),
                            ident.span,
                            "derive helper attribute is used before it is introduced",
                            BuiltinLintDiagnostics::LegacyDeriveHelpers(binding.span),
                        );
                    }
1103
                }
1104
                Err(..) => {
1105
                    let expected = kind.descr_expected();
1106
                    let msg = format!("cannot find {} `{}` in this scope", expected, ident);
1107
                    let mut err = self.session.struct_span_err(ident.span, &msg);
1108
                    self.unresolved_macro_suggestions(&mut err, kind, &parent_scope, ident);
1109
                    err.emit();
1110
                }
1111
            }
J
Jeffrey Seyfried 已提交
1112
        }
1113

1114
        let builtin_attrs = mem::take(&mut self.builtin_attrs);
1115
        for (ident, parent_scope) in builtin_attrs {
1116
            let _ = self.early_resolve_ident_in_lexical_scope(
M
Mark Rousskov 已提交
1117 1118 1119 1120 1121 1122
                ident,
                ScopeSet::Macro(MacroKind::Attr),
                &parent_scope,
                true,
                true,
                ident.span,
1123
            );
1124
        }
1125
    }
1126

1127 1128 1129 1130 1131 1132
    fn check_stability_and_deprecation(
        &mut self,
        ext: &SyntaxExtension,
        path: &ast::Path,
        node_id: NodeId,
    ) {
1133
        let span = path.span;
1134
        if let Some(stability) = &ext.stability {
1135
            if let StabilityLevel::Unstable { reason, issue, is_soft } = stability.level {
1136 1137
                let feature = stability.feature;
                if !self.active_features.contains(&feature) && !span.allows_unstable(feature) {
1138
                    let lint_buffer = &mut self.lint_buffer;
M
Mark Rousskov 已提交
1139 1140
                    let soft_handler =
                        |lint, span, msg: &_| lint_buffer.buffer_lint(lint, node_id, span, msg);
1141
                    stability::report_unstable(
M
Mark Rousskov 已提交
1142 1143 1144 1145 1146 1147 1148
                        self.session,
                        feature,
                        reason,
                        issue,
                        is_soft,
                        span,
                        soft_handler,
1149
                    );
1150 1151 1152 1153
                }
            }
        }
        if let Some(depr) = &ext.deprecation {
1154
            let path = pprust::path_to_string(&path);
1155
            let (message, lint) = stability::deprecation_message(depr, "macro", &path);
1156 1157 1158 1159 1160 1161
            stability::early_report_deprecation(
                &mut self.lint_buffer,
                &message,
                depr.suggestion,
                lint,
                span,
1162
                node_id,
1163
            );
1164 1165 1166
        }
    }

M
Mark Rousskov 已提交
1167 1168 1169 1170 1171 1172
    fn prohibit_imported_non_macro_attrs(
        &self,
        binding: Option<&'a NameBinding<'a>>,
        res: Option<Res>,
        span: Span,
    ) {
1173
        if let Some(Res::NonMacroAttr(kind)) = res {
1174
            if kind != NonMacroAttrKind::Tool && binding.map_or(true, |b| b.is_import()) {
V
Vadim Petrochenkov 已提交
1175 1176
                let msg =
                    format!("cannot use {} {} through an import", kind.article(), kind.descr());
1177 1178 1179 1180 1181 1182 1183 1184 1185
                let mut err = self.session.struct_span_err(span, &msg);
                if let Some(binding) = binding {
                    err.span_note(binding.span, &format!("the {} imported here", kind.descr()));
                }
                err.emit();
            }
        }
    }

1186 1187 1188
    crate fn check_reserved_macro_name(&mut self, ident: Ident, res: Res) {
        // Reserve some names that are not quite covered by the general check
        // performed on `Resolver::builtin_attrs`.
1189
        if ident.name == sym::cfg || ident.name == sym::cfg_attr {
1190
            let macro_kind = self.get_macro(res).map(|ext| ext.macro_kind());
1191 1192
            if macro_kind.is_some() && sub_namespace_match(macro_kind, Some(MacroKind::Attr)) {
                self.session.span_err(
M
Mark Rousskov 已提交
1193 1194
                    ident.span,
                    &format!("name `{}` is reserved in attribute namespace", ident),
1195 1196 1197 1198 1199
                );
            }
        }
    }

1200 1201
    /// Compile the macro into a `SyntaxExtension` and possibly replace
    /// its expander to a pre-defined one for built-in macros.
1202
    crate fn compile_macro(&mut self, item: &ast::Item, edition: Edition) -> SyntaxExtension {
1203
        let mut result = compile_declarative_macro(
1204
            &self.session,
M
Mark Rousskov 已提交
1205 1206 1207
            self.session.features_untracked(),
            item,
            edition,
1208 1209
        );

1210
        if let Some(builtin_name) = result.builtin_name {
1211
            // The macro was marked with `#[rustc_builtin_macro]`.
1212
            if let Some(builtin_macro) = self.builtin_macros.get_mut(&builtin_name) {
1213 1214
                // The macro is a built-in, replace its expander function
                // while still taking everything else from the source code.
1215 1216
                // If we already loaded this builtin macro, give a better error message than 'no such builtin macro'.
                match mem::replace(builtin_macro, BuiltinMacroState::AlreadySeen(item.span)) {
1217
                    BuiltinMacroState::NotYetSeen(ext) => result.kind = ext,
1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228
                    BuiltinMacroState::AlreadySeen(span) => {
                        struct_span_err!(
                            self.session,
                            item.span,
                            E0773,
                            "attempted to define built-in macro more than once"
                        )
                        .span_note(span, "previously defined here")
                        .emit();
                    }
                }
1229 1230 1231 1232 1233 1234
            } else {
                let msg = format!("cannot find a built-in macro with name `{}`", item.ident);
                self.session.span_err(item.span, &msg);
            }
        }

1235
        result
1236
    }
1237
}