macros.rs 49.1 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};
M
Mark Rousskov 已提交
7 8
use crate::{CrateLint, ParentScope, ResolutionError, Resolver, Scope, ScopeSet, Weak};
use crate::{ModuleKind, ModuleOrUniformRoot, NameBinding, PathResult, Segment, ToNameBinding};
U
Ujjwal Sharma 已提交
9
use rustc_ast::{self as ast, 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
use rustc_expand::base::{Indeterminate, InvocationRes, ResolverExpand, SyntaxExtension};
18
use rustc_expand::compile_declarative_macro;
19
use rustc_expand::expand::{AstFragment, Invocation, InvocationKind};
20
use rustc_feature::is_builtin_attr_name;
21 22
use rustc_hir::def::{self, DefKind, NonMacroAttrKind};
use rustc_hir::def_id;
23
use rustc_middle::middle::stability;
24
use rustc_middle::ty;
25
use rustc_session::lint::builtin::{SOFT_UNSTABLE, UNUSED_MACROS};
26
use rustc_session::parse::feature_err;
27
use rustc_session::Session;
28
use rustc_span::edition::Edition;
29
use rustc_span::hygiene::{self, ExpnData, ExpnId, ExpnKind};
30
use rustc_span::hygiene::{AstPass, MacroKind};
31
use rustc_span::symbol::{kw, sym, Ident, Symbol};
32
use rustc_span::{Span, DUMMY_SP};
33
use std::cell::Cell;
M
Mark Rousskov 已提交
34
use std::{mem, ptr};
35

36
type Res = def::Res<NodeId>;
L
ljedrz 已提交
37

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

A
Alexander Regueiro 已提交
48 49 50
/// 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]`.
51
/// Some macro invocations need to introduce `macro_rules` scopes too because they
A
Alexander Regueiro 已提交
52
/// can potentially expand into macro definitions.
53
#[derive(Copy, Clone, Debug)]
54
pub enum MacroRulesScope<'a> {
55
    /// Empty "root" scope at the crate start containing no names.
J
Jeffrey Seyfried 已提交
56
    Empty,
A
Alexander Regueiro 已提交
57
    /// The scope introduced by a `macro_rules!` macro definition.
58
    Binding(&'a MacroRulesBinding<'a>),
A
Alexander Regueiro 已提交
59
    /// The scope introduced by a macro invocation that can potentially
60
    /// create a `macro_rules!` macro definition.
61
    Invocation(ExpnId),
62 63
}

64
/// `macro_rules!` scopes are always kept by reference and inside a cell.
65 66
/// The reason is that we update scopes with value `MacroRulesScope::Invocation(invoc_id)`
/// in-place after `invoc_id` gets expanded.
67 68 69 70 71
/// 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>>>;

72 73 74
// 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.
75
fn sub_namespace_match(candidate: Option<MacroKind>, requirement: Option<MacroKind>) -> bool {
76
    #[derive(PartialEq)]
M
Mark Rousskov 已提交
77 78 79 80
    enum SubNS {
        Bang,
        AttrLike,
    }
81
    let sub_ns = |kind| match kind {
82 83
        MacroKind::Bang => SubNS::Bang,
        MacroKind::Attr | MacroKind::Derive => SubNS::AttrLike,
84
    };
85 86
    let candidate = candidate.map(sub_ns);
    let requirement = requirement.map(sub_ns);
87
    // "No specific sub-namespace" means "matches anything" for both requirements and candidates.
88
    candidate.is_none() || requirement.is_none() || candidate == requirement
89 90
}

91 92 93
// We don't want to format a path using pretty-printing,
// `format!("{}", path)`, because that tries to insert
// line-breaks and is slow.
94 95
fn fast_print_path(path: &ast::Path) -> Symbol {
    if path.segments.len() == 1 {
96
        path.segments[0].ident.name
97 98 99 100 101 102 103 104 105
    } 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())
            }
106
        }
107
        Symbol::intern(&path_str)
108 109 110
    }
}

V
Vadim Petrochenkov 已提交
111
/// The code common between processing `#![register_tool]` and `#![register_attr]`.
112 113 114 115 116 117 118
fn registered_idents(
    sess: &Session,
    attrs: &[ast::Attribute],
    attr_name: Symbol,
    descr: &str,
) -> FxHashSet<Ident> {
    let mut registered = FxHashSet::default();
119
    for attr in sess.filter_by_name(attrs, attr_name) {
120 121
        for nested_meta in attr.meta_item_list().unwrap_or_default() {
            match nested_meta.ident() {
M
Mark Rousskov 已提交
122 123 124 125 126 127 128
                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();
                    }
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
                }
                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)
}

