lib.rs 149.3 KB
Newer Older
1
// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
2 3 4 5 6 7 8 9 10
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

11 12 13
#![crate_name = "rustc_resolve"]
#![crate_type = "dylib"]
#![crate_type = "rlib"]
14
#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
A
Alex Crichton 已提交
15
      html_favicon_url = "https://doc.rust-lang.org/favicon.ico",
16
      html_root_url = "https://doc.rust-lang.org/nightly/")]
17
#![deny(warnings)]
18

A
Alex Crichton 已提交
19
#![feature(rustc_diagnostic_macros)]
20

21 22
#![cfg_attr(stage0, feature(associated_consts))]

C
corentih 已提交
23 24 25 26
#[macro_use]
extern crate log;
#[macro_use]
extern crate syntax;
27 28
extern crate syntax_pos;
extern crate rustc_errors as errors;
29
extern crate arena;
C
corentih 已提交
30
#[macro_use]
31 32
extern crate rustc;

S
Steven Fackler 已提交
33 34 35 36
use self::Namespace::*;
use self::TypeParameters::*;
use self::RibKind::*;

37
use rustc::hir::map::{Definitions, DefCollector};
38
use rustc::hir::{self, PrimTy, TyBool, TyChar, TyFloat, TyInt, TyUint, TyStr};
39
use rustc::middle::cstore::CrateLoader;
40 41
use rustc::session::Session;
use rustc::lint;
42
use rustc::hir::def::*;
J
Jeffrey Seyfried 已提交
43
use rustc::hir::def_id::{CRATE_DEF_INDEX, LOCAL_CRATE, DefId};
44
use rustc::ty;
S
Seo Sanghyeon 已提交
45
use rustc::hir::{Freevar, FreevarMap, TraitCandidate, TraitMap, GlobMap};
46
use rustc::util::nodemap::{NodeMap, NodeSet, FxHashMap, FxHashSet, DefIdMap};
47

J
Jeffrey Seyfried 已提交
48
use syntax::ext::hygiene::{Mark, SyntaxContext};
49
use syntax::ast::{self, Name, NodeId, Ident, SpannedIdent, FloatTy, IntTy, UintTy};
J
Jeffrey Seyfried 已提交
50
use syntax::ext::base::SyntaxExtension;
J
Jeffrey Seyfried 已提交
51
use syntax::ext::base::Determinacy::{self, Determined, Undetermined};
52
use syntax::ext::base::MacroKind;
53
use syntax::symbol::{Symbol, keywords};
54
use syntax::util::lev_distance::find_best_match_for_name;
55

56
use syntax::visit::{self, FnKind, Visitor};
57
use syntax::attr;
58 59 60
use syntax::ast::{Arm, BindingMode, Block, Crate, Expr, ExprKind};
use syntax::ast::{FnDecl, ForeignItem, ForeignItemKind, Generics};
use syntax::ast::{Item, ItemKind, ImplItem, ImplItemKind};
61
use syntax::ast::{Local, Mutability, Pat, PatKind, Path};
J
Jeffrey Seyfried 已提交
62
use syntax::ast::{QSelf, TraitItemKind, TraitRef, Ty, TyKind};
63
use syntax::feature_gate::{feature_err, emit_feature_err, GateIssue};
64

65
use syntax_pos::{Span, DUMMY_SP, MultiSpan};
66 67
use errors::DiagnosticBuilder;

68
use std::cell::{Cell, RefCell};
69
use std::cmp;
70
use std::collections::BTreeSet;
71
use std::fmt;
72
use std::mem::replace;
73
use std::rc::Rc;
74

75
use resolve_imports::{ImportDirective, ImportDirectiveSubclass, NameResolution, ImportResolver};
76
use macros::{InvocationData, LegacyBinding, LegacyScope, MacroBinding};
77

78 79
// NB: This module needs to be declared first so diagnostics are
// registered before they are used.
J
Jeffrey Seyfried 已提交
80
mod diagnostics;
81

82
mod macros;
A
Alex Crichton 已提交
83
mod check_unused;
84
mod build_reduced_graph;
85
mod resolve_imports;
86

87 88 89
/// A free importable items suggested in case of resolution failure.
struct ImportSuggestion {
    path: Path,
90 91
}

92 93 94 95 96
/// A field or associated item from self type suggested in case of resolution failure.
enum AssocSuggestion {
    Field,
    MethodWithSelf,
    AssocItem,
97 98
}

99 100 101
#[derive(Eq)]
struct BindingError {
    name: Name,
102 103
    origin: BTreeSet<Span>,
    target: BTreeSet<Span>,
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
}

impl PartialOrd for BindingError {
    fn partial_cmp(&self, other: &BindingError) -> Option<cmp::Ordering> {
        Some(self.cmp(other))
    }
}

impl PartialEq for BindingError {
    fn eq(&self, other: &BindingError) -> bool {
        self.name == other.name
    }
}

impl Ord for BindingError {
    fn cmp(&self, other: &BindingError) -> cmp::Ordering {
        self.name.cmp(&other.name)
    }
}

J
Jeffrey Seyfried 已提交
124
enum ResolutionError<'a> {
125
    /// error E0401: can't use type parameters from outer function
126
    TypeParametersFromOuterFunction,
127
    /// error E0403: the name is already used for a type parameter in this type parameter list