154
impl<'a> ResolverExpand for Resolver<'a> {
155
    fn next_node_id(&mut self) -> NodeId {
M
Mark Rousskov 已提交
156
        self.next_node_id()
157 158
    }

159 160 161 162
    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 已提交
163
                ModuleKind::Def(.., name) if name != kw::Empty => name,
164
                _ => kw::Crate,
165
            }
166
        });
167 168
    }

169
    fn visit_ast_fragment_with_placeholders(&mut self, expansion: ExpnId, fragment: &AstFragment) {
170
        // Integrate the new AST fragment into all the definition and module structures.
171 172
        // 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] };
173 174
        let output_macro_rules_scope = self.build_reduced_graph(fragment, parent_scope);
        self.output_macro_rules_scopes.insert(expansion, output_macro_rules_scope);
175

176
        parent_scope.module.unexpanded_invocations.borrow_mut().remove(&expansion);
177 178
    }

179
    fn register_builtin_macro(&mut self, ident: Ident, ext: SyntaxExtension) {
180
        if self.builtin_macros.insert(ident.name, BuiltinMacroState::NotYetSeen(ext)).is_some() {
M
Mark Rousskov 已提交
181 182
            self.session
                .span_err(ident.span, &format!("built-in macro `{}` was already defined", ident));
183
        }
184 185
    }

M
Matthew Jasper 已提交
186 187
    // 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.
188
    fn expansion_for_ast_pass(
189
        &mut self,
190
        call_site: Span,
191 192 193
        pass: AstPass,
        features: &[Symbol],
        parent_module_id: Option<NodeId>,
194 195 196 197 198 199
    ) -> ExpnId {
        let expn_id = ExpnId::fresh(Some(ExpnData::allow_unstable(
            ExpnKind::AstPass(pass),
            call_site,
            self.session.edition(),
            features.into(),
A
Aaron Hill 已提交
200
            None,
201 202
        )));

203
        let parent_scope = if let Some(module_id) = parent_module_id {
204
            let parent_def_id = self.local_def_id(module_id);
205
            self.definitions.add_parent_module_of_macro_def(expn_id, parent_def_id.to_def_id());
206 207 208 209 210 211 212 213 214
            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);
215
        expn_id
216 217
    }

218
    fn resolve_imports(&mut self) {
219
        ImportResolver { r: self }.resolve_imports()
220 221
    }

222
    fn resolve_macro_invocation(
M
Mark Rousskov 已提交
223 224 225 226
        &mut self,
        invoc: &Invocation,
        eager_expansion_root: ExpnId,
        force: bool,
227
    ) -> Result<InvocationRes, Indeterminate> {
228 229 230 231 232 233 234
        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 已提交
235 236 237
                let parent_scope = *self
                    .invocation_parent_scopes
                    .get(&eager_expansion_root)
238 239 240 241 242 243
                    .expect("non-eager expansion without a parent scope");
                self.invocation_parent_scopes.insert(invoc_id, parent_scope);
                parent_scope
            }
        };

244
        let (path, kind, inner_attr, derives, after_derive) = match invoc.kind {
M
Mark Rousskov 已提交
245 246 247
            InvocationKind::Attr { ref attr, ref derives, after_derive, .. } => (
                &attr.get_normal_item().path,
                MacroKind::Attr,
248
                attr.style == ast::AttrStyle::Inner,
M
Mark Rousskov 已提交
249 250 251
                self.arenas.alloc_ast_paths(derives),
                after_derive,
            ),
252 253 254 255 256 257
            InvocationKind::Bang { ref mac, .. } => {
                (&mac.path, MacroKind::Bang, false, &[][..], false)
            }
            InvocationKind::Derive { ref path, .. } => {
                (path, MacroKind::Derive, false, &[][..], false)
            }
258
            InvocationKind::DeriveContainer { ref derives, .. } => {
259 260 261 262 263 264 265 266
                // 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`.
                // FIXME: Try to avoid repeated resolutions for derives here and in expansion.
                let mut exts = Vec::new();
267
                let mut helper_attrs = Vec::new();
268
                for path in derives {
M
Mark Rousskov 已提交
269 270 271 272 273 274 275 276 277
                    exts.push(
                        match self.resolve_macro_path(
                            path,
                            Some(MacroKind::Derive),
                            &parent_scope,
                            true,
                            force,
                        ) {
                            Ok((Some(ext), _)) => {
278 279 280 281 282 283 284
                                let span = path
                                    .segments
                                    .last()
                                    .unwrap()
                                    .ident
                                    .span
                                    .normalize_to_macros_2_0();
M
Mark Rousskov 已提交
285 286 287
                                helper_attrs.extend(
                                    ext.helper_attrs.iter().map(|name| Ident::new(*name, span)),
                                );
288
                                if ext.builtin_name == Some(sym::Copy) {
V
Vadim Petrochenkov 已提交
289
                                    self.containers_deriving_copy.insert(invoc_id);
M
Mark Rousskov 已提交
290 291
                                }
                                ext
292
                            }
M
Mark Rousskov 已提交
293 294 295 296 297 298
                            Ok(_) | Err(Determinacy::Determined) => {
                                self.dummy_ext(MacroKind::Derive)
                            }
                            Err(Determinacy::Undetermined) => return Err(Indeterminate),
                        },
                    )
299
                }
300
                self.helper_attrs.insert(invoc_id, helper_attrs);
301
                return Ok(InvocationRes::DeriveContainer(exts));
302
            }
303
        };
304

305
        // Derives are not included when `invocations` are collected, so we have to add them here.
306
        let parent_scope = &ParentScope { derives, ..parent_scope };
307
        let require_inert = !invoc.fragment_kind.supports_macro_expansion();
308
        let node_id = self.lint_node_id(eager_expansion_root);
309 310 311 312 313 314 315 316 317
        let (ext, res) = self.smart_resolve_macro_path(
            path,
            kind,
            require_inert,
            inner_attr,
            parent_scope,
            node_id,
            force,
        )?;
318

319
        let span = invoc.span();
A
Aaron Hill 已提交
320 321 322 323 324 325
        invoc_id.set_expn_data(ext.expn_data(
            parent_scope.expansion,
            span,
            fast_print_path(path),
            res.opt_def_id(),
        ));
326

A
Aaron Hill 已提交
327
        if let Res::Def(_, _) = res {
328
            if after_derive {
329 330
                self.session.span_err(span, "macro attributes must be placed before `#[derive]`");
            }
C
Camelid 已提交
331
            let normal_module_def_id = self.macro_def_scope(invoc_id).nearest_parent_mod;
332
            self.definitions.add_parent_module_of_macro_def(invoc_id, normal_module_def_id);
333
        }
334

335
        Ok(InvocationRes::Single(ext))
336 337
    }

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

344
    fn lint_node_id(&mut self, expn_id: ExpnId) -> NodeId {
345 346 347
        self.invocation_parents
            .get(&expn_id)
            .map_or(ast::CRATE_NODE_ID, |id| self.def_id_to_node_id[*id])
348 349
    }

350
    fn has_derive_copy(&self, expn_id: ExpnId) -> bool {
351
        self.containers_deriving_copy.contains(&expn_id)
352 353
    }

354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388
    // 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)
    }
389 390
}

J
John Kåre Alsaker 已提交
391
impl<'a> Resolver<'a> {
392
    /// Resolve macro path with error reporting and recovery.
393 394
    /// Uses dummy syntax extensions for unresolved macros or macros with unexpected resolutions
    /// for better error recovery.
395
    fn smart_resolve_macro_path(
396 397 398
        &mut self,
        path: &ast::Path,
        kind: MacroKind,
399 400
        require_inert: bool,
        inner_attr: bool,
401
        parent_scope: &ParentScope<'a>,
402
        node_id: NodeId,
403
        force: bool,
404
    ) -> Result<(Lrc<SyntaxExtension>, Res), Indeterminate> {
M
Mark Rousskov 已提交
405 406
        let (ext, res) = match self.resolve_macro_path(path, Some(kind), parent_scope, true, force)
        {
407 408 409 410 411
            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),
        };
412

413
        // Report errors for the resolved macro.
414 415 416
        for segment in &path.segments {
            if let Some(args) = &segment.args {
                self.session.span_err(args.span(), "generic arguments in macro path");
417
            }
418 419 420 421 422
            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",
                );
423
            }