C
Chris Stankus 已提交
128
    NameAlreadyUsedInTypeParameterList(Name, &'a Span),
129
    /// error E0407: method is not a member of trait
130
    MethodNotMemberOfTrait(Name, &'a str),
131 132 133 134
    /// error E0437: type is not a member of trait
    TypeNotMemberOfTrait(Name, &'a str),
    /// error E0438: const is not a member of trait
    ConstNotMemberOfTrait(Name, &'a str),
135 136 137 138
    /// error E0408: variable `{}` is not bound in all patterns
    VariableNotBoundInPattern(&'a BindingError),
    /// error E0409: variable `{}` is bound in inconsistent ways within the same match arm
    VariableBoundWithDifferentMode(Name, Span),
139
    /// error E0415: identifier is bound more than once in this parameter list
140
    IdentifierBoundMoreThanOnceInParameterList(&'a str),
141
    /// error E0416: identifier is bound more than once in the same pattern
142
    IdentifierBoundMoreThanOnceInSamePattern(&'a str),
143
    /// error E0426: use of undeclared label
144
    UndeclaredLabel(&'a str),
145
    /// error E0429: `self` imports are only allowed within a { } list
146
    SelfImportsOnlyAllowedWithin,
147
    /// error E0430: `self` import can only appear once in the list
148
    SelfImportCanOnlyAppearOnceInTheList,
149
    /// error E0431: `self` import can only appear in an import list with a non-empty prefix
150
    SelfImportOnlyInImportListWithNonEmptyPrefix,
151
    /// error E0432: unresolved import
152
    UnresolvedImport(Option<(&'a str, &'a str)>),
153
    /// error E0433: failed to resolve
154
    FailedToResolve(&'a str),
155
    /// error E0434: can't capture dynamic environment in a fn item
156
    CannotCaptureDynamicEnvironmentInFnItem,
157
    /// error E0435: attempt to use a non-constant value in a constant
158
    AttemptToUseNonConstantValueInConstant,
159
    /// error E0530: X bindings cannot shadow Ys
160
    BindingShadowsSomethingUnacceptable(&'a str, Name, &'a NameBinding<'a>),
161 162
    /// error E0128: type parameters with a default cannot use forward declared identifiers
    ForwardDeclaredTyParam,
163 164
}

165 166 167
fn resolve_error<'sess, 'a>(resolver: &'sess Resolver,
                            span: Span,
                            resolution_error: ResolutionError<'a>) {
N
Nick Cameron 已提交
168
    resolve_struct_error(resolver, span, resolution_error).emit();
N
Nick Cameron 已提交
169 170
}

171 172 173 174
fn resolve_struct_error<'sess, 'a>(resolver: &'sess Resolver,
                                   span: Span,
                                   resolution_error: ResolutionError<'a>)
                                   -> DiagnosticBuilder<'sess> {
N
Nick Cameron 已提交
175
    match resolution_error {
176
        ResolutionError::TypeParametersFromOuterFunction => {
177 178 179 180 181
            let mut err = struct_span_err!(resolver.session,
                                           span,
                                           E0401,
                                           "can't use type parameters from outer function; \
                                           try using a local type parameter instead");
182
            err.span_label(span, "use of type variable from outer function");
183
            err
C
corentih 已提交
184
        }
C
Chris Stankus 已提交
185 186 187 188 189 190 191
        ResolutionError::NameAlreadyUsedInTypeParameterList(name, first_use_span) => {
             let mut err = struct_span_err!(resolver.session,
                                            span,
                                            E0403,
                                            "the name `{}` is already used for a type parameter \
                                            in this type parameter list",
                                            name);
192 193
             err.span_label(span, "already used");
             err.span_label(first_use_span.clone(), format!("first use of `{}`", name));
C
Chris Stankus 已提交
194
             err
C
corentih 已提交
195
        }
196
        ResolutionError::MethodNotMemberOfTrait(method, trait_) => {
C
crypto-universe 已提交
197 198 199 200 201 202
            let mut err = struct_span_err!(resolver.session,
                                           span,
                                           E0407,
                                           "method `{}` is not a member of trait `{}`",
                                           method,
                                           trait_);
203
            err.span_label(span, format!("not a member of trait `{}`", trait_));
C
crypto-universe 已提交
204
            err
C
corentih 已提交
205
        }
206
        ResolutionError::TypeNotMemberOfTrait(type_, trait_) => {
S
Shyam Sundar B 已提交
207
            let mut err = struct_span_err!(resolver.session,
N
Nick Cameron 已提交
208 209 210 211
                             span,
                             E0437,
                             "type `{}` is not a member of trait `{}`",
                             type_,
S
Shyam Sundar B 已提交
212
                             trait_);
213
            err.span_label(span, format!("not a member of trait `{}`", trait_));
S
Shyam Sundar B 已提交
214
            err
C
corentih 已提交
215
        }
216
        ResolutionError::ConstNotMemberOfTrait(const_, trait_) => {
S
Shyam Sundar B 已提交
217
            let mut err = struct_span_err!(resolver.session,
N
Nick Cameron 已提交
218 219 220 221
                             span,
                             E0438,
                             "const `{}` is not a member of trait `{}`",
                             const_,
S
Shyam Sundar B 已提交
222
                             trait_);
223
            err.span_label(span, format!("not a member of trait `{}`", trait_));
S
Shyam Sundar B 已提交
224
            err
C
corentih 已提交
225
        }
226
        ResolutionError::VariableNotBoundInPattern(binding_error) => {
227
            let target_sp = binding_error.target.iter().map(|x| *x).collect::<Vec<_>>();
228 229 230 231
            let msp = MultiSpan::from_spans(target_sp.clone());
            let msg = format!("variable `{}` is not bound in all patterns", binding_error.name);
            let mut err = resolver.session.struct_span_err_with_code(msp, &msg, "E0408");
            for sp in target_sp {
232
                err.span_label(sp, format!("pattern doesn't bind `{}`", binding_error.name));
233
            }
234
            let origin_sp = binding_error.origin.iter().map(|x| *x).collect::<Vec<_>>();
235
            for sp in origin_sp {
236
                err.span_label(sp, "variable not in all patterns");
237
            }
238
            err
C
corentih 已提交
239
        }
M
Mikhail Modin 已提交
240 241 242
        ResolutionError::VariableBoundWithDifferentMode(variable_name,
                                                        first_binding_span) => {
            let mut err = struct_span_err!(resolver.session,
N
Nick Cameron 已提交
243 244
                             span,
                             E0409,
245 246 247
                             "variable `{}` is bound in inconsistent \
                             ways within the same match arm",
                             variable_name);
248 249
            err.span_label(span, "bound in different ways");
            err.span_label(first_binding_span, "first binding");
M
Mikhail Modin 已提交
250
            err
C
corentih 已提交
251
        }
252
        ResolutionError::IdentifierBoundMoreThanOnceInParameterList(identifier) => {
253
            let mut err = struct_span_err!(resolver.session,
N
Nick Cameron 已提交
254 255 256
                             span,
                             E0415,
                             "identifier `{}` is bound more than once in this parameter list",
257
                             identifier);
258
            err.span_label(span, "used as parameter more than once");
259
            err
C
corentih 已提交
260
        }
261
        ResolutionError::IdentifierBoundMoreThanOnceInSamePattern(identifier) => {
262
            let mut err = struct_span_err!(resolver.session,
N
Nick Cameron 已提交
263 264 265
                             span,
                             E0416,
                             "identifier `{}` is bound more than once in the same pattern",
266
                             identifier);
267
            err.span_label(span, "used in a pattern more than once");
268
            err
C
corentih 已提交
269
        }
270
        ResolutionError::UndeclaredLabel(name) => {
C
crypto-universe 已提交
271 272 273 274 275
            let mut err = struct_span_err!(resolver.session,
                                           span,
                                           E0426,
                                           "use of undeclared label `{}`",
                                           name);
276
            err.span_label(span, format!("undeclared label `{}`", name));
C
crypto-universe 已提交
277
            err
C
corentih 已提交
278
        }
279
        ResolutionError::SelfImportsOnlyAllowedWithin => {
N
Nick Cameron 已提交
280 281 282 283 284
            struct_span_err!(resolver.session,
                             span,
                             E0429,
                             "{}",
                             "`self` imports are only allowed within a { } list")
C
corentih 已提交
285
        }
286
        ResolutionError::SelfImportCanOnlyAppearOnceInTheList => {
N
Nick Cameron 已提交
287 288 289 290
            struct_span_err!(resolver.session,
                             span,
                             E0430,
                             "`self` import can only appear once in the list")
C
corentih 已提交
291
        }
292
        ResolutionError::SelfImportOnlyInImportListWithNonEmptyPrefix => {
N
Nick Cameron 已提交
293 294 295 296 297
            struct_span_err!(resolver.session,
                             span,
                             E0431,
                             "`self` import can only appear in an import list with a \
                              non-empty prefix")
298
        }
299
        ResolutionError::UnresolvedImport(name) => {
300
            let msg = match name {
K
Knight 已提交
301
                Some((n, _)) => format!("unresolved import `{}`", n),
C
corentih 已提交
302
                None => "unresolved import".to_owned(),
303
            };
K
Knight 已提交
304 305
            let mut err = struct_span_err!(resolver.session, span, E0432, "{}", msg);
            if let Some((_, p)) = name {
306
                err.span_label(span, p);
K
Knight 已提交
307 308
            }
            err
C
corentih 已提交
309
        }
310
        ResolutionError::FailedToResolve(msg) => {
J
Jonathan Turner 已提交
311 312
            let mut err = struct_span_err!(resolver.session, span, E0433,
                                           "failed to resolve. {}", msg);
313
            err.span_label(span, msg);
314
            err
C
corentih 已提交
315
        }
316
        ResolutionError::CannotCaptureDynamicEnvironmentInFnItem => {
N
Nick Cameron 已提交
317 318 319 320 321 322
            struct_span_err!(resolver.session,
                             span,
                             E0434,
                             "{}",
                             "can't capture dynamic environment in a fn item; use the || { ... } \
                              closure form instead")
C
corentih 已提交
323 324
        }
        ResolutionError::AttemptToUseNonConstantValueInConstant => {
S
Shyam Sundar B 已提交
325
            let mut err = struct_span_err!(resolver.session,
N
Nick Cameron 已提交
326 327
                             span,
                             E0435,
S
Shyam Sundar B 已提交
328
                             "attempt to use a non-constant value in a constant");
329
            err.span_label(span, "non-constant value");
S
Shyam Sundar B 已提交
330
            err
C
corentih 已提交
331
        }
332
        ResolutionError::BindingShadowsSomethingUnacceptable(what_binding, name, binding) => {
333
            let shadows_what = PathResolution::new(binding.def()).kind_name();
334 335
            let mut err = struct_span_err!(resolver.session,
                                           span,
336
                                           E0530,
337
                                           "{}s cannot shadow {}s", what_binding, shadows_what);
338
            err.span_label(span, format!("cannot be named the same as a {}", shadows_what));
339
            let participle = if binding.is_import() { "imported" } else { "defined" };
340
            let msg = format!("a {} `{}` is {} here", shadows_what, name, participle);
341
            err.span_label(binding.span, msg);
342 343
            err
        }
344 345 346 347
        ResolutionError::ForwardDeclaredTyParam => {
            let mut err = struct_span_err!(resolver.session, span, E0128,
                                           "type parameters with a default cannot use \
                                            forward declared identifiers");
348
            err.span_label(span, format!("defaulted type parameters \
349 350 351
                                           cannot be forward declared"));
            err
        }
N
Nick Cameron 已提交
352
    }
353 354
}

355
#[derive(Copy, Clone, Debug)]
356
struct BindingInfo {
357
    span: Span,
358
    binding_mode: BindingMode,
359 360 361
}

// Map from the name in a pattern to its binding mode.
362
type BindingMap = FxHashMap<Ident, BindingInfo>;
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 389 390
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
enum PatternSource {
    Match,
    IfLet,
    WhileLet,
    Let,
    For,
    FnParam,
}

impl PatternSource {
    fn is_refutable(self) -> bool {
        match self {
            PatternSource::Match | PatternSource::IfLet | PatternSource::WhileLet => true,
            PatternSource::Let | PatternSource::For | PatternSource::FnParam  => false,
        }
    }
    fn descr(self) -> &'static str {
        match self {
            PatternSource::Match => "match binding",
            PatternSource::IfLet => "if let binding",
            PatternSource::WhileLet => "while let binding",
            PatternSource::Let => "let binding",
            PatternSource::For => "for binding",
            PatternSource::FnParam => "function parameter",
        }
    }
391 392
}

393 394 395 396 397 398 399
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
enum PathSource<'a> {
    // Type paths `Path`.
    Type,
    // Trait paths in bounds or impls.
    Trait,
    // Expression paths `path`, with optional parent context.
400
    Expr(Option<&'a Expr>),
401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 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
    // Paths in path patterns `Path`.
    Pat,
    // Paths in struct expressions and patterns `Path { .. }`.
    Struct,
    // Paths in tuple struct patterns `Path(..)`.
    TupleStruct,
    // `m::A::B` in `<T as m::A>::B::C`.
    TraitItem(Namespace),
    // Path in `pub(path)`
    Visibility,
    // Path in `use a::b::{...};`
    ImportPrefix,
}

impl<'a> PathSource<'a> {
    fn namespace(self) -> Namespace {
        match self {
            PathSource::Type | PathSource::Trait | PathSource::Struct |
            PathSource::Visibility | PathSource::ImportPrefix => TypeNS,
            PathSource::Expr(..) | PathSource::Pat | PathSource::TupleStruct => ValueNS,
            PathSource::TraitItem(ns) => ns,
        }
    }

    fn global_by_default(self) -> bool {
        match self {
            PathSource::Visibility | PathSource::ImportPrefix => true,
            PathSource::Type | PathSource::Expr(..) | PathSource::Pat |
            PathSource::Struct | PathSource::TupleStruct |
            PathSource::Trait | PathSource::TraitItem(..) => false,
        }
    }

    fn defer_to_typeck(self) -> bool {
        match self {
            PathSource::Type | PathSource::Expr(..) | PathSource::Pat |
            PathSource::Struct | PathSource::TupleStruct => true,
            PathSource::Trait | PathSource::TraitItem(..) |
            PathSource::Visibility | PathSource::ImportPrefix => false,
        }
    }

    fn descr_expected(self) -> &'static str {
        match self {
            PathSource::Type => "type",
            PathSource::Trait => "trait",
            PathSource::Pat => "unit struct/variant or constant",
            PathSource::Struct => "struct, variant or union type",
            PathSource::TupleStruct => "tuple struct/variant",
            PathSource::Visibility => "module",
            PathSource::ImportPrefix => "module or enum",
            PathSource::TraitItem(ns) => match ns {
                TypeNS => "associated type",
                ValueNS => "method or associated constant",
                MacroNS => bug!("associated macro"),
            },
457
            PathSource::Expr(parent) => match parent.map(|p| &p.node) {
458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549
                // "function" here means "anything callable" rather than `Def::Fn`,
                // this is not precise but usually more helpful than just "value".
                Some(&ExprKind::Call(..)) => "function",
                _ => "value",
            },
        }
    }

    fn is_expected(self, def: Def) -> bool {
        match self {
            PathSource::Type => match def {
                Def::Struct(..) | Def::Union(..) | Def::Enum(..) |
                Def::Trait(..) | Def::TyAlias(..) | Def::AssociatedTy(..) |
                Def::PrimTy(..) | Def::TyParam(..) | Def::SelfTy(..) => true,
                _ => false,
            },
            PathSource::Trait => match def {
                Def::Trait(..) => true,
                _ => false,
            },
            PathSource::Expr(..) => match def {
                Def::StructCtor(_, CtorKind::Const) | Def::StructCtor(_, CtorKind::Fn) |
                Def::VariantCtor(_, CtorKind::Const) | Def::VariantCtor(_, CtorKind::Fn) |
                Def::Const(..) | Def::Static(..) | Def::Local(..) | Def::Upvar(..) |
                Def::Fn(..) | Def::Method(..) | Def::AssociatedConst(..) => true,
                _ => false,
            },
            PathSource::Pat => match def {
                Def::StructCtor(_, CtorKind::Const) |
                Def::VariantCtor(_, CtorKind::Const) |
                Def::Const(..) | Def::AssociatedConst(..) => true,
                _ => false,
            },
            PathSource::TupleStruct => match def {
                Def::StructCtor(_, CtorKind::Fn) | Def::VariantCtor(_, CtorKind::Fn) => true,
                _ => false,
            },
            PathSource::Struct => match def {
                Def::Struct(..) | Def::Union(..) | Def::Variant(..) |
                Def::TyAlias(..) | Def::AssociatedTy(..) | Def::SelfTy(..) => true,
                _ => false,
            },
            PathSource::TraitItem(ns) => match def {
                Def::AssociatedConst(..) | Def::Method(..) if ns == ValueNS => true,
                Def::AssociatedTy(..) if ns == TypeNS => true,
                _ => false,
            },
            PathSource::ImportPrefix => match def {
                Def::Mod(..) | Def::Enum(..) => true,
                _ => false,
            },
            PathSource::Visibility => match def {
                Def::Mod(..) => true,
                _ => false,
            },
        }
    }

    fn error_code(self, has_unexpected_resolution: bool) -> &'static str {
        __diagnostic_used!(E0404);
        __diagnostic_used!(E0405);
        __diagnostic_used!(E0412);
        __diagnostic_used!(E0422);
        __diagnostic_used!(E0423);
        __diagnostic_used!(E0425);
        __diagnostic_used!(E0531);
        __diagnostic_used!(E0532);
        __diagnostic_used!(E0573);
        __diagnostic_used!(E0574);
        __diagnostic_used!(E0575);
        __diagnostic_used!(E0576);
        __diagnostic_used!(E0577);
        __diagnostic_used!(E0578);
        match (self, has_unexpected_resolution) {
            (PathSource::Trait, true) => "E0404",
            (PathSource::Trait, false) => "E0405",
            (PathSource::Type, true) => "E0573",
            (PathSource::Type, false) => "E0412",
            (PathSource::Struct, true) => "E0574",
            (PathSource::Struct, false) => "E0422",
            (PathSource::Expr(..), true) => "E0423",
            (PathSource::Expr(..), false) => "E0425",
            (PathSource::Pat, true) | (PathSource::TupleStruct, true) => "E0532",
            (PathSource::Pat, false) | (PathSource::TupleStruct, false) => "E0531",
            (PathSource::TraitItem(..), true) => "E0575",
            (PathSource::TraitItem(..), false) => "E0576",
            (PathSource::Visibility, true) | (PathSource::ImportPrefix, true) => "E0577",
            (PathSource::Visibility, false) | (PathSource::ImportPrefix, false) => "E0578",
        }
    }
}

N
Niko Matsakis 已提交
550
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
G
Garming Sam 已提交
551
pub enum Namespace {
552
    TypeNS,
C
corentih 已提交
553
    ValueNS,
554
    MacroNS,
555 556
}

J
Jeffrey Seyfried 已提交
557 558 559 560
#[derive(Clone, Default, Debug)]
pub struct PerNS<T> {
    value_ns: T,
    type_ns: T,
561
    macro_ns: Option<T>,
J
Jeffrey Seyfried 已提交
562 563 564 565 566 567 568 569
}

impl<T> ::std::ops::Index<Namespace> for PerNS<T> {
    type Output = T;
    fn index(&self, ns: Namespace) -> &T {
        match ns {
            ValueNS => &self.value_ns,
            TypeNS => &self.type_ns,
570
            MacroNS => self.macro_ns.as_ref().unwrap(),
J
Jeffrey Seyfried 已提交
571 572 573 574 575 576 577 578 579
        }
    }
}

impl<T> ::std::ops::IndexMut<Namespace> for PerNS<T> {
    fn index_mut(&mut self, ns: Namespace) -> &mut T {
        match ns {
            ValueNS => &mut self.value_ns,
            TypeNS => &mut self.type_ns,
580
            MacroNS => self.macro_ns.as_mut().unwrap(),
J
Jeffrey Seyfried 已提交
581 582 583 584
        }
    }
}

585 586
impl<'a, 'tcx> Visitor<'tcx> for Resolver<'a> {
    fn visit_item(&mut self, item: &'tcx Item) {
A
Alex Crichton 已提交
587
        self.resolve_item(item);
588
    }
589
    fn visit_arm(&mut self, arm: &'tcx Arm) {
A
Alex Crichton 已提交
590
        self.resolve_arm(arm);
591
    }
592
    fn visit_block(&mut self, block: &'tcx Block) {
A
Alex Crichton 已提交
593
        self.resolve_block(block);
594
    }
595
    fn visit_expr(&mut self, expr: &'tcx Expr) {
596
        self.resolve_expr(expr, None);
597
    }
598
    fn visit_local(&mut self, local: &'tcx Local) {
A
Alex Crichton 已提交
599
        self.resolve_local(local);
600
    }
601
    fn visit_ty(&mut self, ty: &'tcx Ty) {
602 603
        if let TyKind::Path(ref qself, ref path) = ty.node {
            self.smart_resolve_path(ty.id, qself.as_ref(), path, PathSource::Type);
604 605
        } else if let TyKind::ImplicitSelf = ty.node {
            let self_ty = keywords::SelfType.ident();
606
            let def = self.resolve_ident_in_lexical_scope(self_ty, TypeNS, true, ty.span)
607 608
                          .map_or(Def::Err, |d| d.def());
            self.record_def(ty.id, PathResolution::new(def));
609 610 611 612 613 614
        } else if let TyKind::Array(ref element, ref length) = ty.node {
            self.visit_ty(element);
            self.with_constant_rib(|this| {
                this.visit_expr(length);
            });
            return;
615 616
        }
        visit::walk_ty(self, ty);
617
    }
618 619 620
    fn visit_poly_trait_ref(&mut self,
                            tref: &'tcx ast::PolyTraitRef,
                            m: &'tcx ast::TraitBoundModifier) {
621 622
        self.smart_resolve_path(tref.trait_ref.ref_id, None,
                                &tref.trait_ref.path, PathSource::Trait);
623
        visit::walk_poly_trait_ref(self, tref, m);
624
    }
C
corentih 已提交
625
    fn visit_variant(&mut self,
626 627
                     variant: &'tcx ast::Variant,
                     generics: &'tcx Generics,
C
corentih 已提交
628
                     item_id: ast::NodeId) {
629 630 631
        if let Some(ref dis_expr) = variant.node.disr_expr {
            // resolve the discriminator expr as a constant
            self.with_constant_rib(|this| {
632
                this.visit_expr(dis_expr);
633 634 635
            });
        }

636
        // `visit::walk_variant` without the discriminant expression.
C
corentih 已提交
637 638 639 640 641
        self.visit_variant_data(&variant.node.data,
                                variant.node.name,
                                generics,
                                item_id,
                                variant.span);
642
    }
643
    fn visit_foreign_item(&mut self, foreign_item: &'tcx ForeignItem) {
644
        let type_parameters = match foreign_item.node {
645
            ForeignItemKind::Fn(_, ref generics) => {
646
                HasTypeParameters(generics, ItemRibKind)
647
            }
648
            ForeignItemKind::Static(..) => NoTypeParameters,
649 650
        };
        self.with_type_parameter_rib(type_parameters, |this| {
651
            visit::walk_foreign_item(this, foreign_item);
652 653 654
        });
    }
    fn visit_fn(&mut self,
655 656
                function_kind: FnKind<'tcx>,
                declaration: &'tcx FnDecl,
657 658 659
                _: Span,
                node_id: NodeId) {
        let rib_kind = match function_kind {
V
Vadim Petrochenkov 已提交
660
            FnKind::ItemFn(_, generics, ..) => {
661 662 663
                self.visit_generics(generics);
                ItemRibKind
            }
664
            FnKind::Method(_, sig, _, _) => {
665
                self.visit_generics(&sig.generics);
V
Vadim Petrochenkov 已提交
666
                MethodRibKind(!sig.decl.has_self())
667
            }
668
            FnKind::Closure(_) => ClosureRibKind(node_id),
669
        };
670 671

        // Create a value rib for the function.
J
Jeffrey Seyfried 已提交
672
        self.ribs[ValueNS].push(Rib::new(rib_kind));
673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701

        // Create a label rib for the function.
        self.label_ribs.push(Rib::new(rib_kind));

        // Add each argument to the rib.
        let mut bindings_list = FxHashMap();
        for argument in &declaration.inputs {
            self.resolve_pattern(&argument.pat, PatternSource::FnParam, &mut bindings_list);

            self.visit_ty(&argument.ty);

            debug!("(resolving function) recorded argument");
        }
        visit::walk_fn_ret_ty(self, &declaration.output);

        // Resolve the function body.
        match function_kind {
            FnKind::ItemFn(.., body) |
            FnKind::Method(.., body) => {
                self.visit_block(body);
            }
            FnKind::Closure(body) => {
                self.visit_expr(body);
            }
        };

        debug!("(resolving function) leaving function");

        self.label_ribs.pop();
J
Jeffrey Seyfried 已提交
702
        self.ribs[ValueNS].pop();
703
    }
704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729
    fn visit_generics(&mut self, generics: &'tcx Generics) {
        // For type parameter defaults, we have to ban access
        // to following type parameters, as the Substs can only
        // provide previous type parameters as they're built.
        let mut default_ban_rib = Rib::new(ForwardTyParamBanRibKind);
        default_ban_rib.bindings.extend(generics.ty_params.iter()
            .skip_while(|p| p.default.is_none())
            .map(|p| (Ident::with_empty_ctxt(p.ident.name), Def::Err)));

        for param in &generics.ty_params {
            for bound in &param.bounds {
                self.visit_ty_param_bound(bound);
            }

            if let Some(ref ty) = param.default {
                self.ribs[TypeNS].push(default_ban_rib);
                self.visit_ty(ty);
                default_ban_rib = self.ribs[TypeNS].pop().unwrap();
            }

            // Allow all following defaults to refer to this type parameter.
            default_ban_rib.bindings.remove(&Ident::with_empty_ctxt(param.ident.name));
        }
        for lt in &generics.lifetimes { self.visit_lifetime_def(lt); }
        for p in &generics.where_clause.predicates { self.visit_where_predicate(p); }
    }
730
}
731

732
pub type ErrorMessage = Option<(Span, String)>;
733

N
Niko Matsakis 已提交
734
#[derive(Copy, Clone)]
735
enum TypeParameters<'a, 'b> {
736
    NoTypeParameters,
C
corentih 已提交
737
    HasTypeParameters(// Type parameters.
738
                      &'b Generics,
739

C
corentih 已提交
740
                      // The kind of the rib used for type parameters.
741
                      RibKind<'a>),
742 743
}

744
// The rib kind controls the translation of local
745
// definitions (`Def::Local`) to upvars (`Def::Upvar`).
N
Niko Matsakis 已提交
746
#[derive(Copy, Clone, Debug)]
747
enum RibKind<'a> {
748 749
    // No translation needs to be applied.
    NormalRibKind,
750

751 752
    // We passed through a closure scope at the given node ID.
    // Translate upvars as appropriate.
753
    ClosureRibKind(NodeId /* func id */),
754

755
    // We passed through an impl or trait and are now in one of its
756
    // methods. Allow references to ty params that impl or trait
757 758
    // binds. Disallow any other upvars (including other ty params that are
    // upvars).
759 760 761
    //
    // The boolean value represents the fact that this method is static or not.
    MethodRibKind(bool),
762

763 764
    // We passed through an item scope. Disallow upvars.
    ItemRibKind,
765 766

    // We're in a constant item. Can't refer to dynamic stuff.
C
corentih 已提交
767
    ConstantItemRibKind,
768

769 770
    // We passed through a module.
    ModuleRibKind(Module<'a>),
771

772 773
    // We passed through a `macro_rules!` statement
    MacroDefinition(DefId),
774 775 776 777 778

    // All bindings in this rib are type parameters that can't be used
    // from the default of a type parameter because they're not declared
    // before said type parameter. Also see the `visit_generics` override.
    ForwardTyParamBanRibKind,
779 780
}

781
/// One local scope.
J
Jorge Aparicio 已提交
782
#[derive(Debug)]
783
struct Rib<'a> {
784
    bindings: FxHashMap<Ident, Def>,
785
    kind: RibKind<'a>,
B
Brian Anderson 已提交
786
}
787

788 789
impl<'a> Rib<'a> {
    fn new(kind: RibKind<'a>) -> Rib<'a> {
790
        Rib {
791
            bindings: FxHashMap(),
C
corentih 已提交
792
            kind: kind,
793
        }
794 795 796
    }
}

797 798
enum LexicalScopeBinding<'a> {
    Item(&'a NameBinding<'a>),
J
Jeffrey Seyfried 已提交
799
    Def(Def),
800 801
}

802
impl<'a> LexicalScopeBinding<'a> {
803
    fn item(self) -> Option<&'a NameBinding<'a>> {
804
        match self {
805
            LexicalScopeBinding::Item(binding) => Some(binding),
806 807 808
            _ => None,
        }
    }
809 810 811 812 813 814 815

    fn def(self) -> Def {
        match self {
            LexicalScopeBinding::Item(binding) => binding.def(),
            LexicalScopeBinding::Def(def) => def,
        }
    }
816 817
}

J
Jeffrey Seyfried 已提交
818 819 820 821 822 823 824 825
#[derive(Clone)]
enum PathResult<'a> {
    Module(Module<'a>),
    NonModule(PathResolution),
    Indeterminate,
    Failed(String, bool /* is the error from the last segment? */),
}

J
Jeffrey Seyfried 已提交
826 827 828
enum ModuleKind {
    Block(NodeId),
    Def(Def, Name),
829 830
}

831
/// One node in the tree of modules.
832
pub struct ModuleData<'a> {
J
Jeffrey Seyfried 已提交
833 834
    parent: Option<Module<'a>>,
    kind: ModuleKind,
835

836 837
    // The def id of the closest normal module (`mod`) ancestor (including this module).
    normal_ancestor_id: DefId,
838

839
    resolutions: RefCell<FxHashMap<(Ident, Namespace), &'a RefCell<NameResolution<'a>>>>,
840
    legacy_macro_resolutions: RefCell<Vec<(Mark, Ident, Span, MacroKind)>>,
841
    macro_resolutions: RefCell<Vec<(Box<[Ident]>, Span)>>,
842

843 844 845
    // Macro invocations that can expand into items in this module.
    unresolved_invocations: RefCell<FxHashSet<Mark>>,

846
    no_implicit_prelude: bool,
847

848
    glob_importers: RefCell<Vec<&'a ImportDirective<'a>>>,
849
    globs: RefCell<Vec<&'a ImportDirective<'a>>>,
850

J
Jeffrey Seyfried 已提交
851
    // Used to memoize the traits in this module for faster searches through all traits in scope.
852
    traits: RefCell<Option<Box<[(Ident, &'a NameBinding<'a>)]>>>,
J
Jeffrey Seyfried 已提交
853

854 855 856
    // Whether this module is populated. If not populated, any attempt to
    // access the children must be preceded with a
    // `populate_module_if_necessary` call.
857
    populated: Cell<bool>,
858 859 860

    /// Span of the module itself. Used for error reporting.
    span: Span,
J
Jeffrey Seyfried 已提交
861 862

    expansion: Mark,
863 864
}

865
pub type Module<'a> = &'a ModuleData<'a>;
866

867
impl<'a> ModuleData<'a> {
O
Oliver Schneider 已提交
868 869 870
    fn new(parent: Option<Module<'a>>,
           kind: ModuleKind,
           normal_ancestor_id: DefId,
J
Jeffrey Seyfried 已提交
871
           expansion: Mark,
O
Oliver Schneider 已提交
872
           span: Span) -> Self {
873
        ModuleData {
J
Jeffrey Seyfried 已提交
874 875
            parent: parent,
            kind: kind,
876
            normal_ancestor_id: normal_ancestor_id,
877
            resolutions: RefCell::new(FxHashMap()),
878
            legacy_macro_resolutions: RefCell::new(Vec::new()),
879
            macro_resolutions: RefCell::new(Vec::new()),
880
            unresolved_invocations: RefCell::new(FxHashSet()),
881
            no_implicit_prelude: false,
882
            glob_importers: RefCell::new(Vec::new()),
883
            globs: RefCell::new((Vec::new())),
J
Jeffrey Seyfried 已提交
884
            traits: RefCell::new(None),
885
            populated: Cell::new(normal_ancestor_id.is_local()),
886
            span: span,
J
Jeffrey Seyfried 已提交
887
            expansion: expansion,
888
        }
B
Brian Anderson 已提交
889 890
    }

891 892 893
    fn for_each_child<F: FnMut(Ident, Namespace, &'a NameBinding<'a>)>(&self, mut f: F) {
        for (&(ident, ns), name_resolution) in self.resolutions.borrow().iter() {
            name_resolution.borrow().binding.map(|binding| f(ident, ns, binding));
894 895 896
        }
    }

J
Jeffrey Seyfried 已提交
897 898 899 900 901 902 903
    fn def(&self) -> Option<Def> {
        match self.kind {
            ModuleKind::Def(def, _) => Some(def),
            _ => None,
        }
    }

904
    fn def_id(&self) -> Option<DefId> {
J
Jeffrey Seyfried 已提交
905
        self.def().as_ref().map(Def::def_id)
906 907
    }

908
    // `self` resolves to the first module ancestor that `is_normal`.
909
    fn is_normal(&self) -> bool {
J
Jeffrey Seyfried 已提交
910 911
        match self.kind {
            ModuleKind::Def(Def::Mod(_), _) => true,
912 913 914 915 916
            _ => false,
        }
    }

    fn is_trait(&self) -> bool {
J
Jeffrey Seyfried 已提交
917 918
        match self.kind {
            ModuleKind::Def(Def::Trait(_), _) => true,
919
            _ => false,
920
        }
B
Brian Anderson 已提交
921
    }
922 923

    fn is_local(&self) -> bool {
924
        self.normal_ancestor_id.is_local()
925
    }
926 927 928 929

    fn nearest_item_scope(&'a self) -> Module<'a> {
        if self.is_trait() { self.parent.unwrap() } else { self }
    }
V
Victor Berger 已提交
930 931
}

932
impl<'a> fmt::Debug for ModuleData<'a> {
933
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
J
Jeffrey Seyfried 已提交
934
        write!(f, "{:?}", self.def())
935 936 937
    }
}

938
// Records a possibly-private value, type, or module definition.
939
#[derive(Clone, Debug)]
940
pub struct NameBinding<'a> {
941
    kind: NameBindingKind<'a>,
942
    expansion: Mark,
943
    span: Span,
944
    vis: ty::Visibility,
945 946
}

947
pub trait ToNameBinding<'a> {
J
Jeffrey Seyfried 已提交
948
    fn to_name_binding(self, arenas: &'a ResolverArenas<'a>) -> &'a NameBinding<'a>;
949 950
}

J
Jeffrey Seyfried 已提交
951 952
impl<'a> ToNameBinding<'a> for &'a NameBinding<'a> {
    fn to_name_binding(self, _: &'a ResolverArenas<'a>) -> &'a NameBinding<'a> {
953 954 955 956
        self
    }
}

957
#[derive(Clone, Debug)]
958
enum NameBindingKind<'a> {
959
    Def(Def),
960
    Module(Module<'a>),
961 962
    Import {
        binding: &'a NameBinding<'a>,
963
        directive: &'a ImportDirective<'a>,
964
        used: Cell<bool>,
J
Jeffrey Seyfried 已提交
965
        legacy_self_import: bool,
966
    },
967 968 969
    Ambiguity {
        b1: &'a NameBinding<'a>,
        b2: &'a NameBinding<'a>,
970
        legacy: bool,
971
    }
972 973
}

974 975
struct PrivacyError<'a>(Span, Name, &'a NameBinding<'a>);

J
Jeffrey Seyfried 已提交
976 977 978
struct AmbiguityError<'a> {
    span: Span,
    name: Name,
979
    lexical: bool,
J
Jeffrey Seyfried 已提交
980 981
    b1: &'a NameBinding<'a>,
    b2: &'a NameBinding<'a>,
982
    legacy: bool,
J
Jeffrey Seyfried 已提交
983 984
}

985
impl<'a> NameBinding<'a> {
J
Jeffrey Seyfried 已提交
986
    fn module(&self) -> Option<Module<'a>> {
987
        match self.kind {
J
Jeffrey Seyfried 已提交
988
            NameBindingKind::Module(module) => Some(module),
989
            NameBindingKind::Import { binding, .. } => binding.module(),
990
            NameBindingKind::Ambiguity { legacy: true, b1, .. } => b1.module(),
J
Jeffrey Seyfried 已提交
991
            _ => None,
992 993 994
        }
    }

995
    fn def(&self) -> Def {
996
        match self.kind {
997
            NameBindingKind::Def(def) => def,
J
Jeffrey Seyfried 已提交
998
            NameBindingKind::Module(module) => module.def().unwrap(),
999
            NameBindingKind::Import { binding, .. } => binding.def(),
1000
            NameBindingKind::Ambiguity { legacy: true, b1, .. } => b1.def(),
1001
            NameBindingKind::Ambiguity { .. } => Def::Err,
1002
        }
1003
    }
1004

1005
    fn def_ignoring_ambiguity(&self) -> Def {
J
Jeffrey Seyfried 已提交
1006
        match self.kind {
1007 1008 1009
            NameBindingKind::Import { binding, .. } => binding.def_ignoring_ambiguity(),
            NameBindingKind::Ambiguity { b1, .. } => b1.def_ignoring_ambiguity(),
            _ => self.def(),
J
Jeffrey Seyfried 已提交
1010 1011 1012
        }
    }

1013 1014 1015 1016
    fn get_macro(&self, resolver: &mut Resolver<'a>) -> Rc<SyntaxExtension> {
        resolver.get_macro(self.def_ignoring_ambiguity())
    }

1017 1018 1019 1020 1021 1022 1023
    // We sometimes need to treat variants as `pub` for backwards compatibility
    fn pseudo_vis(&self) -> ty::Visibility {
        if self.is_variant() { ty::Visibility::Public } else { self.vis }
    }

    fn is_variant(&self) -> bool {
        match self.kind {
1024 1025
            NameBindingKind::Def(Def::Variant(..)) |
            NameBindingKind::Def(Def::VariantCtor(..)) => true,
1026 1027
            _ => false,
        }
1028 1029
    }

1030
    fn is_extern_crate(&self) -> bool {
1031 1032 1033 1034 1035 1036 1037 1038
        match self.kind {
            NameBindingKind::Import {
                directive: &ImportDirective {
                    subclass: ImportDirectiveSubclass::ExternCrate, ..
                }, ..
            } => true,
            _ => false,
        }
1039
    }
1040 1041 1042 1043 1044 1045 1046

    fn is_import(&self) -> bool {
        match self.kind {
            NameBindingKind::Import { .. } => true,
            _ => false,
        }
    }
1047 1048 1049 1050

    fn is_glob_import(&self) -> bool {
        match self.kind {
            NameBindingKind::Import { directive, .. } => directive.is_glob(),
1051
            NameBindingKind::Ambiguity { b1, .. } => b1.is_glob_import(),
1052 1053 1054 1055 1056
            _ => false,
        }
    }

    fn is_importable(&self) -> bool {
1057
        match self.def() {
1058 1059 1060 1061
            Def::AssociatedConst(..) | Def::Method(..) | Def::AssociatedTy(..) => false,
            _ => true,
        }
    }
1062 1063 1064 1065 1066 1067 1068

    fn is_macro_def(&self) -> bool {
        match self.kind {
            NameBindingKind::Def(Def::Macro(..)) => true,
            _ => false,
        }
    }
1069 1070 1071 1072

    fn descr(&self) -> &'static str {
        if self.is_extern_crate() { "extern crate" } else { self.def().kind_name() }
    }
1073 1074
}

1075
/// Interns the names of the primitive types.
F
Felix S. Klock II 已提交
1076
struct PrimitiveTypeTable {
1077
    primitive_types: FxHashMap<Name, PrimTy>,
1078
}
1079

1080
impl PrimitiveTypeTable {
K
Kevin Butler 已提交
1081
    fn new() -> PrimitiveTypeTable {
1082
        let mut table = PrimitiveTypeTable { primitive_types: FxHashMap() };
C
corentih 已提交
1083 1084 1085

        table.intern("bool", TyBool);
        table.intern("char", TyChar);
1086 1087
        table.intern("f32", TyFloat(FloatTy::F32));
        table.intern("f64", TyFloat(FloatTy::F64));
1088 1089 1090 1091 1092
        table.intern("isize", TyInt(IntTy::Is));
        table.intern("i8", TyInt(IntTy::I8));
        table.intern("i16", TyInt(IntTy::I16));
        table.intern("i32", TyInt(IntTy::I32));
        table.intern("i64", TyInt(IntTy::I64));
1093
        table.intern("i128", TyInt(IntTy::I128));
C
corentih 已提交
1094
        table.intern("str", TyStr);
1095 1096 1097 1098 1099
        table.intern("usize", TyUint(UintTy::Us));
        table.intern("u8", TyUint(UintTy::U8));
        table.intern("u16", TyUint(UintTy::U16));
        table.intern("u32", TyUint(UintTy::U32));
        table.intern("u64", TyUint(UintTy::U64));
1100
        table.intern("u128", TyUint(UintTy::U128));
K
Kevin Butler 已提交
1101 1102 1103
        table
    }

1104
    fn intern(&mut self, string: &str, primitive_type: PrimTy) {
1105
        self.primitive_types.insert(Symbol::intern(string), primitive_type);
1106 1107 1108
    }
}

1109
/// The main resolver class.
1110
pub struct Resolver<'a> {
E
Eduard Burtescu 已提交
1111
    session: &'a Session,
1112

1113
    pub definitions: Definitions,
1114

1115
    graph_root: Module<'a>,
1116

1117 1118
    prelude: Option<Module<'a>>,

1119 1120
    // n.b. This is used only for better diagnostics, not name resolution itself.
    has_self: FxHashSet<DefId>,
1121

V
Vadim Petrochenkov 已提交
1122 1123
    // Names of fields of an item `DefId` accessible with dot syntax.
    // Used for hints during error reporting.
1124
    field_names: FxHashMap<DefId, Vec<Name>>,
1125

1126 1127 1128 1129
    // All imports known to succeed or fail.
    determined_imports: Vec<&'a ImportDirective<'a>>,

    // All non-determined imports.
1130
    indeterminate_imports: Vec<&'a ImportDirective<'a>>,
1131 1132

    // The module that represents the current item scope.
1133
    current_module: Module<'a>,
1134

J
Jeffrey Seyfried 已提交
1135
    // The current set of local scopes for types and values.
1136
    // FIXME #4948: Reuse ribs to avoid allocation.
J
Jeffrey Seyfried 已提交
1137
    ribs: PerNS<Vec<Rib<'a>>>,
1138

1139
    // The current set of local scopes, for labels.
1140
    label_ribs: Vec<Rib<'a>>,
1141

1142
    // The trait that the current context can refer to.
1143
    current_trait_ref: Option<(Module<'a>, TraitRef)>,
1144 1145 1146

    // The current self type if inside an impl (used for better errors).
    current_self_type: Option<Ty>,
1147

1148
    // The idents for the primitive types.
E
Eduard Burtescu 已提交
1149
    primitive_type_table: PrimitiveTypeTable,
1150

1151
    def_map: DefMap,
1152
    pub freevars: FreevarMap,
1153
    freevars_seen: NodeMap<NodeMap<usize>>,
1154 1155
    pub export_map: ExportMap,
    pub trait_map: TraitMap,
1156

1157
    // A map from nodes to anonymous modules.
1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
    // Anonymous modules are pseudo-modules that are implicitly created around items
    // contained within blocks.
    //
    // For example, if we have this:
    //
    //  fn f() {
    //      fn g() {
    //          ...
    //      }
    //  }
    //
    // There will be an anonymous module created around `g` with the ID of the
    // entry block for `f`.
1171 1172
    block_map: NodeMap<Module<'a>>,
    module_map: FxHashMap<DefId, Module<'a>>,
J
Jeffrey Seyfried 已提交
1173
    extern_module_map: FxHashMap<(DefId, bool /* MacrosOnly? */), Module<'a>>,
1174

1175
    pub make_glob_map: bool,
1176 1177
    // Maps imports to the names of items actually imported (this actually maps
    // all imports, but only glob imports are actually interesting).
1178
    pub glob_map: GlobMap,
1179

1180
    used_imports: FxHashSet<(NodeId, Namespace)>,
1181
    pub maybe_unused_trait_imports: NodeSet,
G
Garming Sam 已提交
1182

1183
    privacy_errors: Vec<PrivacyError<'a>>,
J
Jeffrey Seyfried 已提交
1184
    ambiguity_errors: Vec<AmbiguityError<'a>>,
J
Jeffrey Seyfried 已提交
1185
    gated_errors: FxHashSet<Span>,
1186
    disallowed_shadowing: Vec<&'a LegacyBinding<'a>>,
1187 1188

    arenas: &'a ResolverArenas<'a>,
1189
    dummy_binding: &'a NameBinding<'a>,
1190
    use_extern_macros: bool, // true if `#![feature(use_extern_macros)]`
1191

1192
    crate_loader: &'a mut CrateLoader,
J
Jeffrey Seyfried 已提交
1193
    macro_names: FxHashSet<Ident>,
J
Jeffrey Seyfried 已提交
1194
    global_macros: FxHashMap<Name, &'a NameBinding<'a>>,
J
Jeffrey Seyfried 已提交
1195
    lexical_macro_resolutions: Vec<(Ident, &'a Cell<LegacyScope<'a>>)>,
J
Jeffrey Seyfried 已提交
1196
    macro_map: FxHashMap<DefId, Rc<SyntaxExtension>>,
1197 1198
    macro_defs: FxHashMap<Mark, DefId>,
    local_macro_def_scopes: FxHashMap<NodeId, Module<'a>>,
J
Jeffrey Seyfried 已提交
1199
    macro_exports: Vec<Export>,
1200
    pub whitelisted_legacy_custom_derives: Vec<Name>,
1201
    pub found_unresolved_macro: bool,
1202

E
est31 已提交
1203
    // List of crate local macros that we need to warn about as being unused.
E
est31 已提交
1204
    // Right now this only includes macro_rules! macros, and macros 2.0.
E
est31 已提交
1205
    unused_macros: FxHashSet<DefId>,
E
est31 已提交
1206

1207
    // Maps the `Mark` of an expansion to its containing module or block.
1208
    invocations: FxHashMap<Mark, &'a InvocationData<'a>>,
1209 1210 1211

    // Avoid duplicated errors for "name already defined".
    name_already_seen: FxHashMap<Name, Span>,
1212 1213 1214 1215 1216 1217

    // If `#![feature(proc_macro)]` is set
    proc_macro_enabled: bool,

    // A set of procedural macros imported by `#[macro_use]` that have already been warned about
    warned_proc_macros: FxHashSet<Name>,
1218 1219

    potentially_unused_imports: Vec<&'a ImportDirective<'a>>,
1220

1221 1222 1223
    // This table maps struct IDs into struct constructor IDs,
    // it's not used during normal resolution, only for better error reporting.
    struct_constructors: DefIdMap<(Def, ty::Visibility)>,
1224 1225
}

1226
pub struct ResolverArenas<'a> {
1227
    modules: arena::TypedArena<ModuleData<'a>>,
1228
    local_modules: RefCell<Vec<Module<'a>>>,
1229
    name_bindings: arena::TypedArena<NameBinding<'a>>,
1230
    import_directives: arena::TypedArena<ImportDirective<'a>>,
1231
    name_resolutions: arena::TypedArena<RefCell<NameResolution<'a>>>,
1232
    invocation_data: arena::TypedArena<InvocationData<'a>>,
J
Jeffrey Seyfried 已提交
1233
    legacy_bindings: arena::TypedArena<LegacyBinding<'a>>,
1234 1235 1236
}

impl<'a> ResolverArenas<'a> {
1237
    fn alloc_module(&'a self, module: ModuleData<'a>) -> Module<'a> {
1238 1239 1240 1241 1242 1243 1244 1245
        let module = self.modules.alloc(module);
        if module.def_id().map(|def_id| def_id.is_local()).unwrap_or(true) {
            self.local_modules.borrow_mut().push(module);
        }
        module
    }
    fn local_modules(&'a self) -> ::std::cell::Ref<'a, Vec<Module<'a>>> {
        self.local_modules.borrow()
1246 1247 1248 1249
    }
    fn alloc_name_binding(&'a self, name_binding: NameBinding<'a>) -> &'a NameBinding<'a> {
        self.name_bindings.alloc(name_binding)
    }
1250 1251
    fn alloc_import_directive(&'a self, import_directive: ImportDirective<'a>)
                              -> &'a ImportDirective {
1252 1253
        self.import_directives.alloc(import_directive)
    }