424
        }
425

426
        match res {
427
            Res::Def(DefKind::Macro(_), def_id) => {
428 429 430
                if let Some(def_id) = def_id.as_local() {
                    self.unused_macros.remove(&def_id);
                    if self.proc_macro_stubs.contains(&def_id) {
431 432 433 434 435
                        self.session.span_err(
                            path.span,
                            "can't use a procedural macro from the same crate that defines it",
                        );
                    }
436
                }
437
            }
438
            Res::NonMacroAttr(..) | Res::Err => {}
439
            _ => panic!("expected `DefKind::Macro` or `Res::NonMacroAttr`"),
440
        };
441

442
        self.check_stability_and_deprecation(&ext, path, node_id);
443

444 445 446 447 448 449 450 451
        let unexpected_res = if ext.macro_kind() != kind {
            Some((kind.article(), kind.descr_expected()))
        } else if require_inert && matches!(res, Res::Def(..)) {
            Some(("a", "non-macro attribute"))
        } else {
            None
        };
        if let Some((article, expected)) = unexpected_res {
452 453
            let path_str = pprust::path_to_string(path);
            let msg = format!("expected {}, found {} `{}`", expected, res.descr(), path_str);
M
Mark Rousskov 已提交
454 455
            self.session
                .struct_span_err(path.span, &msg)
456
                .span_label(path.span, format!("not {} {}", article, expected))
M
Mark Rousskov 已提交
457
                .emit();
458 459 460 461
            return Ok((self.dummy_ext(kind), Res::Err));
        }

        // We are trying to avoid reporting this error if other related errors were reported.
462 463
        if res != Res::Err
            && inner_attr
464 465
            && !self.session.features_untracked().custom_inner_attributes
        {
466 467 468 469 470 471 472 473 474 475 476
            let msg = match res {
                Res::Def(..) => "inner macro attributes are unstable",
                Res::NonMacroAttr(..) => "custom inner attributes are unstable",
                _ => unreachable!(),
            };
            if path == &sym::test {
                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();
            }
477 478 479
        }

        Ok((ext, res))
480
    }
481

482
    pub fn resolve_macro_path(
483 484
        &mut self,
        path: &ast::Path,
485
        kind: Option<MacroKind>,
486
        parent_scope: &ParentScope<'a>,
487
        trace: bool,
488
        force: bool,
489
    ) -> Result<(Option<Lrc<SyntaxExtension>>, Res), Determinacy> {
490
        let path_span = path.span;
N
Nick Cameron 已提交
491
        let mut path = Segment::from_path(path);
492

493
        // Possibly apply the macro helper hack
M
Mark Rousskov 已提交
494 495 496 497
        if kind == Some(MacroKind::Bang)
            && path.len() == 1
            && path[0].ident.span.ctxt().outer_expn_data().local_inner_macros
        {
498
            let root = Ident::new(kw::DollarCrate, path[0].ident.span);
N
Nick Cameron 已提交
499
            path.insert(0, Segment::from_ident(root));
500 501
        }

502
        let res = if path.len() > 1 {
M
Mark Rousskov 已提交
503 504 505 506 507 508 509 510
            let res = match self.resolve_path(
                &path,
                Some(MacroNS),
                parent_scope,
                false,
                path_span,
                CrateLint::No,
            ) {
511
                PathResult::NonModule(path_res) if path_res.unresolved_segments() == 0 => {
512
                    Ok(path_res.base_res())
513
                }
514
                PathResult::Indeterminate if !force => return Err(Determinacy::Undetermined),
515 516 517
                PathResult::NonModule(..)
                | PathResult::Indeterminate
                | PathResult::Failed { .. } => Err(Determinacy::Determined),
518
                PathResult::Module(..) => unreachable!(),
519
            };
520

521
            if trace {
522
                let kind = kind.expect("macro kind must be specified if tracing is enabled");
M
Mark Rousskov 已提交
523 524 525 526 527 528 529
                self.multi_segment_macro_resolutions.push((
                    path,
                    path_span,
                    kind,
                    *parent_scope,
                    res.ok(),
                ));
530
            }
531

532 533
            self.prohibit_imported_non_macro_attrs(None, res.ok(), path_span);
            res
534
        } else {
535
            let scope_set = kind.map_or(ScopeSet::All(MacroNS, false), ScopeSet::Macro);
536
            let binding = self.early_resolve_ident_in_lexical_scope(
M
Mark Rousskov 已提交
537 538 539 540 541 542
                path[0].ident,
                scope_set,
                parent_scope,
                false,
                force,
                path_span,
543
            );
544 545
            if let Err(Determinacy::Undetermined) = binding {
                return Err(Determinacy::Undetermined);
546
            }
547

548
            if trace {
549
                let kind = kind.expect("macro kind must be specified if tracing is enabled");
M
Mark Rousskov 已提交
550 551 552 553 554 555
                self.single_segment_macro_resolutions.push((
                    path[0].ident,
                    kind,
                    *parent_scope,
                    binding.ok(),
                ));
556
            }
557

558 559 560
            let res = binding.map(|binding| binding.res());
            self.prohibit_imported_non_macro_attrs(binding.ok(), res.ok(), path_span);
            res
561 562 563
        };

        res.map(|res| (self.get_macro(res), res))
564
    }
565

566
    // Resolve an identifier in lexical scope.
567 568
    // 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).
569
    // The function is used for resolving initial segments of macro paths (e.g., `foo` in
570
    // `foo::bar!(); or `foo!();`) and also for import paths on 2018 edition.
571
    crate fn early_resolve_ident_in_lexical_scope(
572
        &mut self,
573
        orig_ident: Ident,
574
        scope_set: ScopeSet,
575
        parent_scope: &ParentScope<'a>,
576 577
        record_used: bool,
        force: bool,
578
        path_span: Span,
579
    ) -> Result<&'a NameBinding<'a>, Determinacy> {
T
Taiki Endo 已提交
580
        bitflags::bitflags! {
581
            struct Flags: u8 {
582 583
                const MACRO_RULES          = 1 << 0;
                const MODULE               = 1 << 1;
584 585 586
                const MISC_SUGGEST_CRATE   = 1 << 2;
                const MISC_SUGGEST_SELF    = 1 << 3;
                const MISC_FROM_PRELUDE    = 1 << 4;
587 588
            }
        }
589

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

592
        // Make sure `self`, `super` etc produce an error when passed to here.
593
        if orig_ident.is_path_segment_keyword() {
594 595 596
            return Err(Determinacy::Determined);
        }

597
        let (ns, macro_kind, is_import) = match scope_set {
598
            ScopeSet::All(ns, is_import) => (ns, None, is_import),
599 600
            ScopeSet::AbsolutePath(ns) => (ns, None, false),
            ScopeSet::Macro(macro_kind) => (MacroNS, Some(macro_kind), false),
601 602
        };

603 604 605 606
        // 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
607
        // {
608 609
        //     use prefix::*; // imports another `m` - innermost solution
        //                    // weak, cannot shadow the outer `m`, need to report ambiguity error
610 611
        //     m::mac!();
        // }
612 613
        // So we have to save the innermost solution and continue searching in outer scopes
        // to detect potential ambiguities.
T
Taiki Endo 已提交
614
        let mut innermost_result: Option<(&NameBinding<'_>, Flags)> = None;
615
        let mut determinacy = Determinacy::Determined;
616 617

        // Go through all the scopes and try to resolve the name.
M
Mark Rousskov 已提交
618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646
        let break_result = self.visit_scopes(
            scope_set,
            parent_scope,
            orig_ident,
            |this, scope, use_prelude, ident| {
                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)
                        }
647
                    }
M
Mark Rousskov 已提交
648 649 650 651 652 653 654 655 656 657 658 659 660
                    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) {
661 662
                                        result = ok(
                                            Res::NonMacroAttr(NonMacroAttrKind::DeriveHelperCompat),
M
Mark Rousskov 已提交
663
                                            derive.span,
664 665
                                            this.arenas,
                                        );
M
Mark Rousskov 已提交
666 667 668 669 670 671 672
                                        break;
                                    }
                                }
                                Ok(_) | Err(Determinacy::Determined) => {}
                                Err(Determinacy::Undetermined) => {
                                    result = Err(Determinacy::Undetermined)
                                }
673 674
                            }
                        }
M
Mark Rousskov 已提交
675
                        result
676
                    }