1254 1255 1256
    fn alloc_name_resolution(&'a self) -> &'a RefCell<NameResolution<'a>> {
        self.name_resolutions.alloc(Default::default())
    }
1257 1258 1259
    fn alloc_invocation_data(&'a self, expansion_data: InvocationData<'a>)
                             -> &'a InvocationData<'a> {
        self.invocation_data.alloc(expansion_data)
J
Jeffrey Seyfried 已提交
1260
    }
J
Jeffrey Seyfried 已提交
1261 1262 1263
    fn alloc_legacy_binding(&'a self, binding: LegacyBinding<'a>) -> &'a LegacyBinding<'a> {
        self.legacy_bindings.alloc(binding)
    }
1264 1265
}

1266 1267 1268 1269 1270 1271
impl<'a, 'b: 'a> ty::DefIdTree for &'a Resolver<'b> {
    fn parent(self, id: DefId) -> Option<DefId> {
        match id.krate {
            LOCAL_CRATE => self.definitions.def_key(id.index).parent,
            _ => self.session.cstore.def_key(id).parent,
        }.map(|index| DefId { index: index, ..id })
1272 1273 1274
    }
}

1275
impl<'a> hir::lowering::Resolver for Resolver<'a> {
J
Jeffrey Seyfried 已提交
1276
    fn resolve_hir_path(&mut self, path: &mut hir::Path, is_value: bool) {
1277
        let namespace = if is_value { ValueNS } else { TypeNS };
1278
        let hir::Path { ref segments, span, ref mut def } = *path;
J
Jeffrey Seyfried 已提交
1279
        let path: Vec<_> = segments.iter().map(|seg| Ident::with_empty_ctxt(seg.name)).collect();
1280
        match self.resolve_path(&path, Some(namespace), true, span) {
J
Jeffrey Seyfried 已提交
1281
            PathResult::Module(module) => *def = module.def().unwrap(),
1282 1283
            PathResult::NonModule(path_res) if path_res.unresolved_segments() == 0 =>
                *def = path_res.base_def(),
1284
            PathResult::NonModule(..) => match self.resolve_path(&path, None, true, span) {
J
Jeffrey Seyfried 已提交
1285 1286 1287 1288 1289 1290 1291 1292
                PathResult::Failed(msg, _) => {
                    resolve_error(self, span, ResolutionError::FailedToResolve(&msg));
                }
                _ => {}
            },
            PathResult::Indeterminate => unreachable!(),
            PathResult::Failed(msg, _) => {
                resolve_error(self, span, ResolutionError::FailedToResolve(&msg));
1293 1294 1295 1296
            }
        }
    }

1297 1298 1299 1300
    fn get_resolution(&mut self, id: NodeId) -> Option<PathResolution> {
        self.def_map.get(&id).cloned()
    }

1301 1302
    fn definitions(&mut self) -> &mut Definitions {
        &mut self.definitions
1303 1304 1305
    }
}

1306
impl<'a> Resolver<'a> {
1307
    pub fn new(session: &'a Session,
1308
               krate: &Crate,
1309
               crate_name: &str,
1310
               make_glob_map: MakeGlobMap,
1311
               crate_loader: &'a mut CrateLoader,
1312
               arenas: &'a ResolverArenas<'a>)
1313
               -> Resolver<'a> {
1314 1315
        let root_def_id = DefId::local(CRATE_DEF_INDEX);
        let root_module_kind = ModuleKind::Def(Def::Mod(root_def_id), keywords::Invalid.name());
1316
        let graph_root = arenas.alloc_module(ModuleData {
1317
            no_implicit_prelude: attr::contains_name(&krate.attrs, "no_implicit_prelude"),
J
Jeffrey Seyfried 已提交
1318
            ..ModuleData::new(None, root_module_kind, root_def_id, Mark::root(), krate.span)
1319
        });
1320 1321
        let mut module_map = FxHashMap();
        module_map.insert(DefId::local(CRATE_DEF_INDEX), graph_root);
K
Kevin Butler 已提交
1322

1323
        let mut definitions = Definitions::new();
J
Jeffrey Seyfried 已提交
1324
        DefCollector::new(&mut definitions, Mark::root())
1325
            .collect_root(crate_name, &session.local_crate_disambiguator().as_str());
1326

1327
        let mut invocations = FxHashMap();
1328 1329
        invocations.insert(Mark::root(),
                           arenas.alloc_invocation_data(InvocationData::root(graph_root)));
1330

1331 1332
        let features = session.features.borrow();

1333 1334 1335
        let mut macro_defs = FxHashMap();
        macro_defs.insert(Mark::root(), root_def_id);

K
Kevin Butler 已提交
1336 1337 1338
        Resolver {
            session: session,

1339
            definitions: definitions,
1340

K
Kevin Butler 已提交
1341 1342
            // The outermost module has def ID 0; this is not reflected in the
            // AST.
1343
            graph_root: graph_root,
1344
            prelude: None,
K
Kevin Butler 已提交
1345

1346
            has_self: FxHashSet(),
1347
            field_names: FxHashMap(),
K
Kevin Butler 已提交
1348

1349
            determined_imports: Vec::new(),
1350
            indeterminate_imports: Vec::new(),
K
Kevin Butler 已提交
1351

1352
            current_module: graph_root,
J
Jeffrey Seyfried 已提交
1353 1354 1355
            ribs: PerNS {
                value_ns: vec![Rib::new(ModuleRibKind(graph_root))],
                type_ns: vec![Rib::new(ModuleRibKind(graph_root))],
1356
                macro_ns: Some(vec![Rib::new(ModuleRibKind(graph_root))]),
J
Jeffrey Seyfried 已提交
1357
            },
1358
            label_ribs: Vec::new(),
K
Kevin Butler 已提交
1359 1360 1361 1362 1363 1364

            current_trait_ref: None,
            current_self_type: None,

            primitive_type_table: PrimitiveTypeTable::new(),

1365
            def_map: NodeMap(),
1366 1367
            freevars: NodeMap(),
            freevars_seen: NodeMap(),
1368 1369
            export_map: NodeMap(),
            trait_map: NodeMap(),
1370
            module_map: module_map,
1371
            block_map: NodeMap(),
J
Jeffrey Seyfried 已提交
1372
            extern_module_map: FxHashMap(),
K
Kevin Butler 已提交
1373

1374
            make_glob_map: make_glob_map == MakeGlobMap::Yes,
1375
            glob_map: NodeMap(),
G
Garming Sam 已提交
1376

1377
            used_imports: FxHashSet(),
S
Seo Sanghyeon 已提交
1378 1379
            maybe_unused_trait_imports: NodeSet(),

1380
            privacy_errors: Vec::new(),
1381
            ambiguity_errors: Vec::new(),
J
Jeffrey Seyfried 已提交
1382
            gated_errors: FxHashSet(),
1383
            disallowed_shadowing: Vec::new(),
1384 1385

            arenas: arenas,
1386 1387
            dummy_binding: arenas.alloc_name_binding(NameBinding {
                kind: NameBindingKind::Def(Def::Err),
1388
                expansion: Mark::root(),
1389 1390 1391
                span: DUMMY_SP,
                vis: ty::Visibility::Public,
            }),
1392

1393 1394 1395
            // The `proc_macro` and `decl_macro` features imply `use_extern_macros`
            use_extern_macros:
                features.use_extern_macros || features.proc_macro || features.decl_macro,
1396

1397
            crate_loader: crate_loader,
1398
            macro_names: FxHashSet(),
J
Jeffrey Seyfried 已提交
1399
            global_macros: FxHashMap(),
J
Jeffrey Seyfried 已提交
1400
            lexical_macro_resolutions: Vec::new(),
J
Jeffrey Seyfried 已提交
1401 1402
            macro_map: FxHashMap(),
            macro_exports: Vec::new(),
1403
            invocations: invocations,
1404 1405
            macro_defs: macro_defs,
            local_macro_def_scopes: FxHashMap(),
1406
            name_already_seen: FxHashMap(),
1407
            whitelisted_legacy_custom_derives: Vec::new(),
1408 1409
            proc_macro_enabled: features.proc_macro,
            warned_proc_macros: FxHashSet(),
1410
            potentially_unused_imports: Vec::new(),
1411
            struct_constructors: DefIdMap(),
1412
            found_unresolved_macro: false,
E
est31 已提交
1413
            unused_macros: FxHashSet(),
1414 1415 1416
        }
    }

1417
    pub fn arenas() -> ResolverArenas<'a> {
1418 1419
        ResolverArenas {
            modules: arena::TypedArena::new(),
1420
            local_modules: RefCell::new(Vec::new()),
1421
            name_bindings: arena::TypedArena::new(),
1422
            import_directives: arena::TypedArena::new(),
1423
            name_resolutions: arena::TypedArena::new(),
1424
            invocation_data: arena::TypedArena::new(),
J
Jeffrey Seyfried 已提交
1425
            legacy_bindings: arena::TypedArena::new(),
K
Kevin Butler 已提交
1426 1427
        }
    }
1428

J
Jeffrey Seyfried 已提交
1429 1430 1431 1432
    fn per_ns<T, F: FnMut(&mut Self, Namespace) -> T>(&mut self, mut f: F) -> PerNS<T> {
        PerNS {
            type_ns: f(self, TypeNS),
            value_ns: f(self, ValueNS),
1433 1434 1435 1436
            macro_ns: match self.use_extern_macros {
                true => Some(f(self, MacroNS)),
                false => None,
            },
J
Jeffrey Seyfried 已提交
1437 1438 1439
        }
    }

1440 1441
    /// Entry point to crate resolution.
    pub fn resolve_crate(&mut self, krate: &Crate) {
1442
        ImportResolver { resolver: self }.finalize_imports();
1443
        self.current_module = self.graph_root;
1444
        self.finalize_current_module_macro_resolutions();
1445 1446 1447
        visit::walk_crate(self, krate);

        check_unused::check_crate(self, krate);
1448
        self.report_errors();
1449
        self.crate_loader.postprocess(krate);
1450 1451
    }

O
Oliver Schneider 已提交
1452 1453 1454 1455 1456
    fn new_module(
        &self,
        parent: Module<'a>,
        kind: ModuleKind,
        normal_ancestor_id: DefId,
J
Jeffrey Seyfried 已提交
1457
        expansion: Mark,
O
Oliver Schneider 已提交
1458 1459
        span: Span,
    ) -> Module<'a> {
J
Jeffrey Seyfried 已提交
1460 1461
        let module = ModuleData::new(Some(parent), kind, normal_ancestor_id, expansion, span);
        self.arenas.alloc_module(module)
1462 1463
    }

1464
    fn record_use(&mut self, ident: Ident, ns: Namespace, binding: &'a NameBinding<'a>, span: Span)
1465
                  -> bool /* true if an error was reported */ {
1466
        match binding.kind {
J
Jeffrey Seyfried 已提交
1467 1468
            NameBindingKind::Import { directive, binding, ref used, legacy_self_import }
                    if !used.get() => {
1469
                used.set(true);
1470
                directive.used.set(true);
J
Jeffrey Seyfried 已提交
1471 1472 1473 1474
                if legacy_self_import {
                    self.warn_legacy_self_import(directive);
                    return false;
                }
1475
                self.used_imports.insert((directive.id, ns));
1476 1477
                self.add_to_glob_map(directive.id, ident);
                self.record_use(ident, ns, binding, span)
1478 1479
            }
            NameBindingKind::Import { .. } => false,
1480
            NameBindingKind::Ambiguity { b1, b2, legacy } => {
1481
                self.ambiguity_errors.push(AmbiguityError {
1482
                    span: span, name: ident.name, lexical: false, b1: b1, b2: b2, legacy: legacy,
1483
                });
1484
                if legacy {
A
Alex Crichton 已提交
1485
                    self.record_use(ident, ns, b1, span);
1486 1487
                }
                !legacy
1488 1489
            }
            _ => false
1490
        }
1491
    }
1492

1493
    fn add_to_glob_map(&mut self, id: NodeId, ident: Ident) {
1494
        if self.make_glob_map {
1495
            self.glob_map.entry(id).or_insert_with(FxHashSet).insert(ident.name);
1496
        }
1497 1498
    }

1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512
    /// This resolves the identifier `ident` in the namespace `ns` in the current lexical scope.
    /// More specifically, we proceed up the hierarchy of scopes and return the binding for
    /// `ident` in the first scope that defines it (or None if no scopes define it).
    ///
    /// A block's items are above its local variables in the scope hierarchy, regardless of where
    /// the items are defined in the block. For example,
    /// ```rust
    /// fn f() {
    ///    g(); // Since there are no local variables in scope yet, this resolves to the item.
    ///    let g = || {};
    ///    fn g() {}
    ///    g(); // This resolves to the local variable `g` since it shadows the item.
    /// }
    /// ```
1513
    ///
1514 1515
    /// Invariant: This must only be called during main resolution, not during
    /// import resolution.
1516
    fn resolve_ident_in_lexical_scope(&mut self,
1517
                                      mut ident: Ident,
1518
                                      ns: Namespace,
1519 1520
                                      record_used: bool,
                                      path_span: Span)
1521
                                      -> Option<LexicalScopeBinding<'a>> {
1522
        if ns == TypeNS {
J
Jeffrey Seyfried 已提交
1523 1524 1525 1526 1527
            ident.ctxt = if ident.name == keywords::SelfType.name() {
                SyntaxContext::empty() // FIXME(jseyfried) improve `Self` hygiene
            } else {
                ident.ctxt.modern()
            }
1528
        }
1529

1530
        // Walk backwards up the ribs in scope.
J
Jeffrey Seyfried 已提交
1531
        let mut module = self.graph_root;
J
Jeffrey Seyfried 已提交
1532 1533
        for i in (0 .. self.ribs[ns].len()).rev() {
            if let Some(def) = self.ribs[ns][i].bindings.get(&ident).cloned() {
1534
                // The ident resolves to a type parameter or local variable.
1535
                return Some(LexicalScopeBinding::Def(
1536
                    self.adjust_local_def(ns, i, def, record_used, path_span)
1537
                ));
1538 1539
            }

J
Jeffrey Seyfried 已提交
1540 1541 1542 1543 1544 1545 1546
            module = match self.ribs[ns][i].kind {
                ModuleRibKind(module) => module,
                MacroDefinition(def) if def == self.macro_defs[&ident.ctxt.outer()] => {
                    // If an invocation of this macro created `ident`, give up on `ident`
                    // and switch to `ident`'s source from the macro definition.
                    ident.ctxt.remove_mark();
                    continue
1547
                }
J
Jeffrey Seyfried 已提交
1548 1549
                _ => continue,
            };
1550

J
Jeffrey Seyfried 已提交
1551 1552 1553 1554 1555 1556
            let item = self.resolve_ident_in_module_unadjusted(
                module, ident, ns, false, record_used, path_span,
            );
            if let Ok(binding) = item {
                // The ident resolves to an item.
                return Some(LexicalScopeBinding::Item(binding));
1557
            }
1558

J
Jeffrey Seyfried 已提交
1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610
            match module.kind {
                ModuleKind::Block(..) => {}, // We can see through blocks
                _ => break,
            }
        }

        ident.ctxt = ident.ctxt.modern();
        loop {
            module = unwrap_or!(self.hygienic_lexical_parent(module, &mut ident.ctxt), break);
            let orig_current_module = self.current_module;
            self.current_module = module; // Lexical resolutions can never be a privacy error.
            let result = self.resolve_ident_in_module_unadjusted(
                module, ident, ns, false, record_used, path_span,
            );
            self.current_module = orig_current_module;

            match result {
                Ok(binding) => return Some(LexicalScopeBinding::Item(binding)),
                Err(Undetermined) => return None,
                Err(Determined) => {}
            }
        }

        match self.prelude {
            Some(prelude) if !module.no_implicit_prelude => {
                self.resolve_ident_in_module_unadjusted(prelude, ident, ns, false, false, path_span)
                    .ok().map(LexicalScopeBinding::Item)
            }
            _ => None,
        }
    }

    fn hygienic_lexical_parent(&mut self, mut module: Module<'a>, ctxt: &mut SyntaxContext)
                               -> Option<Module<'a>> {
        if !module.expansion.is_descendant_of(ctxt.outer()) {
            return Some(self.macro_def_scope(ctxt.remove_mark()));
        }

        if let ModuleKind::Block(..) = module.kind {
            return Some(module.parent.unwrap());
        }

        let mut module_expansion = module.expansion.modern(); // for backward compatability
        while let Some(parent) = module.parent {
            let parent_expansion = parent.expansion.modern();
            if module_expansion.is_descendant_of(parent_expansion) &&
               parent_expansion != module_expansion {
                return if parent_expansion.is_descendant_of(ctxt.outer()) {
                    Some(parent)
                } else {
                    None
                };
1611
            }
J
Jeffrey Seyfried 已提交
1612 1613
            module = parent;
            module_expansion = parent_expansion;
1614
        }
1615

1616 1617 1618
        None
    }

J
Jeffrey Seyfried 已提交
1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651
    fn resolve_ident_in_module(&mut self,
                               module: Module<'a>,
                               mut ident: Ident,
                               ns: Namespace,
                               ignore_unresolved_invocations: bool,
                               record_used: bool,
                               span: Span)
                               -> Result<&'a NameBinding<'a>, Determinacy> {
        ident.ctxt = ident.ctxt.modern();
        let orig_current_module = self.current_module;
        if let Some(def) = ident.ctxt.adjust(module.expansion) {
            self.current_module = self.macro_def_scope(def);
        }
        let result = self.resolve_ident_in_module_unadjusted(
            module, ident, ns, ignore_unresolved_invocations, record_used, span,
        );
        self.current_module = orig_current_module;
        result
    }

    fn resolve_crate_root(&mut self, mut ctxt: SyntaxContext) -> Module<'a> {
        let module = match ctxt.adjust(Mark::root()) {
            Some(def) => self.macro_def_scope(def),
            None => return self.graph_root,
        };
        self.get_module(DefId { index: CRATE_DEF_INDEX, ..module.normal_ancestor_id })
    }

    fn resolve_self(&mut self, ctxt: &mut SyntaxContext, module: Module<'a>) -> Module<'a> {
        let mut module = self.get_module(module.normal_ancestor_id);
        while module.span.ctxt.modern() != *ctxt {
            let parent = module.parent.unwrap_or_else(|| self.macro_def_scope(ctxt.remove_mark()));
            module = self.get_module(parent.normal_ancestor_id);
1652
        }
J
Jeffrey Seyfried 已提交
1653
        module
1654 1655
    }

1656 1657
    // AST resolution
    //
1658
    // We maintain a list of value ribs and type ribs.
1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673
    //
    // Simultaneously, we keep track of the current position in the module
    // graph in the `current_module` pointer. When we go to resolve a name in
    // the value or type namespaces, we first look through all the ribs and
    // then query the module graph. When we resolve a name in the module
    // namespace, we can skip all the ribs (since nested modules are not
    // allowed within blocks in Rust) and jump straight to the current module
    // graph node.
    //
    // Named implementations are handled separately. When we find a method
    // call, we consult the module node to find all of the implementations in
    // scope. This information is lazily cached in the module node. We then
    // generate a fake "implementation scope" containing all the
    // implementations thus found, for compatibility with old resolve pass.

1674
    fn with_scope<F>(&mut self, id: NodeId, f: F)
C
corentih 已提交
1675
        where F: FnOnce(&mut Resolver)
J
Jorge Aparicio 已提交
1676
    {
1677
        let id = self.definitions.local_def_id(id);
1678 1679
        let module = self.module_map.get(&id).cloned(); // clones a reference
        if let Some(module) = module {
1680
            // Move down in the graph.
1681
            let orig_module = replace(&mut self.current_module, module);
J
Jeffrey Seyfried 已提交
1682 1683
            self.ribs[ValueNS].push(Rib::new(ModuleRibKind(module)));
            self.ribs[TypeNS].push(Rib::new(ModuleRibKind(module)));
1684

1685
            self.finalize_current_module_macro_resolutions();
1686
            f(self);
1687

1688
            self.current_module = orig_module;
J
Jeffrey Seyfried 已提交
1689 1690
            self.ribs[ValueNS].pop();
            self.ribs[TypeNS].pop();
1691 1692 1693
        } else {
            f(self);
        }
1694 1695
    }

S
Seo Sanghyeon 已提交
1696 1697
    /// Searches the current set of local scopes for labels.
    /// Stops after meeting a closure.
1698
    fn search_label(&self, mut ident: Ident) -> Option<Def> {
1699 1700
        for rib in self.label_ribs.iter().rev() {
            match rib.kind {
J
Jeffrey Seyfried 已提交
1701 1702 1703
                NormalRibKind => {}
                // If an invocation of this macro created `ident`, give up on `ident`
                // and switch to `ident`'s source from the macro definition.
1704
                MacroDefinition(def) => {
J
Jeffrey Seyfried 已提交
1705 1706
                    if def == self.macro_defs[&ident.ctxt.outer()] {
                        ident.ctxt.remove_mark();
1707 1708
                    }
                }
1709 1710
                _ => {
                    // Do not resolve labels across function boundary
C
corentih 已提交
1711
                    return None;
1712 1713
                }
            }
1714
            let result = rib.bindings.get(&ident).cloned();
S
Seo Sanghyeon 已提交
1715
            if result.is_some() {
C
corentih 已提交
1716
                return result;
1717 1718 1719 1720 1721
            }
        }
        None
    }

1722
    fn resolve_item(&mut self, item: &Item) {
1723
        let name = item.ident.name;
1724

C
corentih 已提交
1725
        debug!("(resolving item) resolving {}", name);
1726

1727 1728
        self.check_proc_macro_attrs(&item.attrs);

1729
        match item.node {
1730 1731
            ItemKind::Enum(_, ref generics) |
            ItemKind::Ty(_, ref generics) |
1732
            ItemKind::Struct(_, ref generics) |
1733
            ItemKind::Union(_, ref generics) |
V
Vadim Petrochenkov 已提交
1734
            ItemKind::Fn(.., ref generics, _) => {
1735
                self.with_type_parameter_rib(HasTypeParameters(generics, ItemRibKind),
1736
                                             |this| visit::walk_item(this, item));
1737 1738
            }

1739
            ItemKind::DefaultImpl(_, ref trait_ref) => {
1740 1741 1742 1743
                self.with_optional_trait_ref(Some(trait_ref), |this, _| {
                    // Resolve type arguments in trait path
                    visit::walk_trait_ref(this, trait_ref);
                });
1744
            }
V
Vadim Petrochenkov 已提交
1745
            ItemKind::Impl(.., ref generics, ref opt_trait_ref, ref self_type, ref impl_items) =>
1746
                self.resolve_implementation(generics,
1747
                                            opt_trait_ref,
J
Jonas Schievink 已提交
1748
                                            &self_type,
1749
                                            item.id,
1750
                                            impl_items),
1751

1752
            ItemKind::Trait(_, ref generics, ref bounds, ref trait_items) => {
1753
                // Create a new rib for the trait-wide type parameters.
1754
                self.with_type_parameter_rib(HasTypeParameters(generics, ItemRibKind), |this| {
1755
                    let local_def_id = this.definitions.local_def_id(item.id);
1756
                    this.with_self_rib(Def::SelfTy(Some(local_def_id), None), |this| {
1757
                        this.visit_generics(generics);
1758
                        walk_list!(this, visit_ty_param_bound, bounds);
1759 1760

                        for trait_item in trait_items {
1761 1762
                            this.check_proc_macro_attrs(&trait_item.attrs);

1763
                            match trait_item.node {
1764 1765 1766
                                TraitItemKind::Const(ref ty, ref default) => {
                                    this.visit_ty(ty);

1767
                                    // Only impose the restrictions of
1768
                                    // ConstRibKind for an actual constant
1769
                                    // expression in a provided default.
1770
                                    if let Some(ref expr) = *default{
1771
                                        this.with_constant_rib(|this| {
1772
                                            this.visit_expr(expr);
1773 1774 1775
                                        });
                                    }
                                }
1776
                                TraitItemKind::Method(ref sig, _) => {
1777 1778
                                    let type_parameters =
                                        HasTypeParameters(&sig.generics,
V
Vadim Petrochenkov 已提交
1779
                                                          MethodRibKind(!sig.decl.has_self()));
1780
                                    this.with_type_parameter_rib(type_parameters, |this| {
1781
                                        visit::walk_trait_item(this, trait_item)
1782
                                    });
1783
                                }
1784
                                TraitItemKind::Type(..) => {
1785
                                    this.with_type_parameter_rib(NoTypeParameters, |this| {
1786
                                        visit::walk_trait_item(this, trait_item)
1787
                                    });
1788
                                }
1789
                                TraitItemKind::Macro(_) => panic!("unexpanded macro in resolve!"),
1790 1791 1792
                            };
                        }
                    });
1793
                });
1794 1795
            }

1796
            ItemKind::Mod(_) | ItemKind::ForeignMod(_) => {
1797
                self.with_scope(item.id, |this| {
1798
                    visit::walk_item(this, item);
1799
                });
1800 1801
            }

1802 1803 1804 1805 1806 1807 1808
            ItemKind::Static(ref ty, _, ref expr) |
            ItemKind::Const(ref ty, ref expr) => {
                self.with_item_rib(|this| {
                    this.visit_ty(ty);
                    this.with_constant_rib(|this| {
                        this.visit_expr(expr);
                    });
1809
                });
1810
            }
1811

1812
            ItemKind::Use(ref view_path) => {
1813
                match view_path.node {
1814 1815 1816
                    ast::ViewPathList(ref prefix, ref items) if items.is_empty() => {
                        // Resolve prefix of an import with empty braces (issue #28388).
                        self.smart_resolve_path(item.id, None, prefix, PathSource::ImportPrefix);
1817 1818
                    }
                    _ => {}
W
we 已提交
1819 1820 1821
                }
            }

1822
            ItemKind::ExternCrate(_) | ItemKind::MacroDef(..) | ItemKind::GlobalAsm(_)=> {
1823
                // do nothing, these are just around to be encoded
1824
            }
1825 1826

            ItemKind::Mac(_) => panic!("unexpanded macro in resolve!"),
1827 1828 1829
        }
    }

1830
    fn with_type_parameter_rib<'b, F>(&'b mut self, type_parameters: TypeParameters<'a, 'b>, f: F)
C
corentih 已提交
1831
        where F: FnOnce(&mut Resolver)
J
Jorge Aparicio 已提交
1832
    {
1833
        match type_parameters {
1834
            HasTypeParameters(generics, rib_kind) => {
1835
                let mut function_type_rib = Rib::new(rib_kind);
1836
                let mut seen_bindings = FxHashMap();
1837
                for type_parameter in &generics.ty_params {
J
Jeffrey Seyfried 已提交
1838
                    let ident = type_parameter.ident.modern();
1839
                    debug!("with_type_parameter_rib: {}", type_parameter.id);
1840

1841 1842 1843 1844 1845
                    if seen_bindings.contains_key(&ident) {
                        let span = seen_bindings.get(&ident).unwrap();
                        let err =
                            ResolutionError::NameAlreadyUsedInTypeParameterList(ident.name, span);
                        resolve_error(self, type_parameter.span, err);
1846
                    }
1847
                    seen_bindings.entry(ident).or_insert(type_parameter.span);
1848

1849
                    // plain insert (no renaming)
1850
                    let def_id = self.definitions.local_def_id(type_parameter.id);
1851
                    let def = Def::TyParam(def_id);
1852
                    function_type_rib.bindings.insert(ident, def);
1853
                    self.record_def(type_parameter.id, PathResolution::new(def));
1854
                }
J
Jeffrey Seyfried 已提交
1855
                self.ribs[TypeNS].push(function_type_rib);
1856 1857
            }

B
Brian Anderson 已提交
1858
            NoTypeParameters => {
1859 1860 1861 1862
                // Nothing to do.
            }
        }

A
Alex Crichton 已提交
1863
        f(self);
1864

J
Jeffrey Seyfried 已提交
1865
        if let HasTypeParameters(..) = type_parameters {
J
Jeffrey Seyfried 已提交
1866
            self.ribs[TypeNS].pop();
1867 1868 1869
        }
    }