677
                    Scope::MacroRules(macro_rules_scope) => match macro_rules_scope.get() {
678 679 680 681
                        MacroRulesScope::Binding(macro_rules_binding)
                            if ident == macro_rules_binding.ident =>
                        {
                            Ok((macro_rules_binding.binding, Flags::MACRO_RULES))
682
                        }
683
                        MacroRulesScope::Invocation(_) => Err(Determinacy::Undetermined),
M
Mark Rousskov 已提交
684 685 686 687 688 689 690
                        _ => 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),
691 692
                            ident,
                            ns,
693
                            parent_scope,
M
Mark Rousskov 已提交
694
                            record_used,
695
                            path_span,
M
Mark Rousskov 已提交
696 697 698 699 700 701 702 703
                        );
                        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)
704
                            }
M
Mark Rousskov 已提交
705
                            Err((Determinacy::Determined, _)) => Err(Determinacy::Determined),
706 707
                        }
                    }
M
Mark Rousskov 已提交
708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
                    Scope::Module(module) => {
                        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,
                            true,
                            record_used,
                            path_span,
                        );
                        match binding {
                            Ok(binding) => {
                                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) {
                            ok(Res::NonMacroAttr(NonMacroAttrKind::Builtin), DUMMY_SP, this.arenas)
                        } 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
789
                    }
M
Mark Rousskov 已提交
790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810
                    Scope::BuiltinTypes => {
                        match this.primitive_type_table.primitive_types.get(&ident.name).cloned() {
                            Some(prim_ty) => ok(Res::PrimTy(prim_ty), DUMMY_SP, this.arenas),
                            None => Err(Determinacy::Determined),
                        }
                    }
                };

                match result {
                    Ok((binding, flags))
                        if sub_namespace_match(binding.macro_kind(), macro_kind) =>
                    {
                        if !record_used {
                            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 {
                                let builtin = Res::NonMacroAttr(NonMacroAttrKind::Builtin);
811 812
                                let derive_helper_compat =
                                    Res::NonMacroAttr(NonMacroAttrKind::DeriveHelperCompat);
813

M
Mark Rousskov 已提交
814 815 816 817
                                let ambiguity_error_kind = if is_import {
                                    Some(AmbiguityKind::Import)
                                } else if innermost_res == builtin || res == builtin {
                                    Some(AmbiguityKind::BuiltinAttr)
818 819
                                } else if innermost_res == derive_helper_compat
                                    || res == derive_helper_compat
M
Mark Rousskov 已提交
820 821 822 823
                                {
                                    Some(AmbiguityKind::DeriveHelper)
                                } else if innermost_flags.contains(Flags::MACRO_RULES)
                                    && flags.contains(Flags::MODULE)
824 825 826 827
                                    && !this.disambiguate_macro_rules_vs_modularized(
                                        innermost_binding,
                                        binding,
                                    )
M
Mark Rousskov 已提交
828 829
                                    || flags.contains(Flags::MACRO_RULES)
                                        && innermost_flags.contains(Flags::MODULE)
830
                                        && !this.disambiguate_macro_rules_vs_modularized(
M
Mark Rousskov 已提交
831 832 833 834
                                            binding,
                                            innermost_binding,
                                        )
                                {
835
                                    Some(AmbiguityKind::MacroRulesVsModularized)
M
Mark Rousskov 已提交
836 837 838 839 840 841
                                } else if innermost_binding.is_glob_import() {
                                    Some(AmbiguityKind::GlobVsOuter)
                                } else if innermost_binding
                                    .may_appear_after(parent_scope.expansion, binding)
                                {
                                    Some(AmbiguityKind::MoreExpandedVsOuter)
842
                                } else {
M
Mark Rousskov 已提交
843
                                    None
844
                                };
M
Mark Rousskov 已提交
845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866
                                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));
                                }
867
                            }
M
Mark Rousskov 已提交
868 869 870
                        } else {
                            // Found the first solution.
                            innermost_result = Some((binding, flags));
871
                        }
872
                    }
M
Mark Rousskov 已提交
873 874
                    Ok(..) | Err(Determinacy::Determined) => {}
                    Err(Determinacy::Undetermined) => determinacy = Determinacy::Undetermined,
875
                }
876

M
Mark Rousskov 已提交
877 878 879
                None
            },
        );
880

881 882
        if let Some(break_result) = break_result {
            return break_result;
883
        }
884

885
        // The first found solution was the only one, return it.
886
        if let Some((binding, _)) = innermost_result {
887
            return Ok(binding);
888
        }
889

890
        Err(Determinacy::determined(determinacy == Determinacy::Determined || force))
891 892
    }

893
    crate fn finalize_macro_resolutions(&mut self) {
M
Mark Rousskov 已提交
894 895 896 897 898 899
        let check_consistency = |this: &mut Self,
                                 path: &[Segment],
                                 span,
                                 kind: MacroKind,
                                 initial_res: Option<Res>,
                                 res: Res| {
900
            if let Some(initial_res) = initial_res {
901
                if res != initial_res {
902 903
                    // Make sure compilation does not succeed if preferred macro resolution
                    // has changed after the macro had been expanded. In theory all such
904 905
                    // situations should be reported as errors, so this is a bug.
                    this.session.delay_span_bug(span, "inconsistent resolution for a macro");
906 907 908 909 910 911 912 913 914 915
                }
            } 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 已提交
916 917 918 919 920
                    let msg = format!(
                        "cannot determine resolution for the {} `{}`",
                        kind.descr(),
                        Segment::names_to_string(path)
                    );
921 922 923 924 925 926
                    let msg_note = "import resolution is stuck, try simplifying macro imports";
                    this.session.struct_span_err(span, &msg).note(msg_note).emit();
                }
            }
        };

927
        let macro_resolutions = mem::take(&mut self.multi_segment_macro_resolutions);
928
        for (mut path, path_span, kind, parent_scope, initial_res) in macro_resolutions {
929
            // FIXME: Path resolution will ICE if segment IDs present.
M
Mark Rousskov 已提交
930 931 932
            for seg in &mut path {
                seg.id = None;
            }
933
            match self.resolve_path(
M
Mark Rousskov 已提交
934 935 936 937 938 939
                &path,
                Some(MacroNS),
                &parent_scope,
                true,
                path_span,
                CrateLint::No,
940
            ) {
941
                PathResult::NonModule(path_res) if path_res.unresolved_segments() == 0 => {
942 943
                    let res = path_res.base_res();
                    check_consistency(self, &path, path_span, kind, initial_res, res);
944
                }
945 946 947
                path_res @ PathResult::NonModule(..) | path_res @ PathResult::Failed { .. } => {
                    let (span, label) = if let PathResult::Failed { span, label, .. } = path_res {
                        (span, label)
948
                    } else {
M
Mark Rousskov 已提交
949 950 951 952 953 954 955 956
                        (
                            path_span,
                            format!(
                                "partially resolved path in {} {}",
                                kind.article(),
                                kind.descr()
                            ),
                        )
957
                    };
M
Mark Rousskov 已提交
958 959 960 961
                    self.report_error(
                        span,
                        ResolutionError::FailedToResolve { label, suggestion: None },
                    );
962
                }
963
                PathResult::Module(..) | PathResult::Indeterminate => unreachable!(),
964 965 966
            }
        }

967
        let macro_resolutions = mem::take(&mut self.single_segment_macro_resolutions);
968
        for (ident, kind, parent_scope, initial_binding) in macro_resolutions {
M
Mark Rousskov 已提交
969 970 971 972 973 974 975 976
            match self.early_resolve_ident_in_lexical_scope(
                ident,
                ScopeSet::Macro(kind),
                &parent_scope,
                true,
                true,
                ident.span,
            ) {
977
                Ok(binding) => {
978
                    let initial_res = initial_binding.map(|initial_binding| {
979
                        self.record_use(ident, MacroNS, initial_binding, false);
980
                        initial_binding.res()
981
                    });
982
                    let res = binding.res();
V
Vadim Petrochenkov 已提交
983
                    let seg = Segment::from_ident(ident);
984
                    check_consistency(self, &[seg], ident.span, kind, initial_res, res);
985
                }
986
                Err(..) => {
987
                    let expected = kind.descr_expected();
988
                    let msg = format!("cannot find {} `{}` in this scope", expected, ident);
989
                    let mut err = self.session.struct_span_err(ident.span, &msg);
990
                    self.unresolved_macro_suggestions(&mut err, kind, &parent_scope, ident);
991
                    err.emit();
992
                }
993
            }
J
Jeffrey Seyfried 已提交
994
        }
995

996
        let builtin_attrs = mem::take(&mut self.builtin_attrs);