C
corentih 已提交
1870 1871
    fn with_label_rib<F>(&mut self, f: F)
        where F: FnOnce(&mut Resolver)
J
Jorge Aparicio 已提交
1872
    {
1873
        self.label_ribs.push(Rib::new(NormalRibKind));
A
Alex Crichton 已提交
1874
        f(self);
J
Jeffrey Seyfried 已提交
1875
        self.label_ribs.pop();
1876
    }
1877

1878 1879 1880 1881 1882 1883 1884 1885 1886 1887
    fn with_item_rib<F>(&mut self, f: F)
        where F: FnOnce(&mut Resolver)
    {
        self.ribs[ValueNS].push(Rib::new(ItemRibKind));
        self.ribs[TypeNS].push(Rib::new(ItemRibKind));
        f(self);
        self.ribs[TypeNS].pop();
        self.ribs[ValueNS].pop();
    }

C
corentih 已提交
1888 1889
    fn with_constant_rib<F>(&mut self, f: F)
        where F: FnOnce(&mut Resolver)
J
Jorge Aparicio 已提交
1890
    {
J
Jeffrey Seyfried 已提交
1891
        self.ribs[ValueNS].push(Rib::new(ConstantItemRibKind));
A
Alex Crichton 已提交
1892
        f(self);
J
Jeffrey Seyfried 已提交
1893
        self.ribs[ValueNS].pop();
1894 1895
    }

1896 1897
    fn with_current_self_type<T, F>(&mut self, self_type: &Ty, f: F) -> T
        where F: FnOnce(&mut Resolver) -> T
J
Jorge Aparicio 已提交
1898
    {
1899 1900 1901 1902 1903 1904 1905
        // Handle nested impls (inside fn bodies)
        let previous_value = replace(&mut self.current_self_type, Some(self_type.clone()));
        let result = f(self);
        self.current_self_type = previous_value;
        result
    }

1906
    fn with_optional_trait_ref<T, F>(&mut self, opt_trait_ref: Option<&TraitRef>, f: F) -> T
1907
        where F: FnOnce(&mut Resolver, Option<DefId>) -> T
J
Jorge Aparicio 已提交
1908
    {
1909
        let mut new_val = None;
1910
        let mut new_id = None;
E
Eduard Burtescu 已提交
1911
        if let Some(trait_ref) = opt_trait_ref {
1912 1913 1914 1915 1916 1917 1918 1919
            let path: Vec<_> = trait_ref.path.segments.iter().map(|seg| seg.identifier).collect();
            let def = self.smart_resolve_path_fragment(trait_ref.ref_id,
                                                       None,
                                                       &path,
                                                       trait_ref.path.span,
                                                       trait_ref.path.segments.last().unwrap().span,
                                                       PathSource::Trait)
                .base_def();
1920 1921
            if def != Def::Err {
                new_id = Some(def.def_id());
1922 1923 1924 1925
                let span = trait_ref.path.span;
                if let PathResult::Module(module) = self.resolve_path(&path, None, false, span) {
                    new_val = Some((module, trait_ref.clone()));
                }
1926
            }
1927
        }
1928
        let original_trait_ref = replace(&mut self.current_trait_ref, new_val);
1929
        let result = f(self, new_id);
1930 1931 1932 1933
        self.current_trait_ref = original_trait_ref;
        result
    }

1934 1935 1936 1937 1938 1939
    fn with_self_rib<F>(&mut self, self_def: Def, f: F)
        where F: FnOnce(&mut Resolver)
    {
        let mut self_type_rib = Rib::new(NormalRibKind);

        // plain insert (no renaming, types are not currently hygienic....)
1940
        self_type_rib.bindings.insert(keywords::SelfType.ident(), self_def);
J
Jeffrey Seyfried 已提交
1941
        self.ribs[TypeNS].push(self_type_rib);
1942
        f(self);
J
Jeffrey Seyfried 已提交
1943
        self.ribs[TypeNS].pop();
1944 1945
    }

F
Felix S. Klock II 已提交
1946
    fn resolve_implementation(&mut self,
1947 1948 1949
                              generics: &Generics,
                              opt_trait_reference: &Option<TraitRef>,
                              self_type: &Ty,
1950
                              item_id: NodeId,
1951
                              impl_items: &[ImplItem]) {
1952
        // If applicable, create a rib for the type parameters.
1953
        self.with_type_parameter_rib(HasTypeParameters(generics, ItemRibKind), |this| {
1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975
            // Dummy self type for better errors if `Self` is used in the trait path.
            this.with_self_rib(Def::SelfTy(None, None), |this| {
                // Resolve the trait reference, if necessary.
                this.with_optional_trait_ref(opt_trait_reference.as_ref(), |this, trait_id| {
                    let item_def_id = this.definitions.local_def_id(item_id);
                    this.with_self_rib(Def::SelfTy(trait_id, Some(item_def_id)), |this| {
                        if let Some(trait_ref) = opt_trait_reference.as_ref() {
                            // Resolve type arguments in trait path
                            visit::walk_trait_ref(this, trait_ref);
                        }
                        // Resolve the self type.
                        this.visit_ty(self_type);
                        // Resolve the type parameters.
                        this.visit_generics(generics);
                        this.with_current_self_type(self_type, |this| {
                            for impl_item in impl_items {
                                this.check_proc_macro_attrs(&impl_item.attrs);
                                this.resolve_visibility(&impl_item.vis);
                                match impl_item.node {
                                    ImplItemKind::Const(..) => {
                                        // If this is a trait impl, ensure the const
                                        // exists in trait
1976
                                        this.check_trait_item(impl_item.ident,
1977 1978 1979
                                                            ValueNS,
                                                            impl_item.span,
                                            |n, s| ResolutionError::ConstNotMemberOfTrait(n, s));
1980
                                        visit::walk_impl_item(this, impl_item);
1981 1982 1983 1984
                                    }
                                    ImplItemKind::Method(ref sig, _) => {
                                        // If this is a trait impl, ensure the method
                                        // exists in trait
1985
                                        this.check_trait_item(impl_item.ident,
1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001
                                                            ValueNS,
                                                            impl_item.span,
                                            |n, s| ResolutionError::MethodNotMemberOfTrait(n, s));

                                        // We also need a new scope for the method-
                                        // specific type parameters.
                                        let type_parameters =
                                            HasTypeParameters(&sig.generics,
                                                            MethodRibKind(!sig.decl.has_self()));
                                        this.with_type_parameter_rib(type_parameters, |this| {
                                            visit::walk_impl_item(this, impl_item);
                                        });
                                    }
                                    ImplItemKind::Type(ref ty) => {
                                        // If this is a trait impl, ensure the type
                                        // exists in trait
2002
                                        this.check_trait_item(impl_item.ident,
2003 2004 2005 2006 2007 2008 2009 2010
                                                            TypeNS,
                                                            impl_item.span,
                                            |n, s| ResolutionError::TypeNotMemberOfTrait(n, s));

                                        this.visit_ty(ty);
                                    }
                                    ImplItemKind::Macro(_) =>
                                        panic!("unexpanded macro in resolve!"),
2011
                                }
2012
                            }
2013
                        });
2014
                    });
2015
                });
2016
            });
2017
        });
2018 2019
    }

2020
    fn check_trait_item<F>(&mut self, ident: Ident, ns: Namespace, span: Span, err: F)
C
corentih 已提交
2021 2022 2023 2024
        where F: FnOnce(Name, &str) -> ResolutionError
    {
        // If there is a TraitRef in scope for an impl, then the method must be in the
        // trait.
2025 2026 2027 2028
        if let Some((module, _)) = self.current_trait_ref {
            if self.resolve_ident_in_module(module, ident, ns, false, false, span).is_err() {
                let path = &self.current_trait_ref.as_ref().unwrap().1.path;
                resolve_error(self, span, err(ident.name, &path_names_to_string(path)));
2029 2030 2031 2032
            }
        }
    }

E
Eduard Burtescu 已提交
2033
    fn resolve_local(&mut self, local: &Local) {
2034
        // Resolve the type.
2035
        walk_list!(self, visit_ty, &local.ty);
2036

2037
        // Resolve the initializer.
2038
        walk_list!(self, visit_expr, &local.init);
2039 2040

        // Resolve the pattern.
2041
        self.resolve_pattern(&local.pat, PatternSource::Let, &mut FxHashMap());
2042 2043
    }

J
John Clements 已提交
2044 2045 2046 2047
    // build a map from pattern identifiers to binding-info's.
    // this is done hygienically. This could arise for a macro
    // that expands into an or-pattern where one 'x' was from the
    // user and one 'x' came from the macro.
E
Eduard Burtescu 已提交
2048
    fn binding_mode_map(&mut self, pat: &Pat) -> BindingMap {
2049
        let mut binding_map = FxHashMap();
2050 2051 2052

        pat.walk(&mut |pat| {
            if let PatKind::Ident(binding_mode, ident, ref sub_pat) = pat.node {
2053 2054
                if sub_pat.is_some() || match self.def_map.get(&pat.id).map(|res| res.base_def()) {
                    Some(Def::Local(..)) => true,
2055 2056 2057
                    _ => false,
                } {
                    let binding_info = BindingInfo { span: ident.span, binding_mode: binding_mode };
2058
                    binding_map.insert(ident.node, binding_info);
2059 2060 2061
                }
            }
            true
2062
        });
2063 2064

        binding_map
2065 2066
    }

J
John Clements 已提交
2067 2068
    // check that all of the arms in an or-pattern have exactly the
    // same set of bindings, with the same binding modes for each.
F
Felix S. Klock II 已提交
2069
    fn check_consistent_bindings(&mut self, arm: &Arm) {
2070
        if arm.pats.is_empty() {
C
corentih 已提交
2071
            return;
2072
        }
2073 2074 2075

        let mut missing_vars = FxHashMap();
        let mut inconsistent_vars = FxHashMap();
D
Daniel Micay 已提交
2076
        for (i, p) in arm.pats.iter().enumerate() {
J
Jonas Schievink 已提交
2077
            let map_i = self.binding_mode_map(&p);
2078

2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090
            for (j, q) in arm.pats.iter().enumerate() {
                if i == j {
                    continue;
                }

                let map_j = self.binding_mode_map(&q);
                for (&key, &binding_i) in &map_i {
                    if map_j.len() == 0 {                   // Account for missing bindings when
                        let binding_error = missing_vars    // map_j has none.
                            .entry(key.name)
                            .or_insert(BindingError {
                                name: key.name,
2091 2092
                                origin: BTreeSet::new(),
                                target: BTreeSet::new(),
2093 2094 2095
                            });
                        binding_error.origin.insert(binding_i.span);
                        binding_error.target.insert(q.span);
C
corentih 已提交
2096
                    }
2097 2098 2099 2100 2101 2102 2103
                    for (&key_j, &binding_j) in &map_j {
                        match map_i.get(&key_j) {
                            None => {  // missing binding
                                let binding_error = missing_vars
                                    .entry(key_j.name)
                                    .or_insert(BindingError {
                                        name: key_j.name,
2104 2105
                                        origin: BTreeSet::new(),
                                        target: BTreeSet::new(),
2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116
                                    });
                                binding_error.origin.insert(binding_j.span);
                                binding_error.target.insert(p.span);
                            }
                            Some(binding_i) => {  // check consistent binding
                                if binding_i.binding_mode != binding_j.binding_mode {
                                    inconsistent_vars
                                        .entry(key.name)
                                        .or_insert((binding_j.span, binding_i.span));
                                }
                            }
C
corentih 已提交
2117
                        }
2118
                    }
2119 2120
                }
            }
2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132
        }
        let mut missing_vars = missing_vars.iter().collect::<Vec<_>>();
        missing_vars.sort();
        for (_, v) in missing_vars {
            resolve_error(self,
                          *v.origin.iter().next().unwrap(),
                          ResolutionError::VariableNotBoundInPattern(v));
        }
        let mut inconsistent_vars = inconsistent_vars.iter().collect::<Vec<_>>();
        inconsistent_vars.sort();
        for (name, v) in inconsistent_vars {
            resolve_error(self, v.0, ResolutionError::VariableBoundWithDifferentMode(*name, v.1));
2133
        }
2134 2135
    }

F
Felix S. Klock II 已提交
2136
    fn resolve_arm(&mut self, arm: &Arm) {
J
Jeffrey Seyfried 已提交
2137
        self.ribs[ValueNS].push(Rib::new(NormalRibKind));
2138

2139
        let mut bindings_list = FxHashMap();
2140
        for pattern in &arm.pats {
2141
            self.resolve_pattern(&pattern, PatternSource::Match, &mut bindings_list);
2142 2143
        }

2144 2145 2146 2147
        // This has to happen *after* we determine which
        // pat_idents are variants
        self.check_consistent_bindings(arm);

2148
        walk_list!(self, visit_expr, &arm.guard);
J
Jonas Schievink 已提交
2149
        self.visit_expr(&arm.body);
2150

J
Jeffrey Seyfried 已提交
2151
        self.ribs[ValueNS].pop();
2152 2153
    }

E
Eduard Burtescu 已提交
2154
    fn resolve_block(&mut self, block: &Block) {
2155
        debug!("(resolving block) entering block");
2156
        // Move down in the graph, if there's an anonymous module rooted here.
2157
        let orig_module = self.current_module;
2158
        let anonymous_module = self.block_map.get(&block.id).cloned(); // clones a reference
2159

2160
        let mut num_macro_definition_ribs = 0;
2161 2162
        if let Some(anonymous_module) = anonymous_module {
            debug!("(resolving block) found anonymous module, moving down");
J
Jeffrey Seyfried 已提交
2163 2164
            self.ribs[ValueNS].push(Rib::new(ModuleRibKind(anonymous_module)));
            self.ribs[TypeNS].push(Rib::new(ModuleRibKind(anonymous_module)));
2165
            self.current_module = anonymous_module;
2166
            self.finalize_current_module_macro_resolutions();
2167
        } else {
J
Jeffrey Seyfried 已提交
2168
            self.ribs[ValueNS].push(Rib::new(NormalRibKind));
2169 2170 2171
        }

        // Descend into the block.
2172
        for stmt in &block.stmts {
2173
            if let ast::StmtKind::Item(ref item) = stmt.node {
2174
                if let ast::ItemKind::MacroDef(..) = item.node {
2175
                    num_macro_definition_ribs += 1;
2176 2177 2178
                    let def = self.definitions.local_def_id(item.id);
                    self.ribs[ValueNS].push(Rib::new(MacroDefinition(def)));
                    self.label_ribs.push(Rib::new(MacroDefinition(def)));
2179 2180 2181 2182 2183
                }
            }

            self.visit_stmt(stmt);
        }
2184 2185

        // Move back up.
J
Jeffrey Seyfried 已提交
2186
        self.current_module = orig_module;
2187
        for _ in 0 .. num_macro_definition_ribs {
J
Jeffrey Seyfried 已提交
2188
            self.ribs[ValueNS].pop();
2189
            self.label_ribs.pop();
2190
        }
J
Jeffrey Seyfried 已提交
2191
        self.ribs[ValueNS].pop();
J
Jeffrey Seyfried 已提交
2192
        if let Some(_) = anonymous_module {
J
Jeffrey Seyfried 已提交
2193
            self.ribs[TypeNS].pop();
G
Garming Sam 已提交
2194
        }
2195
        debug!("(resolving block) leaving block");
2196 2197
    }

2198
    fn fresh_binding(&mut self,
J
Jeffrey Seyfried 已提交
2199
                     ident: &SpannedIdent,
2200 2201 2202
                     pat_id: NodeId,
                     outer_pat_id: NodeId,
                     pat_src: PatternSource,
2203
                     bindings: &mut FxHashMap<Ident, NodeId>)
2204 2205
                     -> PathResolution {
        // Add the binding to the local ribs, if it
2206 2207
        // doesn't already exist in the bindings map. (We
        // must not add it if it's in the bindings map
2208 2209
        // because that breaks the assumptions later
        // passes make about or-patterns.)
2210
        let mut def = Def::Local(self.definitions.local_def_id(pat_id));
2211
        match bindings.get(&ident.node).cloned() {
2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230
            Some(id) if id == outer_pat_id => {
                // `Variant(a, a)`, error
                resolve_error(
                    self,
                    ident.span,
                    ResolutionError::IdentifierBoundMoreThanOnceInSamePattern(
                        &ident.node.name.as_str())
                );
            }
            Some(..) if pat_src == PatternSource::FnParam => {
                // `fn f(a: u8, a: u8)`, error
                resolve_error(
                    self,
                    ident.span,
                    ResolutionError::IdentifierBoundMoreThanOnceInParameterList(
                        &ident.node.name.as_str())
                );
            }
            Some(..) if pat_src == PatternSource::Match => {
2231 2232
                // `Variant1(a) | Variant2(a)`, ok
                // Reuse definition from the first `a`.
J
Jeffrey Seyfried 已提交
2233
                def = self.ribs[ValueNS].last_mut().unwrap().bindings[&ident.node];
2234 2235 2236 2237 2238 2239
            }
            Some(..) => {
                span_bug!(ident.span, "two bindings with the same name from \
                                       unexpected pattern source {:?}", pat_src);
            }
            None => {
2240
                // A completely fresh binding, add to the lists if it's valid.
2241
                if ident.node.name != keywords::Invalid.name() {
2242
                    bindings.insert(ident.node, outer_pat_id);
J
Jeffrey Seyfried 已提交
2243
                    self.ribs[ValueNS].last_mut().unwrap().bindings.insert(ident.node, def);
2244
                }
2245
            }
2246
        }
2247

2248
        PathResolution::new(def)
2249
    }
2250