997
        for (ident, parent_scope) in builtin_attrs {
998
            let _ = self.early_resolve_ident_in_lexical_scope(
M
Mark Rousskov 已提交
999 1000 1001 1002 1003 1004
                ident,
                ScopeSet::Macro(MacroKind::Attr),
                &parent_scope,
                true,
                true,
                ident.span,
1005
            );
1006
        }
1007
    }
1008

1009 1010 1011 1012 1013 1014
    fn check_stability_and_deprecation(
        &mut self,
        ext: &SyntaxExtension,
        path: &ast::Path,
        node_id: NodeId,
    ) {
1015
        let span = path.span;
1016
        if let Some(stability) = &ext.stability {
1017
            if let StabilityLevel::Unstable { reason, issue, is_soft } = stability.level {
1018 1019
                let feature = stability.feature;
                if !self.active_features.contains(&feature) && !span.allows_unstable(feature) {
1020
                    let lint_buffer = &mut self.lint_buffer;
M
Mark Rousskov 已提交
1021 1022
                    let soft_handler =
                        |lint, span, msg: &_| lint_buffer.buffer_lint(lint, node_id, span, msg);
1023
                    stability::report_unstable(
M
Mark Rousskov 已提交
1024 1025 1026 1027 1028 1029 1030
                        self.session,
                        feature,
                        reason,
                        issue,
                        is_soft,
                        span,
                        soft_handler,
1031
                    );
1032 1033 1034 1035
                }
            }
        }
        if let Some(depr) = &ext.deprecation {
1036
            let path = pprust::path_to_string(&path);
1037
            let (message, lint) = stability::deprecation_message(depr, "macro", &path);
1038 1039 1040 1041 1042 1043
            stability::early_report_deprecation(
                &mut self.lint_buffer,
                &message,
                depr.suggestion,
                lint,
                span,
1044
                node_id,
1045
            );
1046 1047 1048
        }
    }

M
Mark Rousskov 已提交
1049 1050 1051 1052 1053 1054
    fn prohibit_imported_non_macro_attrs(
        &self,
        binding: Option<&'a NameBinding<'a>>,
        res: Option<Res>,
        span: Span,
    ) {
1055
        if let Some(Res::NonMacroAttr(kind)) = res {
1056
            if kind != NonMacroAttrKind::Tool && binding.map_or(true, |b| b.is_import()) {
V
Vadim Petrochenkov 已提交
1057 1058
                let msg =
                    format!("cannot use {} {} through an import", kind.article(), kind.descr());
1059 1060 1061 1062 1063 1064 1065 1066 1067
                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();
            }
        }
    }

1068 1069 1070 1071
    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`.
        if ident.name == sym::cfg || ident.name == sym::cfg_attr || ident.name == sym::derive {
1072
            let macro_kind = self.get_macro(res).map(|ext| ext.macro_kind());
1073 1074
            if macro_kind.is_some() && sub_namespace_match(macro_kind, Some(MacroKind::Attr)) {
                self.session.span_err(
M
Mark Rousskov 已提交
1075 1076
                    ident.span,
                    &format!("name `{}` is reserved in attribute namespace", ident),
1077 1078 1079 1080 1081
                );
            }
        }
    }

1082 1083
    /// Compile the macro into a `SyntaxExtension` and possibly replace
    /// its expander to a pre-defined one for built-in macros.
1084
    crate fn compile_macro(&mut self, item: &ast::Item, edition: Edition) -> SyntaxExtension {
1085
        let mut result = compile_declarative_macro(
1086
            &self.session,
M
Mark Rousskov 已提交
1087 1088 1089
            self.session.features_untracked(),
            item,
            edition,
1090 1091
        );

1092
        if let Some(builtin_name) = result.builtin_name {
1093
            // The macro was marked with `#[rustc_builtin_macro]`.
1094
            if let Some(builtin_macro) = self.builtin_macros.get_mut(&builtin_name) {
1095 1096
                // The macro is a built-in, replace its expander function
                // while still taking everything else from the source code.
1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110
                // 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)) {
                    BuiltinMacroState::NotYetSeen(ext) => result.kind = ext.kind,
                    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();
                    }
                }
1111 1112 1113 1114 1115 1116
            } else {
                let msg = format!("cannot find a built-in macro with name `{}`", item.ident);
                self.session.span_err(item.span, &msg);
            }
        }

1117
        result
1118
    }
1119
}