2251 2252 2253 2254 2255
    fn resolve_pattern(&mut self,
                       pat: &Pat,
                       pat_src: PatternSource,
                       // Maps idents to the node ID for the
                       // outermost pattern that binds them.
2256
                       bindings: &mut FxHashMap<Ident, NodeId>) {
2257
        // Visit all direct subpatterns of this pattern.
2258 2259 2260 2261 2262 2263
        let outer_pat_id = pat.id;
        pat.walk(&mut |pat| {
            match pat.node {
                PatKind::Ident(bmode, ref ident, ref opt_pat) => {
                    // First try to resolve the identifier as some existing
                    // entity, then fall back to a fresh binding.
2264 2265
                    let binding = self.resolve_ident_in_lexical_scope(ident.node, ValueNS,
                                                                      false, pat.span)
2266
                                      .and_then(LexicalScopeBinding::item);
2267
                    let resolution = binding.map(NameBinding::def).and_then(|def| {
2268 2269
                        let always_binding = !pat_src.is_refutable() || opt_pat.is_some() ||
                                             bmode != BindingMode::ByValue(Mutability::Immutable);
2270
                        match def {
2271 2272 2273 2274
                            Def::StructCtor(_, CtorKind::Const) |
                            Def::VariantCtor(_, CtorKind::Const) |
                            Def::Const(..) if !always_binding => {
                                // A unit struct/variant or constant pattern.
2275
                                self.record_use(ident.node, ValueNS, binding.unwrap(), ident.span);
2276
                                Some(PathResolution::new(def))
2277
                            }
2278
                            Def::StructCtor(..) | Def::VariantCtor(..) |
2279
                            Def::Const(..) | Def::Static(..) => {
2280
                                // A fresh binding that shadows something unacceptable.
2281
                                resolve_error(
2282
                                    self,
2283 2284
                                    ident.span,
                                    ResolutionError::BindingShadowsSomethingUnacceptable(
2285
                                        pat_src.descr(), ident.node.name, binding.unwrap())
2286
                                );
2287
                                None
2288
                            }
2289
                            Def::Local(..) | Def::Upvar(..) | Def::Fn(..) | Def::Err => {
2290 2291
                                // These entities are explicitly allowed
                                // to be shadowed by fresh bindings.
2292
                                None
2293 2294 2295
                            }
                            def => {
                                span_bug!(ident.span, "unexpected definition for an \
2296
                                                       identifier in pattern: {:?}", def);
2297
                            }
2298
                        }
2299
                    }).unwrap_or_else(|| {
2300
                        self.fresh_binding(ident, pat.id, outer_pat_id, pat_src, bindings)
2301
                    });
2302 2303

                    self.record_def(pat.id, resolution);
2304 2305
                }

2306
                PatKind::TupleStruct(ref path, ..) => {
2307
                    self.smart_resolve_path(pat.id, None, path, PathSource::TupleStruct);
2308 2309
                }

2310
                PatKind::Path(ref qself, ref path) => {
2311
                    self.smart_resolve_path(pat.id, qself.as_ref(), path, PathSource::Pat);
2312 2313
                }

V
Vadim Petrochenkov 已提交
2314
                PatKind::Struct(ref path, ..) => {
2315
                    self.smart_resolve_path(pat.id, None, path, PathSource::Struct);
2316
                }
2317 2318

                _ => {}
2319
            }
2320
            true
2321
        });
2322

2323
        visit::walk_pat(self, pat);
2324 2325
    }

2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337
    // High-level and context dependent path resolution routine.
    // Resolves the path and records the resolution into definition map.
    // If resolution fails tries several techniques to find likely
    // resolution candidates, suggest imports or other help, and report
    // errors in user friendly way.
    fn smart_resolve_path(&mut self,
                          id: NodeId,
                          qself: Option<&QSelf>,
                          path: &Path,
                          source: PathSource)
                          -> PathResolution {
        let segments = &path.segments.iter().map(|seg| seg.identifier).collect::<Vec<_>>();
2338 2339
        let ident_span = path.segments.last().map_or(path.span, |seg| seg.span);
        self.smart_resolve_path_fragment(id, qself, segments, path.span, ident_span, source)
2340 2341 2342
    }

    fn smart_resolve_path_fragment(&mut self,
2343
                                   id: NodeId,
2344 2345 2346
                                   qself: Option<&QSelf>,
                                   path: &[Ident],
                                   span: Span,
2347
                                   ident_span: Span,
2348 2349 2350 2351
                                   source: PathSource)
                                   -> PathResolution {
        let ns = source.namespace();
        let is_expected = &|def| source.is_expected(def);
2352
        let is_enum_variant = &|def| if let Def::Variant(..) = def { true } else { false };
2353 2354 2355 2356 2357 2358 2359

        // Base error is amended with one short label and possibly some longer helps/notes.
        let report_errors = |this: &mut Self, def: Option<Def>| {
            // Make the base error.
            let expected = source.descr_expected();
            let path_str = names_to_string(path);
            let code = source.error_code(def.is_some());
2360
            let (base_msg, fallback_label, base_span) = if let Some(def) = def {
2361
                (format!("expected {}, found {} `{}`", expected, def.kind_name(), path_str),
2362
                 format!("not a {}", expected), span)
2363
            } else {
2364 2365 2366 2367 2368 2369 2370
                let item_str = path[path.len() - 1];
                let (mod_prefix, mod_str) = if path.len() == 1 {
                    (format!(""), format!("this scope"))
                } else if path.len() == 2 && path[0].name == keywords::CrateRoot.name() {
                    (format!(""), format!("the crate root"))
                } else {
                    let mod_path = &path[..path.len() - 1];
2371
                    let mod_prefix = match this.resolve_path(mod_path, Some(TypeNS), false, span) {
2372 2373 2374 2375 2376 2377
                        PathResult::Module(module) => module.def(),
                        _ => None,
                    }.map_or(format!(""), |def| format!("{} ", def.kind_name()));
                    (mod_prefix, format!("`{}`", names_to_string(mod_path)))
                };
                (format!("cannot find {} `{}` in {}{}", expected, item_str, mod_prefix, mod_str),
2378
                 format!("not found in {}", mod_str), ident_span)
2379
            };
2380
            let mut err = this.session.struct_span_err_with_code(base_span, &base_msg, code);
2381 2382 2383 2384 2385

            // Emit special messages for unresolved `Self` and `self`.
            if is_self_type(path, ns) {
                __diagnostic_used!(E0411);
                err.code("E0411".into());
2386
                err.span_label(span, "`Self` is only available in traits and impls");
2387 2388 2389 2390 2391
                return err;
            }
            if is_self_value(path, ns) {
                __diagnostic_used!(E0424);
                err.code("E0424".into());
2392
                err.span_label(span, format!("`self` value is only available in \
2393 2394 2395 2396 2397
                                               methods with `self` parameter"));
                return err;
            }

            // Try to lookup the name in more relaxed fashion for better error reporting.
2398 2399
            let ident = *path.last().unwrap();
            let candidates = this.lookup_import_candidates(ident.name, ns, is_expected);
2400
            if !candidates.is_empty() {
2401 2402
                let mut module_span = this.current_module.span;
                module_span.hi = module_span.lo;
2403
                // Report import candidates as help and proceed searching for labels.
2404
                show_candidates(&mut err, module_span, &candidates, def.is_some());
2405
            } else if is_expected(Def::Enum(DefId::local(CRATE_DEF_INDEX))) {
2406 2407
                let enum_candidates =
                    this.lookup_import_candidates(ident.name, ns, is_enum_variant);
E
Esteban Küber 已提交
2408 2409 2410 2411 2412
                let mut enum_candidates = enum_candidates.iter()
                    .map(|suggestion| import_candidate_to_paths(&suggestion)).collect::<Vec<_>>();
                enum_candidates.sort();
                for (sp, variant_path, enum_path) in enum_candidates {
                    if sp == DUMMY_SP {
2413 2414 2415 2416
                        let msg = format!("there is an enum variant `{}`, \
                                        try using `{}`?",
                                        variant_path,
                                        enum_path);
2417 2418
                        err.help(&msg);
                    } else {
2419 2420
                        err.span_suggestion(span, "you can try using the variant's enum",
                                            enum_path);
2421 2422
                    }
                }
2423
            }
2424
            if path.len() == 1 && this.self_type_is_available(span) {
2425
                if let Some(candidate) = this.lookup_assoc_candidate(ident, ns, is_expected) {
2426
                    let self_is_available = this.self_value_is_available(path[0].ctxt, span);
2427 2428
                    match candidate {
                        AssocSuggestion::Field => {
2429 2430
                            err.span_suggestion(span, "try",
                                                format!("self.{}", path_str));
2431
                            if !self_is_available {
2432
                                err.span_label(span, format!("`self` value is only available in \
2433 2434 2435 2436
                                                               methods with `self` parameter"));
                            }
                        }
                        AssocSuggestion::MethodWithSelf if self_is_available => {
2437 2438
                            err.span_suggestion(span, "try",
                                                format!("self.{}", path_str));
2439 2440
                        }
                        AssocSuggestion::MethodWithSelf | AssocSuggestion::AssocItem => {
2441 2442
                            err.span_suggestion(span, "try",
                                                format!("Self::{}", path_str));
2443 2444 2445 2446 2447 2448
                        }
                    }
                    return err;
                }
            }

2449 2450 2451
            let mut levenshtein_worked = false;

            // Try Levenshtein.
2452
            if let Some(candidate) = this.lookup_typo_candidate(path, ns, is_expected, span) {
2453
                err.span_label(ident_span, format!("did you mean `{}`?", candidate));
2454 2455 2456
                levenshtein_worked = true;
            }

2457 2458 2459 2460
            // Try context dependent help if relaxed lookup didn't work.
            if let Some(def) = def {
                match (def, source) {
                    (Def::Macro(..), _) => {
2461
                        err.span_label(span, format!("did you mean `{}!(...)`?", path_str));
2462 2463 2464
                        return err;
                    }
                    (Def::TyAlias(..), PathSource::Trait) => {
2465
                        err.span_label(span, "type aliases cannot be used for traits");
2466 2467
                        return err;
                    }
2468
                    (Def::Mod(..), PathSource::Expr(Some(parent))) => match parent.node {
2469
                        ExprKind::Field(_, ident) => {
2470
                            err.span_label(parent.span, format!("did you mean `{}::{}`?",
2471
                                                                 path_str, ident.node));
2472 2473
                            return err;
                        }
2474
                        ExprKind::MethodCall(ref segment, ..) => {
2475
                            err.span_label(parent.span, format!("did you mean `{}::{}(...)`?",
2476
                                                                 path_str, segment.identifier));
2477 2478 2479 2480 2481
                            return err;
                        }
                        _ => {}
                    },
                    _ if ns == ValueNS && is_struct_like(def) => {
2482 2483 2484 2485
                        if let Def::Struct(def_id) = def {
                            if let Some((ctor_def, ctor_vis))
                                    = this.struct_constructors.get(&def_id).cloned() {
                                if is_expected(ctor_def) && !this.is_accessible(ctor_vis) {
2486
                                    err.span_label(span, format!("constructor is not visible \
2487 2488 2489 2490
                                                                   here due to private fields"));
                                }
                            }
                        }
2491
                        err.span_label(span, format!("did you mean `{} {{ /* fields */ }}`?",
2492 2493 2494 2495 2496 2497 2498
                                                       path_str));
                        return err;
                    }
                    _ => {}
                }
            }

2499
            // Fallback label.
2500
            if !levenshtein_worked {
2501
                err.span_label(base_span, fallback_label);
2502
            }
2503 2504 2505 2506 2507 2508 2509 2510 2511 2512
            err
        };
        let report_errors = |this: &mut Self, def: Option<Def>| {
            report_errors(this, def).emit();
            err_path_resolution()
        };

        let resolution = match self.resolve_qpath_anywhere(id, qself, path, ns, span,
                                                           source.defer_to_typeck(),
                                                           source.global_by_default()) {
2513 2514
            Some(resolution) if resolution.unresolved_segments() == 0 => {
                if is_expected(resolution.base_def()) || resolution.base_def() == Def::Err {
2515 2516
                    resolution
                } else {
2517 2518 2519
                    // Add a temporary hack to smooth the transition to new struct ctor
                    // visibility rules. See #38932 for more details.
                    let mut res = None;
2520
                    if let Def::Struct(def_id) = resolution.base_def() {
2521
                        if let Some((ctor_def, ctor_vis))
2522
                                = self.struct_constructors.get(&def_id).cloned() {
2523 2524 2525 2526 2527 2528 2529 2530 2531 2532
                            if is_expected(ctor_def) && self.is_accessible(ctor_vis) {
                                let lint = lint::builtin::LEGACY_CONSTRUCTOR_VISIBILITY;
                                self.session.add_lint(lint, id, span,
                                    "private struct constructors are not usable through \
                                     reexports in outer modules".to_string());
                                res = Some(PathResolution::new(ctor_def));
                            }
                        }
                    }

2533
                    res.unwrap_or_else(|| report_errors(self, Some(resolution.base_def())))
2534 2535 2536 2537 2538 2539 2540
                }
            }
            Some(resolution) if source.defer_to_typeck() => {
                // Not fully resolved associated item `T::A::B` or `<T as Tr>::A::B`
                // or `<T>::A::B`. If `B` should be resolved in value namespace then
                // it needs to be added to the trait map.
                if ns == ValueNS {
2541
                    let item_name = *path.last().unwrap();
2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556
                    let traits = self.get_traits_containing_item(item_name, ns);
                    self.trait_map.insert(id, traits);
                }
                resolution
            }
            _ => report_errors(self, None)
        };

        if let PathSource::TraitItem(..) = source {} else {
            // Avoid recording definition of `A::B` in `<T as A>::B::C`.
            self.record_def(id, resolution);
        }
        resolution
    }

2557 2558 2559
    fn self_type_is_available(&mut self, span: Span) -> bool {
        let binding = self.resolve_ident_in_lexical_scope(keywords::SelfType.ident(),
                                                          TypeNS, false, span);
2560 2561 2562
        if let Some(LexicalScopeBinding::Def(def)) = binding { def != Def::Err } else { false }
    }

2563
    fn self_value_is_available(&mut self, ctxt: SyntaxContext, span: Span) -> bool {
2564
        let ident = Ident { name: keywords::SelfValue.name(), ctxt: ctxt };
2565
        let binding = self.resolve_ident_in_lexical_scope(ident, ValueNS, false, span);
2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586
        if let Some(LexicalScopeBinding::Def(def)) = binding { def != Def::Err } else { false }
    }

    // Resolve in alternative namespaces if resolution in the primary namespace fails.
    fn resolve_qpath_anywhere(&mut self,
                              id: NodeId,
                              qself: Option<&QSelf>,
                              path: &[Ident],
                              primary_ns: Namespace,
                              span: Span,
                              defer_to_typeck: bool,
                              global_by_default: bool)
                              -> Option<PathResolution> {
        let mut fin_res = None;
        // FIXME: can't resolve paths in macro namespace yet, macros are
        // processed by the little special hack below.
        for (i, ns) in [primary_ns, TypeNS, ValueNS, /*MacroNS*/].iter().cloned().enumerate() {
            if i == 0 || ns != primary_ns {
                match self.resolve_qpath(id, qself, path, ns, span, global_by_default) {
                    // If defer_to_typeck, then resolution > no resolution,
                    // otherwise full resolution > partial resolution > no resolution.
2587 2588
                    Some(res) if res.unresolved_segments() == 0 || defer_to_typeck =>
                        return Some(res),
2589 2590 2591 2592
                    res => if fin_res.is_none() { fin_res = res },
                };
            }
        }
J
Jeffrey Seyfried 已提交
2593
        let is_global = self.global_macros.get(&path[0].name).cloned()
2594
            .map(|binding| binding.get_macro(self).kind() == MacroKind::Bang).unwrap_or(false);
J
Jeffrey Seyfried 已提交
2595
        if primary_ns != MacroNS && (is_global || self.macro_names.contains(&path[0].modern())) {
2596
            // Return some dummy definition, it's enough for error reporting.
J
Josh Driver 已提交
2597 2598 2599
            return Some(
                PathResolution::new(Def::Macro(DefId::local(CRATE_DEF_INDEX), MacroKind::Bang))
            );
2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613
        }
        fin_res
    }

    /// Handles paths that may refer to associated items.
    fn resolve_qpath(&mut self,
                     id: NodeId,
                     qself: Option<&QSelf>,
                     path: &[Ident],
                     ns: Namespace,
                     span: Span,
                     global_by_default: bool)
                     -> Option<PathResolution> {
        if let Some(qself) = qself {
J
Jeffrey Seyfried 已提交
2614 2615
            if qself.position == 0 {
                // FIXME: Create some fake resolution that can't possibly be a type.
2616 2617 2618
                return Some(PathResolution::with_unresolved_segments(
                    Def::Mod(DefId::local(CRATE_DEF_INDEX)), path.len()
                ));
2619
            }
2620 2621
            // Make sure `A::B` in `<T as A>::B::C` is a trait item.
            let ns = if qself.position + 1 == path.len() { ns } else { TypeNS };
2622
            let res = self.smart_resolve_path_fragment(id, None, &path[..qself.position + 1],
2623
                                                       span, span, PathSource::TraitItem(ns));
2624 2625 2626
            return Some(PathResolution::with_unresolved_segments(
                res.base_def(), res.unresolved_segments() + path.len() - qself.position - 1
            ));
2627 2628
        }

2629
        let result = match self.resolve_path(&path, Some(ns), true, span) {
2630
            PathResult::NonModule(path_res) => path_res,
J
Jeffrey Seyfried 已提交
2631 2632
            PathResult::Module(module) if !module.is_normal() => {
                PathResolution::new(module.def().unwrap())
V
Cleanup  
Vadim Petrochenkov 已提交
2633
            }
2634 2635 2636 2637 2638 2639
            // In `a(::assoc_item)*` `a` cannot be a module. If `a` does resolve to a module we
            // don't report an error right away, but try to fallback to a primitive type.
            // So, we are still able to successfully resolve something like
            //
            // use std::u8; // bring module u8 in scope
            // fn f() -> u8 { // OK, resolves to primitive u8, not to std::u8
V
Cleanup  
Vadim Petrochenkov 已提交
2640 2641
            //     u8::max_value() // OK, resolves to associated function <u8>::max_value,
            //                     // not to non-existent std::u8::max_value
2642 2643 2644 2645
            // }
            //
            // Such behavior is required for backward compatibility.
            // The same fallback is used when `a` resolves to nothing.
2646
            PathResult::Module(..) | PathResult::Failed(..)
2647
                    if (ns == TypeNS || path.len() > 1) &&
2648
                       self.primitive_type_table.primitive_types.contains_key(&path[0].name) => {
2649 2650 2651
                let prim = self.primitive_type_table.primitive_types[&path[0].name];
                match prim {
                    TyUint(UintTy::U128) | TyInt(IntTy::I128) => {
S
Simonas Kazlauskas 已提交
2652 2653
                        if !self.session.features.borrow().i128_type {
                            emit_feature_err(&self.session.parse_sess,
2654 2655 2656 2657 2658 2659 2660
                                                "i128_type", span, GateIssue::Language,
                                                "128-bit type is unstable");

                        }
                    }
                    _ => {}
                }
2661
                PathResolution::with_unresolved_segments(Def::PrimTy(prim), path.len() - 1)
J
Jeffrey Seyfried 已提交
2662 2663 2664 2665 2666 2667
            }
            PathResult::Module(module) => PathResolution::new(module.def().unwrap()),
            PathResult::Failed(msg, false) => {
                resolve_error(self, span, ResolutionError::FailedToResolve(&msg));
                err_path_resolution()
            }
2668 2669
            PathResult::Failed(..) => return None,
            PathResult::Indeterminate => bug!("indetermined path result in resolve_qpath"),
J
Jeffrey Seyfried 已提交
2670 2671
        };

2672
        if path.len() > 1 && !global_by_default && result.base_def() != Def::Err &&
V
Vadim Petrochenkov 已提交
2673 2674
           path[0].name != keywords::CrateRoot.name() &&
           path[0].name != keywords::DollarCrate.name() {
2675
            let unqualified_result = {
2676
                match self.resolve_path(&[*path.last().unwrap()], Some(ns), false, span) {
2677
                    PathResult::NonModule(path_res) => path_res.base_def(),
2678 2679 2680 2681
                    PathResult::Module(module) => module.def().unwrap(),
                    _ => return Some(result),
                }
            };
2682
            if result.base_def() == unqualified_result {
2683 2684
                let lint = lint::builtin::UNUSED_QUALIFICATIONS;
                self.session.add_lint(lint, id, span, "unnecessary qualification".to_string());
N
Nick Cameron 已提交
2685
            }
2686
        }
N
Nick Cameron 已提交
2687

J
Jeffrey Seyfried 已提交
2688
        Some(result)
2689 2690
    }

J
Jeffrey Seyfried 已提交
2691 2692 2693
    fn resolve_path(&mut self,
                    path: &[Ident],
                    opt_ns: Option<Namespace>, // `None` indicates a module path
2694 2695
                    record_used: bool,
                    path_span: Span)
J
Jeffrey Seyfried 已提交
2696
                    -> PathResult<'a> {
2697 2698
        let mut module = None;
        let mut allow_super = true;
J
Jeffrey Seyfried 已提交
2699 2700 2701 2702 2703

        for (i, &ident) in path.iter().enumerate() {
            let is_last = i == path.len() - 1;
            let ns = if is_last { opt_ns.unwrap_or(TypeNS) } else { TypeNS };

2704
            if i == 0 && ns == TypeNS && ident.name == keywords::SelfValue.name() {
J
Jeffrey Seyfried 已提交
2705 2706
                let mut ctxt = ident.ctxt.modern();
                module = Some(self.resolve_self(&mut ctxt, self.current_module));
J
Jeffrey Seyfried 已提交
2707 2708
                continue
            } else if allow_super && ns == TypeNS && ident.name == keywords::Super.name() {
J
Jeffrey Seyfried 已提交
2709 2710 2711 2712 2713
                let mut ctxt = ident.ctxt.modern();
                let self_module = match i {
                    0 => self.resolve_self(&mut ctxt, self.current_module),
                    _ => module.unwrap(),
                };
J
Jeffrey Seyfried 已提交
2714
                if let Some(parent) = self_module.parent {
J
Jeffrey Seyfried 已提交
2715
                    module = Some(self.resolve_self(&mut ctxt, parent));
J
Jeffrey Seyfried 已提交
2716 2717 2718 2719 2720 2721 2722 2723
                    continue
                } else {
                    let msg = "There are too many initial `super`s.".to_string();
                    return PathResult::Failed(msg, false);
                }
            }
            allow_super = false;

2724
            if i == 0 && ns == TypeNS && ident.name == keywords::CrateRoot.name() {
J
Jeffrey Seyfried 已提交
2725
                module = Some(self.resolve_crate_root(ident.ctxt.modern()));
2726
                continue
V
Vadim Petrochenkov 已提交
2727
            } else if i == 0 && ns == TypeNS && ident.name == keywords::DollarCrate.name() {
J
Jeffrey Seyfried 已提交
2728
                module = Some(self.resolve_crate_root(ident.ctxt));
2729 2730 2731
                continue
            }

J
Jeffrey Seyfried 已提交
2732
            let binding = if let Some(module) = module {
2733
                self.resolve_ident_in_module(module, ident, ns, false, record_used, path_span)
2734
            } else if opt_ns == Some(MacroNS) {
2735
                self.resolve_lexical_macro_path_segment(ident, ns, record_used, path_span)
2736
                    .map(MacroBinding::binding)
J
Jeffrey Seyfried 已提交
2737
            } else {
2738
                match self.resolve_ident_in_lexical_scope(ident, ns, record_used, path_span) {
J
Jeffrey Seyfried 已提交
2739
                    Some(LexicalScopeBinding::Item(binding)) => Ok(binding),
2740 2741
                    Some(LexicalScopeBinding::Def(def))
                            if opt_ns == Some(TypeNS) || opt_ns == Some(ValueNS) => {
2742 2743 2744
                        return PathResult::NonModule(PathResolution::with_unresolved_segments(
                            def, path.len() - 1
                        ));
J
Jeffrey Seyfried 已提交
2745
                    }
2746
                    _ => Err(if record_used { Determined } else { Undetermined }),
J
Jeffrey Seyfried 已提交
2747 2748 2749 2750 2751
                }
            };

            match binding {
                Ok(binding) => {
2752 2753
                    let def = binding.def();
                    let maybe_assoc = opt_ns != Some(MacroNS) && PathSource::Type.is_expected(def);
J
Jeffrey Seyfried 已提交
2754
                    if let Some(next_module) = binding.module() {
J
Jeffrey Seyfried 已提交
2755
                        module = Some(next_module);
2756
                    } else if def == Def::Err {
J
Jeffrey Seyfried 已提交
2757
                        return PathResult::NonModule(err_path_resolution());
2758
                    } else if opt_ns.is_some() && (is_last || maybe_assoc) {
2759 2760 2761
                        return PathResult::NonModule(PathResolution::with_unresolved_segments(
                            def, path.len() - i - 1
                        ));
J
Jeffrey Seyfried 已提交
2762 2763 2764 2765 2766 2767 2768 2769
                    } else {
                        return PathResult::Failed(format!("Not a module `{}`", ident), is_last);
                    }
                }
                Err(Undetermined) => return PathResult::Indeterminate,
                Err(Determined) => {
                    if let Some(module) = module {
                        if opt_ns.is_some() && !module.is_normal() {
2770 2771 2772
                            return PathResult::NonModule(PathResolution::with_unresolved_segments(
                                module.def().unwrap(), path.len() - i
                            ));
J
Jeffrey Seyfried 已提交
2773 2774
                        }
                    }
2775
                    let msg = if module.and_then(ModuleData::def) == self.graph_root.def() {
J
Jeffrey Seyfried 已提交
2776 2777
                        let is_mod = |def| match def { Def::Mod(..) => true, _ => false };
                        let mut candidates =
2778 2779
                            self.lookup_import_candidates(ident.name, TypeNS, is_mod);
                        candidates.sort_by_key(|c| (c.path.segments.len(), c.path.to_string()));
J
Jeffrey Seyfried 已提交
2780
                        if let Some(candidate) = candidates.get(0) {
2781
                            format!("Did you mean `{}`?", candidate.path)
J
Jeffrey Seyfried 已提交
2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792
                        } else {
                            format!("Maybe a missing `extern crate {};`?", ident)
                        }
                    } else if i == 0 {
                        format!("Use of undeclared type or module `{}`", ident)
                    } else {
                        format!("Could not find `{}` in `{}`", ident, path[i - 1])
                    };
                    return PathResult::Failed(msg, is_last);
                }
            }
2793 2794
        }

2795
        PathResult::Module(module.unwrap_or(self.graph_root))
2796 2797 2798
    }

    // Resolve a local definition, potentially adjusting for closures.
2799 2800 2801 2802
    fn adjust_local_def(&mut self,
                        ns: Namespace,
                        rib_index: usize,
                        mut def: Def,
2803 2804
                        record_used: bool,
                        span: Span) -> Def {
2805 2806 2807 2808
        let ribs = &self.ribs[ns][rib_index + 1..];

        // An invalid forward use of a type parameter from a previous default.
        if let ForwardTyParamBanRibKind = self.ribs[ns][rib_index].kind {
2809
            if record_used {
2810 2811 2812 2813 2814 2815 2816
                resolve_error(self, span,
                        ResolutionError::ForwardDeclaredTyParam);
            }
            assert_eq!(def, Def::Err);
            return Def::Err;
        }

2817
        match def {
2818
            Def::Upvar(..) => {
2819
                span_bug!(span, "unexpected {:?} in bindings", def)
2820
            }
2821
            Def::Local(def_id) => {
2822 2823
                for rib in ribs {
                    match rib.kind {
2824 2825
                        NormalRibKind | ModuleRibKind(..) | MacroDefinition(..) |
                        ForwardTyParamBanRibKind => {
2826 2827 2828 2829
                            // Nothing to do. Continue.
                        }
                        ClosureRibKind(function_id) => {
                            let prev_def = def;
2830
                            let node_id = self.definitions.as_local_node_id(def_id).unwrap();
2831

C
corentih 已提交
2832 2833 2834
                            let seen = self.freevars_seen
                                           .entry(function_id)
                                           .or_insert_with(|| NodeMap());
2835
                            if let Some(&index) = seen.get(&node_id) {
2836
                                def = Def::Upvar(def_id, index, function_id);
2837 2838
                                continue;
                            }
C
corentih 已提交
2839 2840 2841
                            let vec = self.freevars
                                          .entry(function_id)
                                          .or_insert_with(|| vec![]);
2842
                            let depth = vec.len();
2843
                            def = Def::Upvar(def_id, depth, function_id);
2844

2845
                            if record_used {
2846 2847 2848 2849 2850 2851
                                vec.push(Freevar {
                                    def: prev_def,
                                    span: span,
                                });
                                seen.insert(node_id, depth);
                            }
2852
                        }
2853
                        ItemRibKind | MethodRibKind(_) => {
2854 2855 2856
                            // This was an attempt to access an upvar inside a
                            // named function item. This is not allowed, so we
                            // report an error.
2857
                            if record_used {
2858 2859 2860
                                resolve_error(self, span,
                                        ResolutionError::CannotCaptureDynamicEnvironmentInFnItem);
                            }
2861
                            return Def::Err;
2862 2863 2864
                        }
                        ConstantItemRibKind => {
                            // Still doesn't deal with upvars
2865
                            if record_used {
2866 2867 2868
                                resolve_error(self, span,
                                        ResolutionError::AttemptToUseNonConstantValueInConstant);
                            }
2869
                            return Def::Err;
2870 2871 2872 2873
                        }
                    }
                }
            }
2874
            Def::TyParam(..) | Def::SelfTy(..) => {
2875 2876
                for rib in ribs {
                    match rib.kind {
2877
                        NormalRibKind | MethodRibKind(_) | ClosureRibKind(..) |
2878 2879
                        ModuleRibKind(..) | MacroDefinition(..) | ForwardTyParamBanRibKind |
                        ConstantItemRibKind => {
2880 2881 2882 2883 2884
                            // Nothing to do. Continue.
                        }
                        ItemRibKind => {
                            // This was an attempt to use a type parameter outside
                            // its scope.
2885
                            if record_used {
2886 2887 2888
                                resolve_error(self, span,
                                              ResolutionError::TypeParametersFromOuterFunction);
                            }
2889
                            return Def::Err;
2890 2891 2892 2893 2894 2895
                        }
                    }
                }
            }
            _ => {}
        }
2896
        return def;
2897 2898
    }

2899 2900
    // Calls `f` with a `Resolver` whose current lexical scope is `module`'s lexical scope,
    // i.e. the module's items and the prelude (unless the module is `#[no_implicit_prelude]`).
J
Jeffrey Seyfried 已提交
2901
    // FIXME #34673: This needs testing.
2902 2903 2904 2905
    pub fn with_module_lexical_scope<T, F>(&mut self, module: Module<'a>, f: F) -> T
        where F: FnOnce(&mut Resolver<'a>) -> T,
    {
        self.with_empty_ribs(|this| {
J
Jeffrey Seyfried 已提交
2906 2907
            this.ribs[ValueNS].push(Rib::new(ModuleRibKind(module)));
            this.ribs[TypeNS].push(Rib::new(ModuleRibKind(module)));
2908 2909 2910 2911 2912 2913 2914
            f(this)
        })
    }

    fn with_empty_ribs<T, F>(&mut self, f: F) -> T
        where F: FnOnce(&mut Resolver<'a>) -> T,
    {
J
Jeffrey Seyfried 已提交
2915
        let ribs = replace(&mut self.ribs, PerNS::<Vec<Rib>>::default());
2916 2917 2918
        let label_ribs = replace(&mut self.label_ribs, Vec::new());

        let result = f(self);
J
Jeffrey Seyfried 已提交
2919
        self.ribs = ribs;
2920 2921 2922 2923
        self.label_ribs = label_ribs;
        result
    }

2924
    fn lookup_assoc_candidate<FilterFn>(&mut self,
2925
                                        ident: Ident,
2926 2927 2928 2929 2930
                                        ns: Namespace,
                                        filter_fn: FilterFn)
                                        -> Option<AssocSuggestion>
        where FilterFn: Fn(Def) -> bool
    {
2931
        fn extract_node_id(t: &Ty) -> Option<NodeId> {
2932
            match t.node {
2933 2934
                TyKind::Path(None, _) => Some(t.id),
                TyKind::Rptr(_, ref mut_ty) => extract_node_id(&mut_ty.ty),
2935 2936 2937 2938 2939 2940 2941
                // This doesn't handle the remaining `Ty` variants as they are not
                // that commonly the self_type, it might be interesting to provide
                // support for those in future.
                _ => None,
            }
        }

2942 2943 2944 2945 2946
        // Fields are generally expected in the same contexts as locals.
        if filter_fn(Def::Local(DefId::local(CRATE_DEF_INDEX))) {
            if let Some(node_id) = self.current_self_type.as_ref().and_then(extract_node_id) {
                // Look for a field with the same name in the current self_type.
                if let Some(resolution) = self.def_map.get(&node_id) {
2947 2948 2949
                    match resolution.base_def() {
                        Def::Struct(did) | Def::Union(did)
                                if resolution.unresolved_segments() == 0 => {
2950
                            if let Some(field_names) = self.field_names.get(&did) {
2951
                                if field_names.iter().any(|&field_name| ident.name == field_name) {
2952 2953
                                    return Some(AssocSuggestion::Field);
                                }
2954
                            }
2955
                        }
2956
                        _ => {}
2957
                    }
2958
                }
2959
            }
2960 2961
        }

2962
        // Look for associated items in the current trait.
2963 2964 2965 2966
        if let Some((module, _)) = self.current_trait_ref {
            if let Ok(binding) =
                    self.resolve_ident_in_module(module, ident, ns, false, false, module.span) {
                let def = binding.def();
2967
                if filter_fn(def) {
2968
                    return Some(if self.has_self.contains(&def.def_id()) {
2969 2970 2971 2972
                        AssocSuggestion::MethodWithSelf
                    } else {
                        AssocSuggestion::AssocItem
                    });
2973 2974 2975 2976
                }
            }
        }

2977
        None
2978 2979
    }

2980
    fn lookup_typo_candidate<FilterFn>(&mut self,
2981
                                       path: &[Ident],
2982
                                       ns: Namespace,
2983 2984
                                       filter_fn: FilterFn,
                                       span: Span)
2985
                                       -> Option<Symbol>
2986 2987
        where FilterFn: Fn(Def) -> bool
    {
2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998
        let add_module_candidates = |module: Module, names: &mut Vec<Name>| {
            for (&(ident, _), resolution) in module.resolutions.borrow().iter() {
                if let Some(binding) = resolution.borrow().binding {
                    if filter_fn(binding.def()) {
                        names.push(ident.name);
                    }
                }
            }
        };

        let mut names = Vec::new();
2999
        if path.len() == 1 {
3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035
            // Search in lexical scope.
            // Walk backwards up the ribs in scope and collect candidates.
            for rib in self.ribs[ns].iter().rev() {
                // Locals and type parameters
                for (ident, def) in &rib.bindings {
                    if filter_fn(*def) {
                        names.push(ident.name);
                    }
                }
                // Items in scope
                if let ModuleRibKind(module) = rib.kind {
                    // Items from this module
                    add_module_candidates(module, &mut names);

                    if let ModuleKind::Block(..) = module.kind {
                        // We can see through blocks
                    } else {
                        // Items from the prelude
                        if let Some(prelude) = self.prelude {
                            if !module.no_implicit_prelude {
                                add_module_candidates(prelude, &mut names);
                            }
                        }
                        break;
                    }
                }
            }
            // Add primitive types to the mix
            if filter_fn(Def::PrimTy(TyBool)) {
                for (name, _) in &self.primitive_type_table.primitive_types {
                    names.push(*name);
                }
            }
        } else {
            // Search in module.
            let mod_path = &path[..path.len() - 1];
3036 3037
            if let PathResult::Module(module) = self.resolve_path(mod_path, Some(TypeNS),
                                                                  false, span) {
3038 3039
                add_module_candidates(module, &mut names);
            }
3040
        }
3041 3042 3043 3044 3045

        let name = path[path.len() - 1].name;
        // Make sure error reporting is deterministic.
        names.sort_by_key(|name| name.as_str());
        match find_best_match_for_name(names.iter(), &name.as_str(), None) {
3046
            Some(found) if found != name => Some(found),
3047
            _ => None,
3048
        }
3049 3050
    }

3051 3052 3053
    fn with_resolved_label<F>(&mut self, label: Option<SpannedIdent>, id: NodeId, f: F)
        where F: FnOnce(&mut Resolver)
    {
3054
        if let Some(label) = label {
3055
            let def = Def::Label(id);
3056
            self.with_label_rib(|this| {
J
Jeffrey Seyfried 已提交
3057
                this.label_ribs.last_mut().unwrap().bindings.insert(label.node, def);
3058
                f(this);
3059 3060
            });
        } else {
3061
            f(self);
3062 3063 3064
        }
    }

3065 3066 3067 3068
    fn resolve_labeled_block(&mut self, label: Option<SpannedIdent>, id: NodeId, block: &Block) {
        self.with_resolved_label(label, id, |this| this.visit_block(block));
    }

3069
    fn resolve_expr(&mut self, expr: &Expr, parent: Option<&Expr>) {
P
Patrick Walton 已提交
3070 3071
        // First, record candidate traits for this expression if it could
        // result in the invocation of a method call.
3072 3073 3074

        self.record_candidate_traits_for_expr_if_necessary(expr);

3075
        // Next, resolve the node.
3076
        match expr.node {
3077 3078
            ExprKind::Path(ref qself, ref path) => {
                self.smart_resolve_path(expr.id, qself.as_ref(), path, PathSource::Expr(parent));
3079
                visit::walk_expr(self, expr);
3080 3081
            }

V
Vadim Petrochenkov 已提交
3082
            ExprKind::Struct(ref path, ..) => {
3083
                self.smart_resolve_path(expr.id, None, path, PathSource::Struct);
3084
                visit::walk_expr(self, expr);
3085 3086
            }

3087
            ExprKind::Break(Some(label), _) | ExprKind::Continue(Some(label)) => {
3088
                match self.search_label(label.node) {
3089
                    None => {
3090
                        self.record_def(expr.id, err_path_resolution());
3091
                        resolve_error(self,
3092
                                      label.span,
3093
                                      ResolutionError::UndeclaredLabel(&label.node.name.as_str()));
3094
                    }
3095
                    Some(def @ Def::Label(_)) => {
3096
                        // Since this def is a label, it is never read.
3097
                        self.record_def(expr.id, PathResolution::new(def));
3098 3099
                    }
                    Some(_) => {
3100
                        span_bug!(expr.span, "label wasn't mapped to a label def!");
3101 3102
                    }
                }
3103 3104 3105

                // visit `break` argument if any
                visit::walk_expr(self, expr);
3106
            }
3107 3108 3109 3110

            ExprKind::IfLet(ref pattern, ref subexpression, ref if_block, ref optional_else) => {
                self.visit_expr(subexpression);

J
Jeffrey Seyfried 已提交
3111
                self.ribs[ValueNS].push(Rib::new(NormalRibKind));
3112
                self.resolve_pattern(pattern, PatternSource::IfLet, &mut FxHashMap());
3113
                self.visit_block(if_block);
J
Jeffrey Seyfried 已提交
3114
                self.ribs[ValueNS].pop();
3115 3116 3117 3118

                optional_else.as_ref().map(|expr| self.visit_expr(expr));
            }

J
Jeffrey Seyfried 已提交
3119 3120 3121
            ExprKind::Loop(ref block, label) => self.resolve_labeled_block(label, expr.id, &block),

            ExprKind::While(ref subexpression, ref block, label) => {
3122 3123 3124 3125
                self.with_resolved_label(label, expr.id, |this| {
                    this.visit_expr(subexpression);
                    this.visit_block(block);
                });
J
Jeffrey Seyfried 已提交
3126 3127
            }

3128
            ExprKind::WhileLet(ref pattern, ref subexpression, ref block, label) => {
3129 3130
                self.with_resolved_label(label, expr.id, |this| {
                    this.visit_expr(subexpression);
3131
                    this.ribs[ValueNS].push(Rib::new(NormalRibKind));
3132 3133
                    this.resolve_pattern(pattern, PatternSource::WhileLet, &mut FxHashMap());
                    this.visit_block(block);
3134
                    this.ribs[ValueNS].pop();
3135
                });
3136 3137 3138 3139
            }

            ExprKind::ForLoop(ref pattern, ref subexpression, ref block, label) => {
                self.visit_expr(subexpression);
J
Jeffrey Seyfried 已提交
3140
                self.ribs[ValueNS].push(Rib::new(NormalRibKind));
3141
                self.resolve_pattern(pattern, PatternSource::For, &mut FxHashMap());
3142

J
Jeffrey Seyfried 已提交
3143
                self.resolve_labeled_block(label, expr.id, block);
3144

J
Jeffrey Seyfried 已提交
3145
                self.ribs[ValueNS].pop();
3146 3147
            }

3148
            // Equivalent to `visit::walk_expr` + passing some context to children.
3149
            ExprKind::Field(ref subexpression, _) => {
3150
                self.resolve_expr(subexpression, Some(expr));
3151
            }
3152
            ExprKind::MethodCall(ref segment, ref arguments) => {
3153
                let mut arguments = arguments.iter();
3154
                self.resolve_expr(arguments.next().unwrap(), Some(expr));
3155 3156 3157
                for argument in arguments {
                    self.resolve_expr(argument, None);
                }
3158
                self.visit_path_segment(expr.span, segment);
3159
            }
3160 3161 3162 3163 3164 3165 3166

            ExprKind::Repeat(ref element, ref count) => {
                self.visit_expr(element);
                self.with_constant_rib(|this| {
                    this.visit_expr(count);
                });
            }
3167
            ExprKind::Call(ref callee, ref arguments) => {
3168
                self.resolve_expr(callee, Some(expr));
3169 3170 3171 3172
                for argument in arguments {
                    self.resolve_expr(argument, None);
                }
            }
3173

B
Brian Anderson 已提交
3174
            _ => {
3175
                visit::walk_expr(self, expr);
3176 3177 3178 3179
            }
        }
    }

E
Eduard Burtescu 已提交
3180
    fn record_candidate_traits_for_expr_if_necessary(&mut self, expr: &Expr) {
3181
        match expr.node {
3182
            ExprKind::Field(_, name) => {
3183 3184 3185 3186
                // FIXME(#6890): Even though you can't treat a method like a
                // field, we need to add any trait methods we find that match
                // the field name so that we can do some nice error reporting
                // later on in typeck.
3187
                let traits = self.get_traits_containing_item(name.node, ValueNS);
3188
                self.trait_map.insert(expr.id, traits);
3189
            }
3190
            ExprKind::MethodCall(ref segment, ..) => {
C
corentih 已提交
3191
                debug!("(recording candidate traits for expr) recording traits for {}",
3192
                       expr.id);
3193
                let traits = self.get_traits_containing_item(segment.identifier, ValueNS);
3194
                self.trait_map.insert(expr.id, traits);
3195
            }
3196
            _ => {
3197 3198 3199 3200 3201
                // Nothing to do.
            }
        }
    }

J
Jeffrey Seyfried 已提交
3202 3203
    fn get_traits_containing_item(&mut self, mut ident: Ident, ns: Namespace)
                                  -> Vec<TraitCandidate> {
3204
        debug!("(getting traits containing item) looking for '{}'", ident.name);
E
Eduard Burtescu 已提交
3205

3206
        let mut found_traits = Vec::new();
J
Jeffrey Seyfried 已提交
3207
        // Look for the current trait.
3208 3209 3210 3211
        if let Some((module, _)) = self.current_trait_ref {
            if self.resolve_ident_in_module(module, ident, ns, false, false, module.span).is_ok() {
                let def_id = module.def_id().unwrap();
                found_traits.push(TraitCandidate { def_id: def_id, import_id: None });
E
Eduard Burtescu 已提交
3212
            }
J
Jeffrey Seyfried 已提交
3213
        }
3214

J
Jeffrey Seyfried 已提交
3215
        ident.ctxt = ident.ctxt.modern();
J
Jeffrey Seyfried 已提交
3216 3217
        let mut search_module = self.current_module;
        loop {
3218
            self.get_traits_in_module_containing_item(ident, ns, search_module, &mut found_traits);
J
Jeffrey Seyfried 已提交
3219 3220
            search_module =
                unwrap_or!(self.hygienic_lexical_parent(search_module, &mut ident.ctxt), break);
3221
        }
3222

3223 3224
        if let Some(prelude) = self.prelude {
            if !search_module.no_implicit_prelude {
3225
                self.get_traits_in_module_containing_item(ident, ns, prelude, &mut found_traits);
E
Eduard Burtescu 已提交
3226
            }
3227 3228
        }

E
Eduard Burtescu 已提交
3229
        found_traits
3230 3231
    }

3232
    fn get_traits_in_module_containing_item(&mut self,
3233
                                            ident: Ident,
3234
                                            ns: Namespace,
3235
                                            module: Module<'a>,
3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249
                                            found_traits: &mut Vec<TraitCandidate>) {
        let mut traits = module.traits.borrow_mut();
        if traits.is_none() {
            let mut collected_traits = Vec::new();
            module.for_each_child(|name, ns, binding| {
                if ns != TypeNS { return }
                if let Def::Trait(_) = binding.def() {
                    collected_traits.push((name, binding));
                }
            });
            *traits = Some(collected_traits.into_boxed_slice());
        }

        for &(trait_name, binding) in traits.as_ref().unwrap().iter() {
3250
            let module = binding.module().unwrap();
J
Jeffrey Seyfried 已提交
3251 3252 3253 3254 3255 3256
            let mut ident = ident;
            if ident.ctxt.glob_adjust(module.expansion, binding.span.ctxt.modern()).is_none() {
                continue
            }
            if self.resolve_ident_in_module_unadjusted(module, ident, ns, false, false, module.span)
                   .is_ok() {
3257 3258 3259 3260 3261 3262 3263 3264
                let import_id = match binding.kind {
                    NameBindingKind::Import { directive, .. } => {
                        self.maybe_unused_trait_imports.insert(directive.id);
                        self.add_to_glob_map(directive.id, trait_name);
                        Some(directive.id)
                    }
                    _ => None,
                };
3265
                let trait_def_id = module.def_id().unwrap();
3266 3267 3268 3269 3270
                found_traits.push(TraitCandidate { def_id: trait_def_id, import_id: import_id });
            }
        }
    }

3271 3272 3273 3274 3275 3276 3277
    /// When name resolution fails, this method can be used to look up candidate
    /// entities with the expected name. It allows filtering them using the
    /// supplied predicate (which should be used to only accept the types of
    /// definitions expected e.g. traits). The lookup spans across all crates.
    ///
    /// NOTE: The method does not look into imports, but this is not a problem,
    /// since we report the definitions (thus, the de-aliased imports).
3278 3279 3280 3281 3282 3283 3284 3285
    fn lookup_import_candidates<FilterFn>(&mut self,
                                          lookup_name: Name,
                                          namespace: Namespace,
                                          filter_fn: FilterFn)
                                          -> Vec<ImportSuggestion>
        where FilterFn: Fn(Def) -> bool
    {
        let mut candidates = Vec::new();
3286
        let mut worklist = Vec::new();
3287
        let mut seen_modules = FxHashSet();
3288 3289 3290 3291 3292
        worklist.push((self.graph_root, Vec::new(), false));

        while let Some((in_module,
                        path_segments,
                        in_module_is_extern)) = worklist.pop() {
3293
            self.populate_module_if_necessary(in_module);
3294

3295
            in_module.for_each_child(|ident, ns, name_binding| {
3296 3297

                // avoid imports entirely
3298
                if name_binding.is_import() && !name_binding.is_extern_crate() { return; }
3299 3300
                // avoid non-importable candidates as well
                if !name_binding.is_importable() { return; }
3301 3302

                // collect results based on the filter function
3303
                if ident.name == lookup_name && ns == namespace {
3304
                    if filter_fn(name_binding.def()) {
3305 3306
                        // create the path
                        let mut segms = path_segments.clone();
3307
                        segms.push(ast::PathSegment::from_ident(ident, name_binding.span));
3308
                        let path = Path {
3309
                            span: name_binding.span,
3310 3311 3312 3313 3314 3315 3316 3317 3318
                            segments: segms,
                        };
                        // the entity is accessible in the following cases:
                        // 1. if it's defined in the same crate, it's always
                        // accessible (since private entities can be made public)
                        // 2. if it's defined in another crate, it's accessible
                        // only if both the module is public and the entity is
                        // declared as public (due to pruning, we don't explore
                        // outside crate private modules => no need to check this)
3319
                        if !in_module_is_extern || name_binding.vis == ty::Visibility::Public {
3320
                            candidates.push(ImportSuggestion { path: path });
3321 3322 3323 3324 3325
                        }
                    }
                }

                // collect submodules to explore
J
Jeffrey Seyfried 已提交
3326
                if let Some(module) = name_binding.module() {
3327
                    // form the path
3328
                    let mut path_segments = path_segments.clone();
3329
                    path_segments.push(ast::PathSegment::from_ident(ident, name_binding.span));
3330

3331
                    if !in_module_is_extern || name_binding.vis == ty::Visibility::Public {
3332
                        // add the module to the lookup
3333
                        let is_extern = in_module_is_extern || name_binding.is_extern_crate();
3334
                        if seen_modules.insert(module.def_id().unwrap()) {
3335 3336
                            worklist.push((module, path_segments, is_extern));
                        }
3337 3338 3339 3340 3341
                    }
                }
            })
        }

3342
        candidates
3343 3344
    }

3345 3346
    fn record_def(&mut self, node_id: NodeId, resolution: PathResolution) {
        debug!("(recording def) recording {:?} for {}", resolution, node_id);
3347
        if let Some(prev_res) = self.def_map.insert(node_id, resolution) {
3348
            panic!("path resolved multiple times ({:?} before, {:?} now)", prev_res, resolution);
3349
        }
3350 3351
    }

3352
    fn resolve_visibility(&mut self, vis: &ast::Visibility) -> ty::Visibility {
3353 3354 3355
        match *vis {
            ast::Visibility::Public => ty::Visibility::Public,
            ast::Visibility::Crate(..) => ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)),
3356
            ast::Visibility::Inherited => {
3357
                ty::Visibility::Restricted(self.current_module.normal_ancestor_id)
3358
            }
3359
            ast::Visibility::Restricted { ref path, id } => {
3360 3361
                let def = self.smart_resolve_path(id, None, path,
                                                  PathSource::Visibility).base_def();
3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373
                if def == Def::Err {
                    ty::Visibility::Public
                } else {
                    let vis = ty::Visibility::Restricted(def.def_id());
                    if self.is_accessible(vis) {
                        vis
                    } else {
                        self.session.span_err(path.span, "visibilities can only be restricted \
                                                          to ancestor modules");
                        ty::Visibility::Public
                    }
                }
3374 3375 3376 3377
            }
        }
    }

3378
    fn is_accessible(&self, vis: ty::Visibility) -> bool {
3379
        vis.is_accessible_from(self.current_module.normal_ancestor_id, self)
3380 3381
    }

3382
    fn is_accessible_from(&self, vis: ty::Visibility, module: Module<'a>) -> bool {
3383
        vis.is_accessible_from(module.normal_ancestor_id, self)
3384 3385
    }

3386 3387
    fn report_errors(&mut self) {
        self.report_shadowing_errors();
3388
        let mut reported_spans = FxHashSet();
3389

3390
        for &AmbiguityError { span, name, b1, b2, lexical, legacy } in &self.ambiguity_errors {
3391
            if !reported_spans.insert(span) { continue }
3392 3393 3394
            let participle = |binding: &NameBinding| {
                if binding.is_import() { "imported" } else { "defined" }
            };
3395 3396
            let msg1 = format!("`{}` could refer to the name {} here", name, participle(b1));
            let msg2 = format!("`{}` could also refer to the name {} here", name, participle(b2));
3397
            let note = if b1.expansion == Mark::root() || !lexical && b1.is_glob_import() {
3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416
                format!("consider adding an explicit import of `{}` to disambiguate", name)
            } else if let Def::Macro(..) = b1.def() {
                format!("macro-expanded {} do not shadow",
                        if b1.is_import() { "macro imports" } else { "macros" })
            } else {
                format!("macro-expanded {} do not shadow when used in a macro invocation path",
                        if b1.is_import() { "imports" } else { "items" })
            };
            if legacy {
                let id = match b2.kind {
                    NameBindingKind::Import { directive, .. } => directive.id,
                    _ => unreachable!(),
                };
                let mut span = MultiSpan::from_span(span);
                span.push_span_label(b1.span, msg1);
                span.push_span_label(b2.span, msg2);
                let msg = format!("`{}` is ambiguous", name);
                self.session.add_lint(lint::builtin::LEGACY_IMPORTS, id, span, msg);
            } else {
3417 3418 3419 3420 3421 3422 3423 3424 3425
                let mut err =
                    self.session.struct_span_err(span, &format!("`{}` is ambiguous", name));
                err.span_note(b1.span, &msg1);
                match b2.def() {
                    Def::Macro(..) if b2.span == DUMMY_SP =>
                        err.note(&format!("`{}` is also a builtin macro", name)),
                    _ => err.span_note(b2.span, &msg2),
                };
                err.note(&note).emit();
3426
            }
3427 3428
        }

3429 3430
        for &PrivacyError(span, name, binding) in &self.privacy_errors {
            if !reported_spans.insert(span) { continue }
G
Guillaume Gomez 已提交
3431
            span_err!(self.session, span, E0603, "{} `{}` is private", binding.descr(), name);
3432 3433
        }
    }
3434

3435
    fn report_shadowing_errors(&mut self) {
J
Jeffrey Seyfried 已提交
3436 3437
        for (ident, scope) in replace(&mut self.lexical_macro_resolutions, Vec::new()) {
            self.resolve_legacy_scope(scope, ident, true);
J
Jeffrey Seyfried 已提交
3438 3439
        }

3440
        let mut reported_errors = FxHashSet();
3441
        for binding in replace(&mut self.disallowed_shadowing, Vec::new()) {
J
Jeffrey Seyfried 已提交
3442 3443 3444
            if self.resolve_legacy_scope(&binding.parent, binding.ident, false).is_some() &&
               reported_errors.insert((binding.ident, binding.span)) {
                let msg = format!("`{}` is already in scope", binding.ident);
3445
                self.session.struct_span_err(binding.span, &msg)
3446 3447
                    .note("macro-expanded `macro_rules!`s may not shadow \
                           existing macros (see RFC 1560)")
3448 3449 3450 3451 3452
                    .emit();
            }
        }
    }

3453
    fn report_conflict(&mut self,
3454
                       parent: Module,
3455
                       ident: Ident,
3456
                       ns: Namespace,
3457
                       new_binding: &NameBinding,
3458 3459
                       old_binding: &NameBinding) {
        // Error on the second of two conflicting names
3460 3461
        if old_binding.span.lo > new_binding.span.lo {
            return self.report_conflict(parent, ident, ns, old_binding, new_binding);
3462 3463
        }

J
Jeffrey Seyfried 已提交
3464 3465 3466 3467
        let container = match parent.kind {
            ModuleKind::Def(Def::Mod(_), _) => "module",
            ModuleKind::Def(Def::Trait(_), _) => "trait",
            ModuleKind::Block(..) => "block",
3468 3469 3470
            _ => "enum",
        };

3471 3472 3473
        let old_noun = match old_binding.is_import() {
            true => "import",
            false => "definition",
3474 3475
        };

3476 3477 3478 3479 3480 3481
        let new_participle = match new_binding.is_import() {
            true => "imported",
            false => "defined",
        };

        let (name, span) = (ident.name, new_binding.span);
3482 3483 3484 3485 3486 3487 3488

        if let Some(s) = self.name_already_seen.get(&name) {
            if s == &span {
                return;
            }
        }

3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501
        let old_kind = match (ns, old_binding.module()) {
            (ValueNS, _) => "value",
            (MacroNS, _) => "macro",
            (TypeNS, _) if old_binding.is_extern_crate() => "extern crate",
            (TypeNS, Some(module)) if module.is_normal() => "module",
            (TypeNS, Some(module)) if module.is_trait() => "trait",
            (TypeNS, _) => "type",
        };

        let namespace = match ns {
            ValueNS => "value",
            MacroNS => "macro",
            TypeNS => "type",
3502 3503
        };

3504 3505 3506
        let msg = format!("the name `{}` is defined multiple times", name);

        let mut err = match (old_binding.is_extern_crate(), new_binding.is_extern_crate()) {
3507
            (true, true) => struct_span_err!(self.session, span, E0259, "{}", msg),
3508
            (true, _) | (_, true) => match new_binding.is_import() && old_binding.is_import() {
3509 3510
                true => struct_span_err!(self.session, span, E0254, "{}", msg),
                false => struct_span_err!(self.session, span, E0260, "{}", msg),
M
Mohit Agarwal 已提交
3511
            },
3512
            _ => match (old_binding.is_import(), new_binding.is_import()) {
3513 3514 3515
                (false, false) => struct_span_err!(self.session, span, E0428, "{}", msg),
                (true, true) => struct_span_err!(self.session, span, E0252, "{}", msg),
                _ => struct_span_err!(self.session, span, E0255, "{}", msg),
3516 3517 3518
            },
        };

3519 3520 3521 3522 3523 3524
        err.note(&format!("`{}` must be defined only once in the {} namespace of this {}",
                          name,
                          namespace,
                          container));

        err.span_label(span, format!("`{}` re{} here", name, new_participle));
3525
        if old_binding.span != syntax_pos::DUMMY_SP {
3526 3527
            err.span_label(old_binding.span, format!("previous {} of the {} `{}` here",
                                                      old_noun, old_kind, name));
3528
        }
3529

3530
        err.emit();
3531
        self.name_already_seen.insert(name, span);
3532
    }
J
Jeffrey Seyfried 已提交
3533 3534 3535 3536 3537 3538

    fn warn_legacy_self_import(&self, directive: &'a ImportDirective<'a>) {
        let (id, span) = (directive.id, directive.span);
        let msg = "`self` no longer imports values".to_string();
        self.session.add_lint(lint::builtin::LEGACY_IMPORTS, id, span, msg);
    }
3539 3540 3541 3542 3543

    fn check_proc_macro_attrs(&mut self, attrs: &[ast::Attribute]) {
        if self.proc_macro_enabled { return; }

        for attr in attrs {
3544 3545 3546 3547
            if attr.path.segments.len() > 1 {
                continue
            }
            let ident = attr.path.segments[0].identifier;
3548 3549 3550 3551
            let result = self.resolve_lexical_macro_path_segment(ident,
                                                                 MacroNS,
                                                                 false,
                                                                 attr.path.span);
3552 3553
            if let Ok(binding) = result {
                if let SyntaxExtension::AttrProcMacro(..) = *binding.binding().get_macro(self) {
3554 3555 3556 3557 3558 3559 3560
                    attr::mark_known(attr);

                    let msg = "attribute procedural macros are experimental";
                    let feature = "proc_macro";

                    feature_err(&self.session.parse_sess, feature,
                                attr.span, GateIssue::Language, msg)
3561
                        .span_note(binding.span(), "procedural macro imported here")
3562 3563 3564 3565 3566
                        .emit();
                }
            }
        }
    }
3567
}
3568

3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584
fn is_struct_like(def: Def) -> bool {
    match def {
        Def::VariantCtor(_, CtorKind::Fictive) => true,
        _ => PathSource::Struct.is_expected(def),
    }
}

fn is_self_type(path: &[Ident], namespace: Namespace) -> bool {
    namespace == TypeNS && path.len() == 1 && path[0].name == keywords::SelfType.name()
}

fn is_self_value(path: &[Ident], namespace: Namespace) -> bool {
    namespace == ValueNS && path.len() == 1 && path[0].name == keywords::SelfValue.name()
}

fn names_to_string(idents: &[Ident]) -> String {
3585
    let mut result = String::new();
3586
    for (i, ident) in idents.iter().filter(|i| i.name != keywords::CrateRoot.name()).enumerate() {
3587 3588 3589
        if i > 0 {
            result.push_str("::");
        }
3590
        result.push_str(&ident.name.as_str());
C
corentih 已提交
3591
    }
3592 3593 3594
    result
}

3595 3596
fn path_names_to_string(path: &Path) -> String {
    names_to_string(&path.segments.iter().map(|seg| seg.identifier).collect::<Vec<_>>())
3597 3598
}

3599
/// Get the path for an enum and the variant from an `ImportSuggestion` for an enum variant.
E
Esteban Küber 已提交
3600
fn import_candidate_to_paths(suggestion: &ImportSuggestion) -> (Span, String, String) {
3601 3602 3603 3604 3605 3606 3607 3608 3609 3610
    let variant_path = &suggestion.path;
    let variant_path_string = path_names_to_string(variant_path);

    let path_len = suggestion.path.segments.len();
    let enum_path = ast::Path {
        span: suggestion.path.span,
        segments: suggestion.path.segments[0..path_len - 1].to_vec(),
    };
    let enum_path_string = path_names_to_string(&enum_path);

E
Esteban Küber 已提交
3611
    (suggestion.path.span, variant_path_string, enum_path_string)
3612 3613 3614
}


3615 3616 3617
/// When an entity with a given name is not available in scope, we search for
/// entities with that name in all crates. This method allows outputting the
/// results of this search in a programmer-friendly way
3618 3619
fn show_candidates(err: &mut DiagnosticBuilder,
                   span: Span,
3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632
                   candidates: &[ImportSuggestion],
                   better: bool) {

    // we want consistent results across executions, but candidates are produced
    // by iterating through a hash map, so make sure they are ordered:
    let mut path_strings: Vec<_> =
        candidates.into_iter().map(|c| path_names_to_string(&c.path)).collect();
    path_strings.sort();

    let better = if better { "better " } else { "" };
    let msg_diff = match path_strings.len() {
        1 => " is found in another module, you can import it",
        _ => "s are found in other modules, you can import them",
3633
    };
3634 3635 3636 3637 3638
    let msg = format!("possible {}candidate{} into scope", better, msg_diff);

    for candidate in &mut path_strings {
        *candidate = format!("use {};\n", candidate);
    }
3639

3640
    err.span_suggestions(span, &msg, path_strings);
3641 3642
}

3643
/// A somewhat inefficient routine to obtain the name of a module.
3644
fn module_to_string(module: Module) -> String {
3645 3646
    let mut names = Vec::new();

3647
    fn collect_mod(names: &mut Vec<Ident>, module: Module) {
J
Jeffrey Seyfried 已提交
3648 3649
        if let ModuleKind::Def(_, name) = module.kind {
            if let Some(parent) = module.parent {
3650
                names.push(Ident::with_empty_ctxt(name));
J
Jeffrey Seyfried 已提交
3651
                collect_mod(names, parent);
3652
            }
J
Jeffrey Seyfried 已提交
3653 3654
        } else {
            // danger, shouldn't be ident?
3655
            names.push(Ident::from_str("<opaque>"));
J
Jeffrey Seyfried 已提交
3656
            collect_mod(names, module.parent.unwrap());
3657 3658 3659 3660
        }
    }
    collect_mod(&mut names, module);

3661
    if names.is_empty() {
3662 3663
        return "???".to_string();
    }
3664
    names_to_string(&names.into_iter().rev().collect::<Vec<_>>())
3665 3666
}

3667
fn err_path_resolution() -> PathResolution {
3668
    PathResolution::new(Def::Err)
3669 3670
}

N
Niko Matsakis 已提交
3671
#[derive(PartialEq,Copy, Clone)]
3672 3673
pub enum MakeGlobMap {
    Yes,
C
corentih 已提交
3674
    No,
3675 3676
}

3677
__build_diagnostic_array! { librustc_resolve, DIAGNOSTICS }