lib.rs 144.8 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

T
Fallout  
Tamir Duberstein 已提交
19
#![feature(associated_consts)]
A
Alex Crichton 已提交
20
#![feature(rustc_diagnostic_macros)]
21 22 23 24

#![cfg_attr(stage0, unstable(feature = "rustc_private", issue = "27812"))]
#![cfg_attr(stage0, feature(rustc_private))]
#![cfg_attr(stage0, feature(staged_api))]
25

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

S
Steven Fackler 已提交
36 37 38 39
use self::Namespace::*;
use self::TypeParameters::*;
use self::RibKind::*;

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

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

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

68
use syntax_pos::{Span, DUMMY_SP, MultiSpan};
69 70
use errors::DiagnosticBuilder;

71
use std::cell::{Cell, RefCell};
72
use std::cmp;
73
use std::collections::BTreeSet;
74
use std::fmt;
75
use std::mem::replace;
76
use std::rc::Rc;
77

78
use resolve_imports::{ImportDirective, ImportDirectiveSubclass, NameResolution, ImportResolver};
79
use macros::{InvocationData, LegacyBinding, LegacyScope, MacroBinding};
80

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

85
mod macros;
A
Alex Crichton 已提交
86
mod check_unused;
87
mod build_reduced_graph;
88
mod resolve_imports;
89

90 91 92
/// A free importable items suggested in case of resolution failure.
struct ImportSuggestion {
    path: Path,
93 94
}

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

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

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

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

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

358
#[derive(Copy, Clone, Debug)]
359
struct BindingInfo {
360
    span: Span,
361
    binding_mode: BindingMode,
362 363 364
}

// Map from the name in a pattern to its binding mode.
365
type BindingMap = FxHashMap<Ident, BindingInfo>;
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 391 392 393
#[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",
        }
    }
394 395
}

396 397 398 399 400 401 402
#[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.
403
    Expr(Option<&'a Expr>),
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 457 458 459
    // 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"),
            },
460
            PathSource::Expr(parent) => match parent.map(|p| &p.node) {
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 550 551 552
                // "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 已提交
553
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
G
Garming Sam 已提交
554
pub enum Namespace {
555
    TypeNS,
C
corentih 已提交
556
    ValueNS,
557
    MacroNS,
558 559
}

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

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,
573
            MacroNS => self.macro_ns.as_ref().unwrap(),
J
Jeffrey Seyfried 已提交
574 575 576 577 578 579 580 581 582
        }
    }
}

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,
583
            MacroNS => self.macro_ns.as_mut().unwrap(),
J
Jeffrey Seyfried 已提交
584 585 586 587
        }
    }
}

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

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

        // Create a value rib for the function.
J
Jeffrey Seyfried 已提交
675
        self.ribs[ValueNS].push(Rib::new(rib_kind));
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 702 703 704

        // 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 已提交
705
        self.ribs[ValueNS].pop();
706
    }
707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732
    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); }
    }
733
}
734

735
pub type ErrorMessage = Option<(Span, String)>;
736

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

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

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

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

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

766 767
    // We passed through an item scope. Disallow upvars.
    ItemRibKind,
768 769

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

772 773
    // We passed through a module.
    ModuleRibKind(Module<'a>),
774

775 776
    // We passed through a `macro_rules!` statement
    MacroDefinition(DefId),
777 778 779 780 781

    // 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,
782 783
}

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

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

800 801
enum LexicalScopeBinding<'a> {
    Item(&'a NameBinding<'a>),
J
Jeffrey Seyfried 已提交
802
    Def(Def),
803 804
}

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

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

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

J
Jeffrey Seyfried 已提交
829 830 831
enum ModuleKind {
    Block(NodeId),
    Def(Def, Name),
832 833
}

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

839 840
    // The def id of the closest normal module (`mod`) ancestor (including this module).
    normal_ancestor_id: DefId,
841

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

846 847 848
    // Macro invocations that can expand into items in this module.
    unresolved_invocations: RefCell<FxHashSet<Mark>>,

849
    no_implicit_prelude: bool,
850

851
    glob_importers: RefCell<Vec<&'a ImportDirective<'a>>>,
852
    globs: RefCell<Vec<&'a ImportDirective<'a>>>,
853

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

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

    /// Span of the module itself. Used for error reporting.
    span: Span,
864 865
}

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

868
impl<'a> ModuleData<'a> {
O
Oliver Schneider 已提交
869 870 871 872
    fn new(parent: Option<Module<'a>>,
           kind: ModuleKind,
           normal_ancestor_id: DefId,
           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,
887
        }
B
Brian Anderson 已提交
888 889
    }

890 891 892
    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));
893 894 895
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1016 1017 1018 1019 1020 1021 1022
    // 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 {
1023 1024
            NameBindingKind::Def(Def::Variant(..)) |
            NameBindingKind::Def(Def::VariantCtor(..)) => true,
1025 1026
            _ => false,
        }
1027 1028
    }

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

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

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

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

1063
/// Interns the names of the primitive types.
F
Felix S. Klock II 已提交
1064
struct PrimitiveTypeTable {
1065
    primitive_types: FxHashMap<Name, PrimTy>,
1066
}
1067

1068
impl PrimitiveTypeTable {
K
Kevin Butler 已提交
1069
    fn new() -> PrimitiveTypeTable {
1070
        let mut table = PrimitiveTypeTable { primitive_types: FxHashMap() };
C
corentih 已提交
1071 1072 1073

        table.intern("bool", TyBool);
        table.intern("char", TyChar);
1074 1075
        table.intern("f32", TyFloat(FloatTy::F32));
        table.intern("f64", TyFloat(FloatTy::F64));
1076 1077 1078 1079 1080
        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));
1081
        table.intern("i128", TyInt(IntTy::I128));
C
corentih 已提交
1082
        table.intern("str", TyStr);
1083 1084 1085 1086 1087
        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));
1088
        table.intern("u128", TyUint(UintTy::U128));
K
Kevin Butler 已提交
1089 1090 1091
        table
    }

1092
    fn intern(&mut self, string: &str, primitive_type: PrimTy) {
1093
        self.primitive_types.insert(Symbol::intern(string), primitive_type);
1094 1095 1096
    }
}

1097
/// The main resolver class.
1098
pub struct Resolver<'a> {
E
Eduard Burtescu 已提交
1099
    session: &'a Session,
1100

1101
    pub definitions: Definitions,
1102

1103
    graph_root: Module<'a>,
1104

1105 1106
    prelude: Option<Module<'a>>,

1107
    trait_item_map: FxHashMap<(DefId, Name, Namespace), (Def, bool /* has self */)>,
1108

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

1113 1114 1115 1116
    // All imports known to succeed or fail.
    determined_imports: Vec<&'a ImportDirective<'a>>,

    // All non-determined imports.
1117
    indeterminate_imports: Vec<&'a ImportDirective<'a>>,
1118 1119

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

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

1126
    // The current set of local scopes, for labels.
1127
    label_ribs: Vec<Rib<'a>>,
1128

1129
    // The trait that the current context can refer to.
1130 1131 1132 1133
    current_trait_ref: Option<(DefId, TraitRef)>,

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

1135
    // The idents for the primitive types.
E
Eduard Burtescu 已提交
1136
    primitive_type_table: PrimitiveTypeTable,
1137

1138
    def_map: DefMap,
1139
    pub freevars: FreevarMap,
1140
    freevars_seen: NodeMap<NodeMap<usize>>,
1141 1142
    pub export_map: ExportMap,
    pub trait_map: TraitMap,
1143

1144
    // A map from nodes to anonymous modules.
1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157
    // 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`.
1158 1159
    block_map: NodeMap<Module<'a>>,
    module_map: FxHashMap<DefId, Module<'a>>,
1160
    extern_crate_roots: FxHashMap<(CrateNum, bool /* MacrosOnly? */), Module<'a>>,
1161

1162
    pub make_glob_map: bool,
1163 1164
    // Maps imports to the names of items actually imported (this actually maps
    // all imports, but only glob imports are actually interesting).
1165
    pub glob_map: GlobMap,
1166

1167
    used_imports: FxHashSet<(NodeId, Namespace)>,
1168
    pub maybe_unused_trait_imports: NodeSet,
G
Garming Sam 已提交
1169

1170
    privacy_errors: Vec<PrivacyError<'a>>,
J
Jeffrey Seyfried 已提交
1171
    ambiguity_errors: Vec<AmbiguityError<'a>>,
J
Jeffrey Seyfried 已提交
1172
    gated_errors: FxHashSet<Span>,
1173
    disallowed_shadowing: Vec<&'a LegacyBinding<'a>>,
1174 1175

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

1179
    crate_loader: &'a mut CrateLoader,
1180
    macro_names: FxHashSet<Name>,
J
Jeffrey Seyfried 已提交
1181
    global_macros: FxHashMap<Name, &'a NameBinding<'a>>,
1182
    lexical_macro_resolutions: Vec<(Name, &'a Cell<LegacyScope<'a>>)>,
J
Jeffrey Seyfried 已提交
1183
    macro_map: FxHashMap<DefId, Rc<SyntaxExtension>>,
1184 1185
    macro_defs: FxHashMap<Mark, DefId>,
    local_macro_def_scopes: FxHashMap<NodeId, Module<'a>>,
J
Jeffrey Seyfried 已提交
1186
    macro_exports: Vec<Export>,
1187
    pub whitelisted_legacy_custom_derives: Vec<Name>,
1188
    pub found_unresolved_macro: bool,
1189

E
est31 已提交
1190 1191 1192
    // List of crate local macros that we need to warn about as being unused.
    // Right now this only includes macro_rules! macros.
    unused_macros: FxHashSet<DefId>,
E
est31 已提交
1193

1194
    // Maps the `Mark` of an expansion to its containing module or block.
1195
    invocations: FxHashMap<Mark, &'a InvocationData<'a>>,
1196 1197 1198

    // Avoid duplicated errors for "name already defined".
    name_already_seen: FxHashMap<Name, Span>,
1199 1200 1201 1202 1203 1204

    // 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>,
1205 1206

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

1208 1209 1210
    // 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)>,
1211 1212
}

1213
pub struct ResolverArenas<'a> {
1214
    modules: arena::TypedArena<ModuleData<'a>>,
1215
    local_modules: RefCell<Vec<Module<'a>>>,
1216
    name_bindings: arena::TypedArena<NameBinding<'a>>,
1217
    import_directives: arena::TypedArena<ImportDirective<'a>>,
1218
    name_resolutions: arena::TypedArena<RefCell<NameResolution<'a>>>,
1219
    invocation_data: arena::TypedArena<InvocationData<'a>>,
J
Jeffrey Seyfried 已提交
1220
    legacy_bindings: arena::TypedArena<LegacyBinding<'a>>,
1221 1222 1223
}

impl<'a> ResolverArenas<'a> {
1224
    fn alloc_module(&'a self, module: ModuleData<'a>) -> Module<'a> {
1225 1226 1227 1228 1229 1230 1231 1232
        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()
1233 1234 1235 1236
    }
    fn alloc_name_binding(&'a self, name_binding: NameBinding<'a>) -> &'a NameBinding<'a> {
        self.name_bindings.alloc(name_binding)
    }
1237 1238
    fn alloc_import_directive(&'a self, import_directive: ImportDirective<'a>)
                              -> &'a ImportDirective {
1239 1240
        self.import_directives.alloc(import_directive)
    }
1241 1242 1243
    fn alloc_name_resolution(&'a self) -> &'a RefCell<NameResolution<'a>> {
        self.name_resolutions.alloc(Default::default())
    }
1244 1245 1246
    fn alloc_invocation_data(&'a self, expansion_data: InvocationData<'a>)
                             -> &'a InvocationData<'a> {
        self.invocation_data.alloc(expansion_data)
J
Jeffrey Seyfried 已提交
1247
    }
J
Jeffrey Seyfried 已提交
1248 1249 1250
    fn alloc_legacy_binding(&'a self, binding: LegacyBinding<'a>) -> &'a LegacyBinding<'a> {
        self.legacy_bindings.alloc(binding)
    }
1251 1252
}

1253 1254 1255 1256 1257 1258
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 })
1259 1260 1261
    }
}

1262
impl<'a> hir::lowering::Resolver for Resolver<'a> {
J
Jeffrey Seyfried 已提交
1263
    fn resolve_hir_path(&mut self, path: &mut hir::Path, is_value: bool) {
1264
        let namespace = if is_value { ValueNS } else { TypeNS };
1265
        let hir::Path { ref segments, span, ref mut def } = *path;
J
Jeffrey Seyfried 已提交
1266
        let path: Vec<_> = segments.iter().map(|seg| Ident::with_empty_ctxt(seg.name)).collect();
1267
        match self.resolve_path(&path, Some(namespace), true, span) {
J
Jeffrey Seyfried 已提交
1268
            PathResult::Module(module) => *def = module.def().unwrap(),
1269 1270
            PathResult::NonModule(path_res) if path_res.unresolved_segments() == 0 =>
                *def = path_res.base_def(),
1271
            PathResult::NonModule(..) => match self.resolve_path(&path, None, true, span) {
J
Jeffrey Seyfried 已提交
1272 1273 1274 1275 1276 1277 1278 1279
                PathResult::Failed(msg, _) => {
                    resolve_error(self, span, ResolutionError::FailedToResolve(&msg));
                }
                _ => {}
            },
            PathResult::Indeterminate => unreachable!(),
            PathResult::Failed(msg, _) => {
                resolve_error(self, span, ResolutionError::FailedToResolve(&msg));
1280 1281 1282 1283
            }
        }
    }

1284 1285 1286 1287
    fn get_resolution(&mut self, id: NodeId) -> Option<PathResolution> {
        self.def_map.get(&id).cloned()
    }

1288 1289
    fn definitions(&mut self) -> &mut Definitions {
        &mut self.definitions
1290 1291 1292
    }
}

1293
impl<'a> Resolver<'a> {
1294
    pub fn new(session: &'a Session,
1295
               krate: &Crate,
1296
               crate_name: &str,
1297
               make_glob_map: MakeGlobMap,
1298
               crate_loader: &'a mut CrateLoader,
1299
               arenas: &'a ResolverArenas<'a>)
1300
               -> Resolver<'a> {
1301 1302
        let root_def_id = DefId::local(CRATE_DEF_INDEX);
        let root_module_kind = ModuleKind::Def(Def::Mod(root_def_id), keywords::Invalid.name());
1303
        let graph_root = arenas.alloc_module(ModuleData {
1304
            no_implicit_prelude: attr::contains_name(&krate.attrs, "no_implicit_prelude"),
1305
            ..ModuleData::new(None, root_module_kind, root_def_id, krate.span)
1306
        });
1307 1308
        let mut module_map = FxHashMap();
        module_map.insert(DefId::local(CRATE_DEF_INDEX), graph_root);
K
Kevin Butler 已提交
1309

1310
        let mut definitions = Definitions::new();
1311 1312
        DefCollector::new(&mut definitions)
            .collect_root(crate_name, &session.local_crate_disambiguator().as_str());
1313

1314
        let mut invocations = FxHashMap();
1315 1316
        invocations.insert(Mark::root(),
                           arenas.alloc_invocation_data(InvocationData::root(graph_root)));
1317

1318 1319
        let features = session.features.borrow();

1320 1321 1322
        let mut macro_defs = FxHashMap();
        macro_defs.insert(Mark::root(), root_def_id);

K
Kevin Butler 已提交
1323 1324 1325
        Resolver {
            session: session,

1326
            definitions: definitions,
1327

K
Kevin Butler 已提交
1328 1329
            // The outermost module has def ID 0; this is not reflected in the
            // AST.
1330
            graph_root: graph_root,
1331
            prelude: None,
K
Kevin Butler 已提交
1332

1333 1334
            trait_item_map: FxHashMap(),
            field_names: FxHashMap(),
K
Kevin Butler 已提交
1335

1336
            determined_imports: Vec::new(),
1337
            indeterminate_imports: Vec::new(),
K
Kevin Butler 已提交
1338

1339
            current_module: graph_root,
J
Jeffrey Seyfried 已提交
1340 1341 1342
            ribs: PerNS {
                value_ns: vec![Rib::new(ModuleRibKind(graph_root))],
                type_ns: vec![Rib::new(ModuleRibKind(graph_root))],
1343
                macro_ns: Some(vec![Rib::new(ModuleRibKind(graph_root))]),
J
Jeffrey Seyfried 已提交
1344
            },
1345
            label_ribs: Vec::new(),
K
Kevin Butler 已提交
1346 1347 1348 1349 1350 1351

            current_trait_ref: None,
            current_self_type: None,

            primitive_type_table: PrimitiveTypeTable::new(),

1352
            def_map: NodeMap(),
1353 1354
            freevars: NodeMap(),
            freevars_seen: NodeMap(),
1355 1356
            export_map: NodeMap(),
            trait_map: NodeMap(),
1357
            module_map: module_map,
1358
            block_map: NodeMap(),
1359
            extern_crate_roots: FxHashMap(),
K
Kevin Butler 已提交
1360

1361
            make_glob_map: make_glob_map == MakeGlobMap::Yes,
1362
            glob_map: NodeMap(),
G
Garming Sam 已提交
1363

1364
            used_imports: FxHashSet(),
S
Seo Sanghyeon 已提交
1365 1366
            maybe_unused_trait_imports: NodeSet(),

1367
            privacy_errors: Vec::new(),
1368
            ambiguity_errors: Vec::new(),
J
Jeffrey Seyfried 已提交
1369
            gated_errors: FxHashSet(),
1370
            disallowed_shadowing: Vec::new(),
1371 1372

            arenas: arenas,
1373 1374
            dummy_binding: arenas.alloc_name_binding(NameBinding {
                kind: NameBindingKind::Def(Def::Err),
1375
                expansion: Mark::root(),
1376 1377 1378
                span: DUMMY_SP,
                vis: ty::Visibility::Public,
            }),
1379 1380 1381

            // `#![feature(proc_macro)]` implies `#[feature(extern_macros)]`
            use_extern_macros: features.use_extern_macros || features.proc_macro,
1382

1383
            crate_loader: crate_loader,
1384
            macro_names: FxHashSet(),
J
Jeffrey Seyfried 已提交
1385
            global_macros: FxHashMap(),
J
Jeffrey Seyfried 已提交
1386
            lexical_macro_resolutions: Vec::new(),
J
Jeffrey Seyfried 已提交
1387 1388
            macro_map: FxHashMap(),
            macro_exports: Vec::new(),
1389
            invocations: invocations,
1390 1391
            macro_defs: macro_defs,
            local_macro_def_scopes: FxHashMap(),
1392
            name_already_seen: FxHashMap(),
1393
            whitelisted_legacy_custom_derives: Vec::new(),
1394 1395
            proc_macro_enabled: features.proc_macro,
            warned_proc_macros: FxHashSet(),
1396
            potentially_unused_imports: Vec::new(),
1397
            struct_constructors: DefIdMap(),
1398
            found_unresolved_macro: false,
E
est31 已提交
1399
            unused_macros: FxHashSet(),
1400 1401 1402
        }
    }

1403
    pub fn arenas() -> ResolverArenas<'a> {
1404 1405
        ResolverArenas {
            modules: arena::TypedArena::new(),
1406
            local_modules: RefCell::new(Vec::new()),
1407
            name_bindings: arena::TypedArena::new(),
1408
            import_directives: arena::TypedArena::new(),
1409
            name_resolutions: arena::TypedArena::new(),
1410
            invocation_data: arena::TypedArena::new(),
J
Jeffrey Seyfried 已提交
1411
            legacy_bindings: arena::TypedArena::new(),
K
Kevin Butler 已提交
1412 1413
        }
    }
1414

J
Jeffrey Seyfried 已提交
1415 1416 1417 1418
    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),
1419 1420 1421 1422
            macro_ns: match self.use_extern_macros {
                true => Some(f(self, MacroNS)),
                false => None,
            },
J
Jeffrey Seyfried 已提交
1423 1424 1425
        }
    }

1426 1427
    /// Entry point to crate resolution.
    pub fn resolve_crate(&mut self, krate: &Crate) {
1428
        ImportResolver { resolver: self }.finalize_imports();
1429
        self.current_module = self.graph_root;
1430
        self.finalize_current_module_macro_resolutions();
1431 1432 1433
        visit::walk_crate(self, krate);

        check_unused::check_crate(self, krate);
1434
        self.report_errors();
1435
        self.crate_loader.postprocess(krate);
1436 1437
    }

O
Oliver Schneider 已提交
1438 1439 1440 1441 1442 1443 1444
    fn new_module(
        &self,
        parent: Module<'a>,
        kind: ModuleKind,
        normal_ancestor_id: DefId,
        span: Span,
    ) -> Module<'a> {
1445
        self.arenas.alloc_module(ModuleData::new(Some(parent), kind, normal_ancestor_id, span))
1446 1447
    }

1448
    fn record_use(&mut self, ident: Ident, ns: Namespace, binding: &'a NameBinding<'a>, span: Span)
1449
                  -> bool /* true if an error was reported */ {
1450
        match binding.kind {
J
Jeffrey Seyfried 已提交
1451 1452
            NameBindingKind::Import { directive, binding, ref used, legacy_self_import }
                    if !used.get() => {
1453
                used.set(true);
1454
                directive.used.set(true);
J
Jeffrey Seyfried 已提交
1455 1456 1457 1458
                if legacy_self_import {
                    self.warn_legacy_self_import(directive);
                    return false;
                }
1459
                self.used_imports.insert((directive.id, ns));
1460 1461
                self.add_to_glob_map(directive.id, ident);
                self.record_use(ident, ns, binding, span)
1462 1463
            }
            NameBindingKind::Import { .. } => false,
1464
            NameBindingKind::Ambiguity { b1, b2, legacy } => {
1465
                self.ambiguity_errors.push(AmbiguityError {
1466
                    span: span, name: ident.name, lexical: false, b1: b1, b2: b2, legacy: legacy,
1467
                });
1468
                if legacy {
A
Alex Crichton 已提交
1469
                    self.record_use(ident, ns, b1, span);
1470 1471
                }
                !legacy
1472 1473
            }
            _ => false
1474
        }
1475
    }
1476

1477
    fn add_to_glob_map(&mut self, id: NodeId, ident: Ident) {
1478
        if self.make_glob_map {
1479
            self.glob_map.entry(id).or_insert_with(FxHashSet).insert(ident.name);
1480
        }
1481 1482
    }

1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496
    /// 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.
    /// }
    /// ```
1497
    ///
1498 1499
    /// Invariant: This must only be called during main resolution, not during
    /// import resolution.
1500
    fn resolve_ident_in_lexical_scope(&mut self,
1501
                                      mut ident: Ident,
1502
                                      ns: Namespace,
1503 1504
                                      record_used: bool,
                                      path_span: Span)
1505
                                      -> Option<LexicalScopeBinding<'a>> {
1506
        if ns == TypeNS {
1507
            ident = ident.unhygienize();
1508
        }
1509

1510
        // Walk backwards up the ribs in scope.
J
Jeffrey Seyfried 已提交
1511 1512
        for i in (0 .. self.ribs[ns].len()).rev() {
            if let Some(def) = self.ribs[ns][i].bindings.get(&ident).cloned() {
1513
                // The ident resolves to a type parameter or local variable.
1514
                return Some(LexicalScopeBinding::Def(
1515
                    self.adjust_local_def(ns, i, def, record_used, path_span)
1516
                ));
1517 1518
            }

J
Jeffrey Seyfried 已提交
1519
            if let ModuleRibKind(module) = self.ribs[ns][i].kind {
1520 1521
                let item = self.resolve_ident_in_module(module, ident, ns, false,
                                                        record_used, path_span);
J
Jeffrey Seyfried 已提交
1522
                if let Ok(binding) = item {
1523 1524
                    // The ident resolves to an item.
                    return Some(LexicalScopeBinding::Item(binding));
1525
                }
1526

J
Jeffrey Seyfried 已提交
1527
                if let ModuleKind::Block(..) = module.kind { // We can see through blocks
1528
                } else if !module.no_implicit_prelude {
J
Jeffrey Seyfried 已提交
1529
                    return self.prelude.and_then(|prelude| {
1530 1531
                        self.resolve_ident_in_module(prelude, ident, ns, false,
                                                     false, path_span).ok()
J
Jeffrey Seyfried 已提交
1532 1533 1534
                    }).map(LexicalScopeBinding::Item)
                } else {
                    return None;
1535
                }
1536
            }
1537

1538
            if let MacroDefinition(def) = self.ribs[ns][i].kind {
1539 1540
                // If an invocation of this macro created `ident`, give up on `ident`
                // and switch to `ident`'s source from the macro definition.
1541 1542 1543
                let ctxt_data = ident.ctxt.data();
                if def == self.macro_defs[&ctxt_data.outer_mark] {
                    ident.ctxt = ctxt_data.prev_ctxt;
1544 1545
                }
            }
1546
        }
1547

1548 1549 1550
        None
    }

1551
    fn resolve_crate_var(&mut self, crate_var_ctxt: SyntaxContext, span: Span) -> Module<'a> {
1552 1553 1554
        let mut ctxt_data = crate_var_ctxt.data();
        while ctxt_data.prev_ctxt != SyntaxContext::empty() {
            ctxt_data = ctxt_data.prev_ctxt.data();
1555
        }
1556
        let module = self.macro_def_scope(ctxt_data.outer_mark, span);
1557 1558 1559
        if module.is_local() { self.graph_root } else { module }
    }

1560 1561
    // AST resolution
    //
1562
    // We maintain a list of value ribs and type ribs.
1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577
    //
    // 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.

1578
    fn with_scope<F>(&mut self, id: NodeId, f: F)
C
corentih 已提交
1579
        where F: FnOnce(&mut Resolver)
J
Jorge Aparicio 已提交
1580
    {
1581
        let id = self.definitions.local_def_id(id);
1582 1583
        let module = self.module_map.get(&id).cloned(); // clones a reference
        if let Some(module) = module {
1584
            // Move down in the graph.
1585
            let orig_module = replace(&mut self.current_module, module);
J
Jeffrey Seyfried 已提交
1586 1587
            self.ribs[ValueNS].push(Rib::new(ModuleRibKind(module)));
            self.ribs[TypeNS].push(Rib::new(ModuleRibKind(module)));
1588

1589
            self.finalize_current_module_macro_resolutions();
1590
            f(self);
1591

1592
            self.current_module = orig_module;
J
Jeffrey Seyfried 已提交
1593 1594
            self.ribs[ValueNS].pop();
            self.ribs[TypeNS].pop();
1595 1596 1597
        } else {
            f(self);
        }
1598 1599
    }

S
Seo Sanghyeon 已提交
1600 1601
    /// Searches the current set of local scopes for labels.
    /// Stops after meeting a closure.
1602
    fn search_label(&self, mut ident: Ident) -> Option<Def> {
1603 1604 1605 1606 1607
        for rib in self.label_ribs.iter().rev() {
            match rib.kind {
                NormalRibKind => {
                    // Continue
                }
1608
                MacroDefinition(def) => {
1609 1610
                    // If an invocation of this macro created `ident`, give up on `ident`
                    // and switch to `ident`'s source from the macro definition.
1611 1612 1613
                    let ctxt_data = ident.ctxt.data();
                    if def == self.macro_defs[&ctxt_data.outer_mark] {
                        ident.ctxt = ctxt_data.prev_ctxt;
1614 1615
                    }
                }
1616 1617
                _ => {
                    // Do not resolve labels across function boundary
C
corentih 已提交
1618
                    return None;
1619 1620
                }
            }
1621
            let result = rib.bindings.get(&ident).cloned();
S
Seo Sanghyeon 已提交
1622
            if result.is_some() {
C
corentih 已提交
1623
                return result;
1624 1625 1626 1627 1628
            }
        }
        None
    }

1629
    fn resolve_item(&mut self, item: &Item) {
1630
        let name = item.ident.name;
1631

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

1634 1635
        self.check_proc_macro_attrs(&item.attrs);

1636
        match item.node {
1637 1638
            ItemKind::Enum(_, ref generics) |
            ItemKind::Ty(_, ref generics) |
1639
            ItemKind::Struct(_, ref generics) |
1640
            ItemKind::Union(_, ref generics) |
V
Vadim Petrochenkov 已提交
1641
            ItemKind::Fn(.., ref generics, _) => {
1642
                self.with_type_parameter_rib(HasTypeParameters(generics, ItemRibKind),
1643
                                             |this| visit::walk_item(this, item));
1644 1645
            }

1646
            ItemKind::DefaultImpl(_, ref trait_ref) => {
1647 1648 1649 1650
                self.with_optional_trait_ref(Some(trait_ref), |this, _| {
                    // Resolve type arguments in trait path
                    visit::walk_trait_ref(this, trait_ref);
                });
1651
            }
V
Vadim Petrochenkov 已提交
1652
            ItemKind::Impl(.., ref generics, ref opt_trait_ref, ref self_type, ref impl_items) =>
1653
                self.resolve_implementation(generics,
1654
                                            opt_trait_ref,
J
Jonas Schievink 已提交
1655
                                            &self_type,
1656
                                            item.id,
1657
                                            impl_items),
1658

1659
            ItemKind::Trait(_, ref generics, ref bounds, ref trait_items) => {
1660
                // Create a new rib for the trait-wide type parameters.
1661
                self.with_type_parameter_rib(HasTypeParameters(generics, ItemRibKind), |this| {
1662
                    let local_def_id = this.definitions.local_def_id(item.id);
1663
                    this.with_self_rib(Def::SelfTy(Some(local_def_id), None), |this| {
1664
                        this.visit_generics(generics);
1665
                        walk_list!(this, visit_ty_param_bound, bounds);
1666 1667

                        for trait_item in trait_items {
1668 1669
                            this.check_proc_macro_attrs(&trait_item.attrs);

1670
                            match trait_item.node {
1671 1672 1673
                                TraitItemKind::Const(ref ty, ref default) => {
                                    this.visit_ty(ty);

1674
                                    // Only impose the restrictions of
1675
                                    // ConstRibKind for an actual constant
1676
                                    // expression in a provided default.
1677
                                    if let Some(ref expr) = *default{
1678
                                        this.with_constant_rib(|this| {
1679
                                            this.visit_expr(expr);
1680 1681 1682
                                        });
                                    }
                                }
1683
                                TraitItemKind::Method(ref sig, _) => {
1684 1685
                                    let type_parameters =
                                        HasTypeParameters(&sig.generics,
V
Vadim Petrochenkov 已提交
1686
                                                          MethodRibKind(!sig.decl.has_self()));
1687
                                    this.with_type_parameter_rib(type_parameters, |this| {
1688
                                        visit::walk_trait_item(this, trait_item)
1689
                                    });
1690
                                }
1691
                                TraitItemKind::Type(..) => {
1692
                                    this.with_type_parameter_rib(NoTypeParameters, |this| {
1693
                                        visit::walk_trait_item(this, trait_item)
1694
                                    });
1695
                                }
1696
                                TraitItemKind::Macro(_) => panic!("unexpanded macro in resolve!"),
1697 1698 1699
                            };
                        }
                    });
1700
                });
1701 1702
            }

1703
            ItemKind::Mod(_) | ItemKind::ForeignMod(_) => {
1704
                self.with_scope(item.id, |this| {
1705
                    visit::walk_item(this, item);
1706
                });
1707 1708
            }

1709 1710 1711 1712 1713 1714 1715
            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);
                    });
1716
                });
1717
            }
1718

1719
            ItemKind::Use(ref view_path) => {
1720
                match view_path.node {
1721 1722 1723
                    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);
1724 1725
                    }
                    _ => {}
W
we 已提交
1726 1727 1728
                }
            }

1729
            ItemKind::ExternCrate(_) | ItemKind::MacroDef(..) | ItemKind::GlobalAsm(_)=> {
1730
                // do nothing, these are just around to be encoded
1731
            }
1732 1733

            ItemKind::Mac(_) => panic!("unexpanded macro in resolve!"),
1734 1735 1736
        }
    }

1737
    fn with_type_parameter_rib<'b, F>(&'b mut self, type_parameters: TypeParameters<'a, 'b>, f: F)
C
corentih 已提交
1738
        where F: FnOnce(&mut Resolver)
J
Jorge Aparicio 已提交
1739
    {
1740
        match type_parameters {
1741
            HasTypeParameters(generics, rib_kind) => {
1742
                let mut function_type_rib = Rib::new(rib_kind);
1743
                let mut seen_bindings = FxHashMap();
1744
                for type_parameter in &generics.ty_params {
1745
                    let name = type_parameter.ident.name;
1746
                    debug!("with_type_parameter_rib: {}", type_parameter.id);
1747

C
Chris Stankus 已提交
1748 1749
                    if seen_bindings.contains_key(&name) {
                        let span = seen_bindings.get(&name).unwrap();
1750 1751
                        resolve_error(self,
                                      type_parameter.span,
C
Chris Stankus 已提交
1752 1753
                                      ResolutionError::NameAlreadyUsedInTypeParameterList(name,
                                                                                          span));
1754
                    }
C
Chris Stankus 已提交
1755
                    seen_bindings.entry(name).or_insert(type_parameter.span);
1756

1757
                    // plain insert (no renaming)
1758
                    let def_id = self.definitions.local_def_id(type_parameter.id);
1759
                    let def = Def::TyParam(def_id);
1760
                    function_type_rib.bindings.insert(Ident::with_empty_ctxt(name), def);
1761
                    self.record_def(type_parameter.id, PathResolution::new(def));
1762
                }
J
Jeffrey Seyfried 已提交
1763
                self.ribs[TypeNS].push(function_type_rib);
1764 1765
            }

B
Brian Anderson 已提交
1766
            NoTypeParameters => {
1767 1768 1769 1770
                // Nothing to do.
            }
        }

A
Alex Crichton 已提交
1771
        f(self);
1772

J
Jeffrey Seyfried 已提交
1773
        if let HasTypeParameters(..) = type_parameters {
J
Jeffrey Seyfried 已提交
1774
            self.ribs[TypeNS].pop();
1775 1776 1777
        }
    }

C
corentih 已提交
1778 1779
    fn with_label_rib<F>(&mut self, f: F)
        where F: FnOnce(&mut Resolver)
J
Jorge Aparicio 已提交
1780
    {
1781
        self.label_ribs.push(Rib::new(NormalRibKind));
A
Alex Crichton 已提交
1782
        f(self);
J
Jeffrey Seyfried 已提交
1783
        self.label_ribs.pop();
1784
    }
1785

1786 1787 1788 1789 1790 1791 1792 1793 1794 1795
    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 已提交
1796 1797
    fn with_constant_rib<F>(&mut self, f: F)
        where F: FnOnce(&mut Resolver)
J
Jorge Aparicio 已提交
1798
    {
J
Jeffrey Seyfried 已提交
1799
        self.ribs[ValueNS].push(Rib::new(ConstantItemRibKind));
A
Alex Crichton 已提交
1800
        f(self);
J
Jeffrey Seyfried 已提交
1801
        self.ribs[ValueNS].pop();
1802 1803
    }

1804 1805
    fn with_current_self_type<T, F>(&mut self, self_type: &Ty, f: F) -> T
        where F: FnOnce(&mut Resolver) -> T
J
Jorge Aparicio 已提交
1806
    {
1807 1808 1809 1810 1811 1812 1813
        // 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
    }

1814
    fn with_optional_trait_ref<T, F>(&mut self, opt_trait_ref: Option<&TraitRef>, f: F) -> T
1815
        where F: FnOnce(&mut Resolver, Option<DefId>) -> T
J
Jorge Aparicio 已提交
1816
    {
1817
        let mut new_val = None;
1818
        let mut new_id = None;
E
Eduard Burtescu 已提交
1819
        if let Some(trait_ref) = opt_trait_ref {
1820
            let def = self.smart_resolve_path(trait_ref.ref_id, None,
1821
                                              &trait_ref.path, PathSource::Trait).base_def();
1822 1823 1824
            if def != Def::Err {
                new_val = Some((def.def_id(), trait_ref.clone()));
                new_id = Some(def.def_id());
1825
            }
1826
        }
1827
        let original_trait_ref = replace(&mut self.current_trait_ref, new_val);
1828
        let result = f(self, new_id);
1829 1830 1831 1832
        self.current_trait_ref = original_trait_ref;
        result
    }

1833 1834 1835 1836 1837 1838
    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....)
1839
        self_type_rib.bindings.insert(keywords::SelfType.ident(), self_def);
J
Jeffrey Seyfried 已提交
1840
        self.ribs[TypeNS].push(self_type_rib);
1841
        f(self);
J
Jeffrey Seyfried 已提交
1842
        self.ribs[TypeNS].pop();
1843 1844
    }

F
Felix S. Klock II 已提交
1845
    fn resolve_implementation(&mut self,
1846 1847 1848
                              generics: &Generics,
                              opt_trait_reference: &Option<TraitRef>,
                              self_type: &Ty,
1849
                              item_id: NodeId,
1850
                              impl_items: &[ImplItem]) {
1851
        // If applicable, create a rib for the type parameters.
1852
        self.with_type_parameter_rib(HasTypeParameters(generics, ItemRibKind), |this| {
1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878
            // 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
                                        this.check_trait_item(impl_item.ident.name,
                                                            ValueNS,
                                                            impl_item.span,
                                            |n, s| ResolutionError::ConstNotMemberOfTrait(n, s));
1879
                                        visit::walk_impl_item(this, impl_item);
1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909
                                    }
                                    ImplItemKind::Method(ref sig, _) => {
                                        // If this is a trait impl, ensure the method
                                        // exists in trait
                                        this.check_trait_item(impl_item.ident.name,
                                                            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
                                        this.check_trait_item(impl_item.ident.name,
                                                            TypeNS,
                                                            impl_item.span,
                                            |n, s| ResolutionError::TypeNotMemberOfTrait(n, s));

                                        this.visit_ty(ty);
                                    }
                                    ImplItemKind::Macro(_) =>
                                        panic!("unexpanded macro in resolve!"),
1910
                                }
1911
                            }
1912
                        });
1913
                    });
1914
                });
1915
            });
1916
        });
1917 1918
    }

1919
    fn check_trait_item<F>(&self, name: Name, ns: Namespace, span: Span, err: F)
C
corentih 已提交
1920 1921 1922 1923
        where F: FnOnce(Name, &str) -> ResolutionError
    {
        // If there is a TraitRef in scope for an impl, then the method must be in the
        // trait.
1924
        if let Some((did, ref trait_ref)) = self.current_trait_ref {
1925 1926
            if !self.trait_item_map.contains_key(&(did, name, ns)) {
                let path_str = path_names_to_string(&trait_ref.path);
J
Jonas Schievink 已提交
1927
                resolve_error(self, span, err(name, &path_str));
1928 1929 1930 1931
            }
        }
    }

E
Eduard Burtescu 已提交
1932
    fn resolve_local(&mut self, local: &Local) {
1933
        // Resolve the type.
1934
        walk_list!(self, visit_ty, &local.ty);
1935

1936
        // Resolve the initializer.
1937
        walk_list!(self, visit_expr, &local.init);
1938 1939

        // Resolve the pattern.
1940
        self.resolve_pattern(&local.pat, PatternSource::Let, &mut FxHashMap());
1941 1942
    }

J
John Clements 已提交
1943 1944 1945 1946
    // 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 已提交
1947
    fn binding_mode_map(&mut self, pat: &Pat) -> BindingMap {
1948
        let mut binding_map = FxHashMap();
1949 1950 1951

        pat.walk(&mut |pat| {
            if let PatKind::Ident(binding_mode, ident, ref sub_pat) = pat.node {
1952 1953
                if sub_pat.is_some() || match self.def_map.get(&pat.id).map(|res| res.base_def()) {
                    Some(Def::Local(..)) => true,
1954 1955 1956
                    _ => false,
                } {
                    let binding_info = BindingInfo { span: ident.span, binding_mode: binding_mode };
1957
                    binding_map.insert(ident.node, binding_info);
1958 1959 1960
                }
            }
            true
1961
        });
1962 1963

        binding_map
1964 1965
    }

J
John Clements 已提交
1966 1967
    // 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 已提交
1968
    fn check_consistent_bindings(&mut self, arm: &Arm) {
1969
        if arm.pats.is_empty() {
C
corentih 已提交
1970
            return;
1971
        }
1972 1973 1974

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

1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
            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,
1990 1991
                                origin: BTreeSet::new(),
                                target: BTreeSet::new(),
1992 1993 1994
                            });
                        binding_error.origin.insert(binding_i.span);
                        binding_error.target.insert(q.span);
C
corentih 已提交
1995
                    }
1996 1997 1998 1999 2000 2001 2002
                    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,
2003 2004
                                        origin: BTreeSet::new(),
                                        target: BTreeSet::new(),
2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
                                    });
                                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 已提交
2016
                        }
2017
                    }
2018 2019
                }
            }
2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031
        }
        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));
2032
        }
2033 2034
    }

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

2038
        let mut bindings_list = FxHashMap();
2039
        for pattern in &arm.pats {
2040
            self.resolve_pattern(&pattern, PatternSource::Match, &mut bindings_list);
2041 2042
        }

2043 2044 2045 2046
        // This has to happen *after* we determine which
        // pat_idents are variants
        self.check_consistent_bindings(arm);

2047
        walk_list!(self, visit_expr, &arm.guard);
J
Jonas Schievink 已提交
2048
        self.visit_expr(&arm.body);
2049

J
Jeffrey Seyfried 已提交
2050
        self.ribs[ValueNS].pop();
2051 2052
    }

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

2059
        let mut num_macro_definition_ribs = 0;
2060 2061
        if let Some(anonymous_module) = anonymous_module {
            debug!("(resolving block) found anonymous module, moving down");
J
Jeffrey Seyfried 已提交
2062 2063
            self.ribs[ValueNS].push(Rib::new(ModuleRibKind(anonymous_module)));
            self.ribs[TypeNS].push(Rib::new(ModuleRibKind(anonymous_module)));
2064
            self.current_module = anonymous_module;
2065
            self.finalize_current_module_macro_resolutions();
2066
        } else {
J
Jeffrey Seyfried 已提交
2067
            self.ribs[ValueNS].push(Rib::new(NormalRibKind));
2068 2069 2070
        }

        // Descend into the block.
2071
        for stmt in &block.stmts {
2072
            if let ast::StmtKind::Item(ref item) = stmt.node {
2073
                if let ast::ItemKind::MacroDef(..) = item.node {
2074
                    num_macro_definition_ribs += 1;
2075 2076 2077
                    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)));
2078 2079 2080 2081 2082
                }
            }

            self.visit_stmt(stmt);
        }
2083 2084

        // Move back up.
J
Jeffrey Seyfried 已提交
2085
        self.current_module = orig_module;
2086
        for _ in 0 .. num_macro_definition_ribs {
J
Jeffrey Seyfried 已提交
2087
            self.ribs[ValueNS].pop();
2088
            self.label_ribs.pop();
2089
        }
J
Jeffrey Seyfried 已提交
2090
        self.ribs[ValueNS].pop();
J
Jeffrey Seyfried 已提交
2091
        if let Some(_) = anonymous_module {
J
Jeffrey Seyfried 已提交
2092
            self.ribs[TypeNS].pop();
G
Garming Sam 已提交
2093
        }
2094
        debug!("(resolving block) leaving block");
2095 2096
    }

2097
    fn fresh_binding(&mut self,
J
Jeffrey Seyfried 已提交
2098
                     ident: &SpannedIdent,
2099 2100 2101
                     pat_id: NodeId,
                     outer_pat_id: NodeId,
                     pat_src: PatternSource,
2102
                     bindings: &mut FxHashMap<Ident, NodeId>)
2103 2104
                     -> PathResolution {
        // Add the binding to the local ribs, if it
2105 2106
        // doesn't already exist in the bindings map. (We
        // must not add it if it's in the bindings map
2107 2108
        // because that breaks the assumptions later
        // passes make about or-patterns.)
2109
        let mut def = Def::Local(self.definitions.local_def_id(pat_id));
2110
        match bindings.get(&ident.node).cloned() {
2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129
            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 => {
2130 2131
                // `Variant1(a) | Variant2(a)`, ok
                // Reuse definition from the first `a`.
J
Jeffrey Seyfried 已提交
2132
                def = self.ribs[ValueNS].last_mut().unwrap().bindings[&ident.node];
2133 2134 2135 2136 2137 2138
            }
            Some(..) => {
                span_bug!(ident.span, "two bindings with the same name from \
                                       unexpected pattern source {:?}", pat_src);
            }
            None => {
2139
                // A completely fresh binding, add to the lists if it's valid.
2140
                if ident.node.name != keywords::Invalid.name() {
2141
                    bindings.insert(ident.node, outer_pat_id);
J
Jeffrey Seyfried 已提交
2142
                    self.ribs[ValueNS].last_mut().unwrap().bindings.insert(ident.node, def);
2143
                }
2144
            }
2145
        }
2146

2147
        PathResolution::new(def)
2148
    }
2149

2150 2151 2152 2153 2154
    fn resolve_pattern(&mut self,
                       pat: &Pat,
                       pat_src: PatternSource,
                       // Maps idents to the node ID for the
                       // outermost pattern that binds them.
2155
                       bindings: &mut FxHashMap<Ident, NodeId>) {
2156
        // Visit all direct subpatterns of this pattern.
2157 2158 2159 2160 2161 2162
        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.
2163 2164
                    let binding = self.resolve_ident_in_lexical_scope(ident.node, ValueNS,
                                                                      false, pat.span)
2165
                                      .and_then(LexicalScopeBinding::item);
2166
                    let resolution = binding.map(NameBinding::def).and_then(|def| {
2167 2168
                        let always_binding = !pat_src.is_refutable() || opt_pat.is_some() ||
                                             bmode != BindingMode::ByValue(Mutability::Immutable);
2169
                        match def {
2170 2171 2172 2173
                            Def::StructCtor(_, CtorKind::Const) |
                            Def::VariantCtor(_, CtorKind::Const) |
                            Def::Const(..) if !always_binding => {
                                // A unit struct/variant or constant pattern.
2174
                                self.record_use(ident.node, ValueNS, binding.unwrap(), ident.span);
2175
                                Some(PathResolution::new(def))
2176
                            }
2177
                            Def::StructCtor(..) | Def::VariantCtor(..) |
2178
                            Def::Const(..) | Def::Static(..) => {
2179
                                // A fresh binding that shadows something unacceptable.
2180
                                resolve_error(
2181
                                    self,
2182 2183
                                    ident.span,
                                    ResolutionError::BindingShadowsSomethingUnacceptable(
2184
                                        pat_src.descr(), ident.node.name, binding.unwrap())
2185
                                );
2186
                                None
2187
                            }
2188
                            Def::Local(..) | Def::Upvar(..) | Def::Fn(..) | Def::Err => {
2189 2190
                                // These entities are explicitly allowed
                                // to be shadowed by fresh bindings.
2191
                                None
2192 2193 2194
                            }
                            def => {
                                span_bug!(ident.span, "unexpected definition for an \
2195
                                                       identifier in pattern: {:?}", def);
2196
                            }
2197
                        }
2198
                    }).unwrap_or_else(|| {
2199
                        self.fresh_binding(ident, pat.id, outer_pat_id, pat_src, bindings)
2200
                    });
2201 2202

                    self.record_def(pat.id, resolution);
2203 2204
                }

2205
                PatKind::TupleStruct(ref path, ..) => {
2206
                    self.smart_resolve_path(pat.id, None, path, PathSource::TupleStruct);
2207 2208
                }

2209
                PatKind::Path(ref qself, ref path) => {
2210
                    self.smart_resolve_path(pat.id, qself.as_ref(), path, PathSource::Pat);
2211 2212
                }

V
Vadim Petrochenkov 已提交
2213
                PatKind::Struct(ref path, ..) => {
2214
                    self.smart_resolve_path(pat.id, None, path, PathSource::Struct);
2215
                }
2216 2217

                _ => {}
2218
            }
2219
            true
2220
        });
2221

2222
        visit::walk_pat(self, pat);
2223 2224
    }

2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236
    // 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<_>>();
2237 2238
        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)
2239 2240 2241
    }

    fn smart_resolve_path_fragment(&mut self,
2242
                                   id: NodeId,
2243 2244 2245
                                   qself: Option<&QSelf>,
                                   path: &[Ident],
                                   span: Span,
2246
                                   ident_span: Span,
2247 2248 2249 2250
                                   source: PathSource)
                                   -> PathResolution {
        let ns = source.namespace();
        let is_expected = &|def| source.is_expected(def);
2251
        let is_enum_variant = &|def| if let Def::Variant(..) = def { true } else { false };
2252 2253 2254 2255 2256 2257 2258

        // 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());
2259
            let (base_msg, fallback_label, base_span) = if let Some(def) = def {
2260
                (format!("expected {}, found {} `{}`", expected, def.kind_name(), path_str),
2261
                 format!("not a {}", expected), span)
2262
            } else {
2263 2264 2265 2266 2267 2268 2269
                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];
2270
                    let mod_prefix = match this.resolve_path(mod_path, Some(TypeNS), false, span) {
2271 2272 2273 2274 2275 2276
                        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),
2277
                 format!("not found in {}", mod_str), ident_span)
2278
            };
2279
            let mut err = this.session.struct_span_err_with_code(base_span, &base_msg, code);
2280 2281 2282 2283 2284

            // Emit special messages for unresolved `Self` and `self`.
            if is_self_type(path, ns) {
                __diagnostic_used!(E0411);
                err.code("E0411".into());
2285
                err.span_label(span, "`Self` is only available in traits and impls");
2286 2287 2288 2289 2290
                return err;
            }
            if is_self_value(path, ns) {
                __diagnostic_used!(E0424);
                err.code("E0424".into());
2291
                err.span_label(span, format!("`self` value is only available in \
2292 2293 2294 2295 2296 2297 2298 2299
                                               methods with `self` parameter"));
                return err;
            }

            // Try to lookup the name in more relaxed fashion for better error reporting.
            let name = path.last().unwrap().name;
            let candidates = this.lookup_import_candidates(name, ns, is_expected);
            if !candidates.is_empty() {
2300 2301
                let mut module_span = this.current_module.span;
                module_span.hi = module_span.lo;
2302
                // Report import candidates as help and proceed searching for labels.
2303
                show_candidates(&mut err, module_span, &candidates, def.is_some());
2304 2305
            } else if is_expected(Def::Enum(DefId::local(CRATE_DEF_INDEX))) {
                let enum_candidates = this.lookup_import_candidates(name, ns, is_enum_variant);
E
Esteban Küber 已提交
2306 2307 2308 2309
                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 {
2310 2311 2312
                    let msg = format!("there is an enum variant `{}`, did you mean to use `{}`?",
                                      variant_path,
                                      enum_path);
E
Esteban Küber 已提交
2313
                    if sp == DUMMY_SP {
2314 2315
                        err.help(&msg);
                    } else {
E
Esteban Küber 已提交
2316
                        err.span_help(sp, &msg);
2317 2318
                    }
                }
2319
            }
2320
            if path.len() == 1 && this.self_type_is_available(span) {
2321
                if let Some(candidate) = this.lookup_assoc_candidate(name, ns, is_expected) {
2322
                    let self_is_available = this.self_value_is_available(path[0].ctxt, span);
2323 2324
                    match candidate {
                        AssocSuggestion::Field => {
2325
                            err.span_label(span, format!("did you mean `self.{}`?", path_str));
2326
                            if !self_is_available {
2327
                                err.span_label(span, format!("`self` value is only available in \
2328 2329 2330 2331
                                                               methods with `self` parameter"));
                            }
                        }
                        AssocSuggestion::MethodWithSelf if self_is_available => {
2332
                            err.span_label(span, format!("did you mean `self.{}(...)`?",
2333 2334 2335
                                                           path_str));
                        }
                        AssocSuggestion::MethodWithSelf | AssocSuggestion::AssocItem => {
2336
                            err.span_label(span, format!("did you mean `Self::{}`?", path_str));
2337 2338 2339 2340 2341 2342
                        }
                    }
                    return err;
                }
            }

2343 2344 2345
            let mut levenshtein_worked = false;

            // Try Levenshtein.
2346
            if let Some(candidate) = this.lookup_typo_candidate(path, ns, is_expected, span) {
2347
                err.span_label(ident_span, format!("did you mean `{}`?", candidate));
2348 2349 2350
                levenshtein_worked = true;
            }

2351 2352 2353 2354
            // Try context dependent help if relaxed lookup didn't work.
            if let Some(def) = def {
                match (def, source) {
                    (Def::Macro(..), _) => {
2355
                        err.span_label(span, format!("did you mean `{}!(...)`?", path_str));
2356 2357 2358
                        return err;
                    }
                    (Def::TyAlias(..), PathSource::Trait) => {
2359
                        err.span_label(span, "type aliases cannot be used for traits");
2360 2361
                        return err;
                    }
2362
                    (Def::Mod(..), PathSource::Expr(Some(parent))) => match parent.node {
2363
                        ExprKind::Field(_, ident) => {
2364
                            err.span_label(parent.span, format!("did you mean `{}::{}`?",
2365
                                                                 path_str, ident.node));
2366 2367 2368
                            return err;
                        }
                        ExprKind::MethodCall(ident, ..) => {
2369
                            err.span_label(parent.span, format!("did you mean `{}::{}(...)`?",
2370
                                                                 path_str, ident.node));
2371 2372 2373 2374 2375
                            return err;
                        }
                        _ => {}
                    },
                    _ if ns == ValueNS && is_struct_like(def) => {
2376 2377 2378 2379
                        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) {
2380
                                    err.span_label(span, format!("constructor is not visible \
2381 2382 2383 2384
                                                                   here due to private fields"));
                                }
                            }
                        }
2385
                        err.span_label(span, format!("did you mean `{} {{ /* fields */ }}`?",
2386 2387 2388 2389 2390 2391 2392
                                                       path_str));
                        return err;
                    }
                    _ => {}
                }
            }

2393
            // Fallback label.
2394
            if !levenshtein_worked {
2395
                err.span_label(base_span, fallback_label);
2396
            }
2397 2398 2399 2400 2401 2402 2403 2404 2405 2406
            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()) {
2407 2408
            Some(resolution) if resolution.unresolved_segments() == 0 => {
                if is_expected(resolution.base_def()) || resolution.base_def() == Def::Err {
2409 2410
                    resolution
                } else {
2411 2412 2413
                    // Add a temporary hack to smooth the transition to new struct ctor
                    // visibility rules. See #38932 for more details.
                    let mut res = None;
2414
                    if let Def::Struct(def_id) = resolution.base_def() {
2415
                        if let Some((ctor_def, ctor_vis))
2416
                                = self.struct_constructors.get(&def_id).cloned() {
2417 2418 2419 2420 2421 2422 2423 2424 2425 2426
                            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));
                            }
                        }
                    }

2427
                    res.unwrap_or_else(|| report_errors(self, Some(resolution.base_def())))
2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450
                }
            }
            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 {
                    let item_name = path.last().unwrap().name;
                    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
    }

2451 2452 2453
    fn self_type_is_available(&mut self, span: Span) -> bool {
        let binding = self.resolve_ident_in_lexical_scope(keywords::SelfType.ident(),
                                                          TypeNS, false, span);
2454 2455 2456
        if let Some(LexicalScopeBinding::Def(def)) = binding { def != Def::Err } else { false }
    }

2457
    fn self_value_is_available(&mut self, ctxt: SyntaxContext, span: Span) -> bool {
2458
        let ident = Ident { name: keywords::SelfValue.name(), ctxt: ctxt };
2459
        let binding = self.resolve_ident_in_lexical_scope(ident, ValueNS, false, span);
2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480
        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.
2481 2482
                    Some(res) if res.unresolved_segments() == 0 || defer_to_typeck =>
                        return Some(res),
2483 2484 2485 2486
                    res => if fin_res.is_none() { fin_res = res },
                };
            }
        }
J
Jeffrey Seyfried 已提交
2487
        let is_global = self.global_macros.get(&path[0].name).cloned()
2488
            .map(|binding| binding.get_macro(self).kind() == MacroKind::Bang).unwrap_or(false);
J
Jeffrey Seyfried 已提交
2489
        if primary_ns != MacroNS && (is_global || self.macro_names.contains(&path[0].name)) {
2490
            // Return some dummy definition, it's enough for error reporting.
J
Josh Driver 已提交
2491 2492 2493
            return Some(
                PathResolution::new(Def::Macro(DefId::local(CRATE_DEF_INDEX), MacroKind::Bang))
            );
2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507
        }
        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 已提交
2508 2509
            if qself.position == 0 {
                // FIXME: Create some fake resolution that can't possibly be a type.
2510 2511 2512
                return Some(PathResolution::with_unresolved_segments(
                    Def::Mod(DefId::local(CRATE_DEF_INDEX)), path.len()
                ));
2513
            }
2514 2515
            // 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 };
2516
            let res = self.smart_resolve_path_fragment(id, None, &path[..qself.position + 1],
2517
                                                       span, span, PathSource::TraitItem(ns));
2518 2519 2520
            return Some(PathResolution::with_unresolved_segments(
                res.base_def(), res.unresolved_segments() + path.len() - qself.position - 1
            ));
2521 2522
        }

2523
        let result = match self.resolve_path(&path, Some(ns), true, span) {
2524
            PathResult::NonModule(path_res) => path_res,
J
Jeffrey Seyfried 已提交
2525 2526
            PathResult::Module(module) if !module.is_normal() => {
                PathResolution::new(module.def().unwrap())
V
Cleanup  
Vadim Petrochenkov 已提交
2527
            }
2528 2529 2530 2531 2532 2533
            // 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 已提交
2534 2535
            //     u8::max_value() // OK, resolves to associated function <u8>::max_value,
            //                     // not to non-existent std::u8::max_value
2536 2537 2538 2539
            // }
            //
            // Such behavior is required for backward compatibility.
            // The same fallback is used when `a` resolves to nothing.
2540
            PathResult::Module(..) | PathResult::Failed(..)
2541
                    if (ns == TypeNS || path.len() > 1) &&
2542
                       self.primitive_type_table.primitive_types.contains_key(&path[0].name) => {
2543 2544 2545
                let prim = self.primitive_type_table.primitive_types[&path[0].name];
                match prim {
                    TyUint(UintTy::U128) | TyInt(IntTy::I128) => {
S
Simonas Kazlauskas 已提交
2546 2547
                        if !self.session.features.borrow().i128_type {
                            emit_feature_err(&self.session.parse_sess,
2548 2549 2550 2551 2552 2553 2554
                                                "i128_type", span, GateIssue::Language,
                                                "128-bit type is unstable");

                        }
                    }
                    _ => {}
                }
2555
                PathResolution::with_unresolved_segments(Def::PrimTy(prim), path.len() - 1)
J
Jeffrey Seyfried 已提交
2556 2557 2558 2559 2560 2561
            }
            PathResult::Module(module) => PathResolution::new(module.def().unwrap()),
            PathResult::Failed(msg, false) => {
                resolve_error(self, span, ResolutionError::FailedToResolve(&msg));
                err_path_resolution()
            }
2562 2563
            PathResult::Failed(..) => return None,
            PathResult::Indeterminate => bug!("indetermined path result in resolve_qpath"),
J
Jeffrey Seyfried 已提交
2564 2565
        };

2566
        if path.len() > 1 && !global_by_default && result.base_def() != Def::Err &&
2567 2568
           path[0].name != keywords::CrateRoot.name() && path[0].name != "$crate" {
            let unqualified_result = {
2569
                match self.resolve_path(&[*path.last().unwrap()], Some(ns), false, span) {
2570
                    PathResult::NonModule(path_res) => path_res.base_def(),
2571 2572 2573 2574
                    PathResult::Module(module) => module.def().unwrap(),
                    _ => return Some(result),
                }
            };
2575
            if result.base_def() == unqualified_result {
2576 2577
                let lint = lint::builtin::UNUSED_QUALIFICATIONS;
                self.session.add_lint(lint, id, span, "unnecessary qualification".to_string());
N
Nick Cameron 已提交
2578
            }
2579
        }
N
Nick Cameron 已提交
2580

J
Jeffrey Seyfried 已提交
2581
        Some(result)
2582 2583
    }

J
Jeffrey Seyfried 已提交
2584 2585 2586
    fn resolve_path(&mut self,
                    path: &[Ident],
                    opt_ns: Option<Namespace>, // `None` indicates a module path
2587 2588
                    record_used: bool,
                    path_span: Span)
J
Jeffrey Seyfried 已提交
2589
                    -> PathResult<'a> {
2590 2591
        let mut module = None;
        let mut allow_super = true;
J
Jeffrey Seyfried 已提交
2592 2593 2594 2595 2596

        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 };

2597
            if i == 0 && ns == TypeNS && ident.name == keywords::SelfValue.name() {
2598
                module = Some(self.module_map[&self.current_module.normal_ancestor_id]);
J
Jeffrey Seyfried 已提交
2599 2600 2601
                continue
            } else if allow_super && ns == TypeNS && ident.name == keywords::Super.name() {
                let current_module = if i == 0 { self.current_module } else { module.unwrap() };
2602
                let self_module = self.module_map[&current_module.normal_ancestor_id];
J
Jeffrey Seyfried 已提交
2603
                if let Some(parent) = self_module.parent {
2604
                    module = Some(self.module_map[&parent.normal_ancestor_id]);
J
Jeffrey Seyfried 已提交
2605 2606 2607 2608 2609 2610 2611 2612
                    continue
                } else {
                    let msg = "There are too many initial `super`s.".to_string();
                    return PathResult::Failed(msg, false);
                }
            }
            allow_super = false;

2613 2614 2615 2616
            if i == 0 && ns == TypeNS && ident.name == keywords::CrateRoot.name() {
                module = Some(self.graph_root);
                continue
            } else if i == 0 && ns == TypeNS && ident.name == "$crate" {
2617
                module = Some(self.resolve_crate_var(ident.ctxt, path_span));
2618 2619 2620
                continue
            }

J
Jeffrey Seyfried 已提交
2621
            let binding = if let Some(module) = module {
2622
                self.resolve_ident_in_module(module, ident, ns, false, record_used, path_span)
2623
            } else if opt_ns == Some(MacroNS) {
2624
                self.resolve_lexical_macro_path_segment(ident, ns, record_used, path_span)
2625
                    .map(MacroBinding::binding)
J
Jeffrey Seyfried 已提交
2626
            } else {
2627
                match self.resolve_ident_in_lexical_scope(ident, ns, record_used, path_span) {
J
Jeffrey Seyfried 已提交
2628
                    Some(LexicalScopeBinding::Item(binding)) => Ok(binding),
2629 2630
                    Some(LexicalScopeBinding::Def(def))
                            if opt_ns == Some(TypeNS) || opt_ns == Some(ValueNS) => {
2631 2632 2633
                        return PathResult::NonModule(PathResolution::with_unresolved_segments(
                            def, path.len() - 1
                        ));
J
Jeffrey Seyfried 已提交
2634
                    }
2635
                    _ => Err(if record_used { Determined } else { Undetermined }),
J
Jeffrey Seyfried 已提交
2636 2637 2638 2639 2640
                }
            };

            match binding {
                Ok(binding) => {
2641 2642
                    let def = binding.def();
                    let maybe_assoc = opt_ns != Some(MacroNS) && PathSource::Type.is_expected(def);
J
Jeffrey Seyfried 已提交
2643
                    if let Some(next_module) = binding.module() {
J
Jeffrey Seyfried 已提交
2644
                        module = Some(next_module);
2645
                    } else if def == Def::Err {
J
Jeffrey Seyfried 已提交
2646
                        return PathResult::NonModule(err_path_resolution());
2647
                    } else if opt_ns.is_some() && (is_last || maybe_assoc) {
2648 2649 2650
                        return PathResult::NonModule(PathResolution::with_unresolved_segments(
                            def, path.len() - i - 1
                        ));
J
Jeffrey Seyfried 已提交
2651 2652 2653 2654 2655 2656 2657 2658
                    } 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() {
2659 2660 2661
                            return PathResult::NonModule(PathResolution::with_unresolved_segments(
                                module.def().unwrap(), path.len() - i
                            ));
J
Jeffrey Seyfried 已提交
2662 2663
                        }
                    }
2664
                    let msg = if module.and_then(ModuleData::def) == self.graph_root.def() {
J
Jeffrey Seyfried 已提交
2665 2666
                        let is_mod = |def| match def { Def::Mod(..) => true, _ => false };
                        let mut candidates =
2667 2668
                            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 已提交
2669
                        if let Some(candidate) = candidates.get(0) {
2670
                            format!("Did you mean `{}`?", candidate.path)
J
Jeffrey Seyfried 已提交
2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681
                        } 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);
                }
            }
2682 2683
        }

2684
        PathResult::Module(module.unwrap_or(self.graph_root))
2685 2686 2687
    }

    // Resolve a local definition, potentially adjusting for closures.
2688 2689 2690 2691
    fn adjust_local_def(&mut self,
                        ns: Namespace,
                        rib_index: usize,
                        mut def: Def,
2692 2693
                        record_used: bool,
                        span: Span) -> Def {
2694 2695 2696 2697
        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 {
2698
            if record_used {
2699 2700 2701 2702 2703 2704 2705
                resolve_error(self, span,
                        ResolutionError::ForwardDeclaredTyParam);
            }
            assert_eq!(def, Def::Err);
            return Def::Err;
        }

2706
        match def {
2707
            Def::Upvar(..) => {
2708
                span_bug!(span, "unexpected {:?} in bindings", def)
2709
            }
2710
            Def::Local(def_id) => {
2711 2712
                for rib in ribs {
                    match rib.kind {
2713 2714
                        NormalRibKind | ModuleRibKind(..) | MacroDefinition(..) |
                        ForwardTyParamBanRibKind => {
2715 2716 2717 2718
                            // Nothing to do. Continue.
                        }
                        ClosureRibKind(function_id) => {
                            let prev_def = def;
2719
                            let node_id = self.definitions.as_local_node_id(def_id).unwrap();
2720

C
corentih 已提交
2721 2722 2723
                            let seen = self.freevars_seen
                                           .entry(function_id)
                                           .or_insert_with(|| NodeMap());
2724
                            if let Some(&index) = seen.get(&node_id) {
2725
                                def = Def::Upvar(def_id, index, function_id);
2726 2727
                                continue;
                            }
C
corentih 已提交
2728 2729 2730
                            let vec = self.freevars
                                          .entry(function_id)
                                          .or_insert_with(|| vec![]);
2731
                            let depth = vec.len();
2732
                            def = Def::Upvar(def_id, depth, function_id);
2733

2734
                            if record_used {
2735 2736 2737 2738 2739 2740
                                vec.push(Freevar {
                                    def: prev_def,
                                    span: span,
                                });
                                seen.insert(node_id, depth);
                            }
2741
                        }
2742
                        ItemRibKind | MethodRibKind(_) => {
2743 2744 2745
                            // This was an attempt to access an upvar inside a
                            // named function item. This is not allowed, so we
                            // report an error.
2746
                            if record_used {
2747 2748 2749
                                resolve_error(self, span,
                                        ResolutionError::CannotCaptureDynamicEnvironmentInFnItem);
                            }
2750
                            return Def::Err;
2751 2752 2753
                        }
                        ConstantItemRibKind => {
                            // Still doesn't deal with upvars
2754
                            if record_used {
2755 2756 2757
                                resolve_error(self, span,
                                        ResolutionError::AttemptToUseNonConstantValueInConstant);
                            }
2758
                            return Def::Err;
2759 2760 2761 2762
                        }
                    }
                }
            }
2763
            Def::TyParam(..) | Def::SelfTy(..) => {
2764 2765
                for rib in ribs {
                    match rib.kind {
2766
                        NormalRibKind | MethodRibKind(_) | ClosureRibKind(..) |
2767 2768
                        ModuleRibKind(..) | MacroDefinition(..) | ForwardTyParamBanRibKind |
                        ConstantItemRibKind => {
2769 2770 2771 2772 2773
                            // Nothing to do. Continue.
                        }
                        ItemRibKind => {
                            // This was an attempt to use a type parameter outside
                            // its scope.
2774
                            if record_used {
2775 2776 2777
                                resolve_error(self, span,
                                              ResolutionError::TypeParametersFromOuterFunction);
                            }
2778
                            return Def::Err;
2779 2780 2781 2782 2783 2784
                        }
                    }
                }
            }
            _ => {}
        }
2785
        return def;
2786 2787
    }

2788 2789
    // 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 已提交
2790
    // FIXME #34673: This needs testing.
2791 2792 2793 2794
    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 已提交
2795 2796
            this.ribs[ValueNS].push(Rib::new(ModuleRibKind(module)));
            this.ribs[TypeNS].push(Rib::new(ModuleRibKind(module)));
2797 2798 2799 2800 2801 2802 2803
            f(this)
        })
    }

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

        let result = f(self);
J
Jeffrey Seyfried 已提交
2808
        self.ribs = ribs;
2809 2810 2811 2812
        self.label_ribs = label_ribs;
        result
    }

2813 2814 2815 2816 2817 2818 2819
    fn lookup_assoc_candidate<FilterFn>(&mut self,
                                        name: Name,
                                        ns: Namespace,
                                        filter_fn: FilterFn)
                                        -> Option<AssocSuggestion>
        where FilterFn: Fn(Def) -> bool
    {
2820
        fn extract_node_id(t: &Ty) -> Option<NodeId> {
2821
            match t.node {
2822 2823
                TyKind::Path(None, _) => Some(t.id),
                TyKind::Rptr(_, ref mut_ty) => extract_node_id(&mut_ty.ty),
2824 2825 2826 2827 2828 2829 2830
                // 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,
            }
        }

2831 2832 2833 2834 2835
        // 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) {
2836 2837 2838
                    match resolution.base_def() {
                        Def::Struct(did) | Def::Union(did)
                                if resolution.unresolved_segments() == 0 => {
2839 2840 2841 2842
                            if let Some(field_names) = self.field_names.get(&did) {
                                if field_names.iter().any(|&field_name| name == field_name) {
                                    return Some(AssocSuggestion::Field);
                                }
2843
                            }
2844
                        }
2845
                        _ => {}
2846
                    }
2847
                }
2848
            }
2849 2850
        }

2851 2852 2853 2854 2855 2856 2857 2858 2859
        // Look for associated items in the current trait.
        if let Some((trait_did, _)) = self.current_trait_ref {
            if let Some(&(def, has_self)) = self.trait_item_map.get(&(trait_did, name, ns)) {
                if filter_fn(def) {
                    return Some(if has_self {
                        AssocSuggestion::MethodWithSelf
                    } else {
                        AssocSuggestion::AssocItem
                    });
2860 2861 2862 2863
                }
            }
        }

2864
        None
2865 2866
    }

2867
    fn lookup_typo_candidate<FilterFn>(&mut self,
2868
                                       path: &[Ident],
2869
                                       ns: Namespace,
2870 2871
                                       filter_fn: FilterFn,
                                       span: Span)
2872
                                       -> Option<Symbol>
2873 2874
        where FilterFn: Fn(Def) -> bool
    {
2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885
        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();
2886
        if path.len() == 1 {
2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922
            // 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];
2923 2924
            if let PathResult::Module(module) = self.resolve_path(mod_path, Some(TypeNS),
                                                                  false, span) {
2925 2926
                add_module_candidates(module, &mut names);
            }
2927
        }
2928 2929 2930 2931 2932

        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) {
2933
            Some(found) if found != name => Some(found),
2934
            _ => None,
2935
        }
2936 2937
    }

2938 2939 2940
    fn with_resolved_label<F>(&mut self, label: Option<SpannedIdent>, id: NodeId, f: F)
        where F: FnOnce(&mut Resolver)
    {
2941
        if let Some(label) = label {
2942
            let def = Def::Label(id);
2943
            self.with_label_rib(|this| {
J
Jeffrey Seyfried 已提交
2944
                this.label_ribs.last_mut().unwrap().bindings.insert(label.node, def);
2945
                f(this);
2946 2947
            });
        } else {
2948
            f(self);
2949 2950 2951
        }
    }

2952 2953 2954 2955
    fn resolve_labeled_block(&mut self, label: Option<SpannedIdent>, id: NodeId, block: &Block) {
        self.with_resolved_label(label, id, |this| this.visit_block(block));
    }

2956
    fn resolve_expr(&mut self, expr: &Expr, parent: Option<&Expr>) {
P
Patrick Walton 已提交
2957 2958
        // First, record candidate traits for this expression if it could
        // result in the invocation of a method call.
2959 2960 2961

        self.record_candidate_traits_for_expr_if_necessary(expr);

2962
        // Next, resolve the node.
2963
        match expr.node {
2964 2965
            ExprKind::Path(ref qself, ref path) => {
                self.smart_resolve_path(expr.id, qself.as_ref(), path, PathSource::Expr(parent));
2966
                visit::walk_expr(self, expr);
2967 2968
            }

V
Vadim Petrochenkov 已提交
2969
            ExprKind::Struct(ref path, ..) => {
2970
                self.smart_resolve_path(expr.id, None, path, PathSource::Struct);
2971
                visit::walk_expr(self, expr);
2972 2973
            }

2974
            ExprKind::Break(Some(label), _) | ExprKind::Continue(Some(label)) => {
2975
                match self.search_label(label.node) {
2976
                    None => {
2977
                        self.record_def(expr.id, err_path_resolution());
2978
                        resolve_error(self,
2979
                                      label.span,
2980
                                      ResolutionError::UndeclaredLabel(&label.node.name.as_str()));
2981
                    }
2982
                    Some(def @ Def::Label(_)) => {
2983
                        // Since this def is a label, it is never read.
2984
                        self.record_def(expr.id, PathResolution::new(def));
2985 2986
                    }
                    Some(_) => {
2987
                        span_bug!(expr.span, "label wasn't mapped to a label def!");
2988 2989
                    }
                }
2990 2991 2992

                // visit `break` argument if any
                visit::walk_expr(self, expr);
2993
            }
2994 2995 2996 2997

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

J
Jeffrey Seyfried 已提交
2998
                self.ribs[ValueNS].push(Rib::new(NormalRibKind));
2999
                self.resolve_pattern(pattern, PatternSource::IfLet, &mut FxHashMap());
3000
                self.visit_block(if_block);
J
Jeffrey Seyfried 已提交
3001
                self.ribs[ValueNS].pop();
3002 3003 3004 3005

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

J
Jeffrey Seyfried 已提交
3006 3007 3008
            ExprKind::Loop(ref block, label) => self.resolve_labeled_block(label, expr.id, &block),

            ExprKind::While(ref subexpression, ref block, label) => {
3009 3010 3011 3012
                self.with_resolved_label(label, expr.id, |this| {
                    this.visit_expr(subexpression);
                    this.visit_block(block);
                });
J
Jeffrey Seyfried 已提交
3013 3014
            }

3015
            ExprKind::WhileLet(ref pattern, ref subexpression, ref block, label) => {
3016 3017
                self.with_resolved_label(label, expr.id, |this| {
                    this.visit_expr(subexpression);
3018
                    this.ribs[ValueNS].push(Rib::new(NormalRibKind));
3019 3020
                    this.resolve_pattern(pattern, PatternSource::WhileLet, &mut FxHashMap());
                    this.visit_block(block);
3021
                    this.ribs[ValueNS].pop();
3022
                });
3023 3024 3025 3026
            }

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

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

J
Jeffrey Seyfried 已提交
3032
                self.ribs[ValueNS].pop();
3033 3034
            }

3035
            // Equivalent to `visit::walk_expr` + passing some context to children.
3036
            ExprKind::Field(ref subexpression, _) => {
3037
                self.resolve_expr(subexpression, Some(expr));
3038
            }
3039
            ExprKind::MethodCall(_, ref types, ref arguments) => {
3040
                let mut arguments = arguments.iter();
3041
                self.resolve_expr(arguments.next().unwrap(), Some(expr));
3042 3043 3044 3045 3046 3047 3048
                for argument in arguments {
                    self.resolve_expr(argument, None);
                }
                for ty in types.iter() {
                    self.visit_ty(ty);
                }
            }
3049 3050 3051 3052 3053 3054 3055

            ExprKind::Repeat(ref element, ref count) => {
                self.visit_expr(element);
                self.with_constant_rib(|this| {
                    this.visit_expr(count);
                });
            }
3056
            ExprKind::Call(ref callee, ref arguments) => {
3057
                self.resolve_expr(callee, Some(expr));
3058 3059 3060 3061
                for argument in arguments {
                    self.resolve_expr(argument, None);
                }
            }
3062

B
Brian Anderson 已提交
3063
            _ => {
3064
                visit::walk_expr(self, expr);
3065 3066 3067 3068
            }
        }
    }

E
Eduard Burtescu 已提交
3069
    fn record_candidate_traits_for_expr_if_necessary(&mut self, expr: &Expr) {
3070
        match expr.node {
3071
            ExprKind::Field(_, name) => {
3072 3073 3074 3075
                // 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.
3076
                let traits = self.get_traits_containing_item(name.node.name, ValueNS);
3077
                self.trait_map.insert(expr.id, traits);
3078
            }
V
Vadim Petrochenkov 已提交
3079
            ExprKind::MethodCall(name, ..) => {
C
corentih 已提交
3080
                debug!("(recording candidate traits for expr) recording traits for {}",
3081
                       expr.id);
3082
                let traits = self.get_traits_containing_item(name.node.name, ValueNS);
3083
                self.trait_map.insert(expr.id, traits);
3084
            }
3085
            _ => {
3086 3087 3088 3089 3090
                // Nothing to do.
            }
        }
    }

3091
    fn get_traits_containing_item(&mut self, name: Name, ns: Namespace) -> Vec<TraitCandidate> {
C
corentih 已提交
3092
        debug!("(getting traits containing item) looking for '{}'", name);
E
Eduard Burtescu 已提交
3093

3094
        let mut found_traits = Vec::new();
J
Jeffrey Seyfried 已提交
3095 3096
        // Look for the current trait.
        if let Some((trait_def_id, _)) = self.current_trait_ref {
3097
            if self.trait_item_map.contains_key(&(trait_def_id, name, ns)) {
3098
                found_traits.push(TraitCandidate { def_id: trait_def_id, import_id: None });
E
Eduard Burtescu 已提交
3099
            }
J
Jeffrey Seyfried 已提交
3100
        }
3101

J
Jeffrey Seyfried 已提交
3102 3103
        let mut search_module = self.current_module;
        loop {
3104
            self.get_traits_in_module_containing_item(name, ns, search_module, &mut found_traits);
3105 3106 3107 3108 3109
            match search_module.kind {
                ModuleKind::Block(..) => search_module = search_module.parent.unwrap(),
                _ => break,
            }
        }
3110

3111 3112
        if let Some(prelude) = self.prelude {
            if !search_module.no_implicit_prelude {
3113
                self.get_traits_in_module_containing_item(name, ns, prelude, &mut found_traits);
E
Eduard Burtescu 已提交
3114
            }
3115 3116
        }

E
Eduard Burtescu 已提交
3117
        found_traits
3118 3119
    }

3120 3121
    fn get_traits_in_module_containing_item(&mut self,
                                            name: Name,
3122
                                            ns: Namespace,
3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138
                                            module: Module,
                                            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() {
            let trait_def_id = binding.def().def_id();
3139
            if self.trait_item_map.contains_key(&(trait_def_id, name, ns)) {
3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152
                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,
                };
                found_traits.push(TraitCandidate { def_id: trait_def_id, import_id: import_id });
            }
        }
    }

3153 3154 3155 3156 3157 3158 3159
    /// 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).
3160 3161 3162 3163 3164 3165 3166 3167
    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();
3168
        let mut worklist = Vec::new();
3169
        let mut seen_modules = FxHashSet();
3170 3171 3172 3173 3174
        worklist.push((self.graph_root, Vec::new(), false));

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

3177
            in_module.for_each_child(|ident, ns, name_binding| {
3178 3179

                // avoid imports entirely
3180
                if name_binding.is_import() && !name_binding.is_extern_crate() { return; }
3181 3182
                // avoid non-importable candidates as well
                if !name_binding.is_importable() { return; }
3183 3184

                // collect results based on the filter function
3185
                if ident.name == lookup_name && ns == namespace {
3186
                    if filter_fn(name_binding.def()) {
3187 3188
                        // create the path
                        let mut segms = path_segments.clone();
3189
                        segms.push(ast::PathSegment::from_ident(ident, name_binding.span));
3190
                        let path = Path {
3191
                            span: name_binding.span,
3192 3193 3194 3195 3196 3197 3198 3199 3200
                            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)
3201
                        if !in_module_is_extern || name_binding.vis == ty::Visibility::Public {
3202
                            candidates.push(ImportSuggestion { path: path });
3203 3204 3205 3206 3207
                        }
                    }
                }

                // collect submodules to explore
J
Jeffrey Seyfried 已提交
3208
                if let Some(module) = name_binding.module() {
3209
                    // form the path
3210
                    let mut path_segments = path_segments.clone();
3211
                    path_segments.push(ast::PathSegment::from_ident(ident, name_binding.span));
3212

3213
                    if !in_module_is_extern || name_binding.vis == ty::Visibility::Public {
3214
                        // add the module to the lookup
3215
                        let is_extern = in_module_is_extern || name_binding.is_extern_crate();
3216
                        if seen_modules.insert(module.def_id().unwrap()) {
3217 3218
                            worklist.push((module, path_segments, is_extern));
                        }
3219 3220 3221 3222 3223
                    }
                }
            })
        }

3224
        candidates
3225 3226
    }

3227 3228
    fn record_def(&mut self, node_id: NodeId, resolution: PathResolution) {
        debug!("(recording def) recording {:?} for {}", resolution, node_id);
3229
        if let Some(prev_res) = self.def_map.insert(node_id, resolution) {
3230
            panic!("path resolved multiple times ({:?} before, {:?} now)", prev_res, resolution);
3231
        }
3232 3233
    }

3234
    fn resolve_visibility(&mut self, vis: &ast::Visibility) -> ty::Visibility {
3235 3236 3237
        match *vis {
            ast::Visibility::Public => ty::Visibility::Public,
            ast::Visibility::Crate(..) => ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)),
3238
            ast::Visibility::Inherited => {
3239
                ty::Visibility::Restricted(self.current_module.normal_ancestor_id)
3240
            }
3241
            ast::Visibility::Restricted { ref path, id } => {
3242 3243
                let def = self.smart_resolve_path(id, None, path,
                                                  PathSource::Visibility).base_def();
3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255
                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
                    }
                }
3256 3257 3258 3259
            }
        }
    }

3260
    fn is_accessible(&self, vis: ty::Visibility) -> bool {
3261
        vis.is_accessible_from(self.current_module.normal_ancestor_id, self)
3262 3263
    }

3264
    fn is_accessible_from(&self, vis: ty::Visibility, module: Module<'a>) -> bool {
3265
        vis.is_accessible_from(module.normal_ancestor_id, self)
3266 3267
    }

3268 3269
    fn report_errors(&mut self) {
        self.report_shadowing_errors();
3270
        let mut reported_spans = FxHashSet();
3271

3272
        for &AmbiguityError { span, name, b1, b2, lexical, legacy } in &self.ambiguity_errors {
3273
            if !reported_spans.insert(span) { continue }
3274 3275 3276
            let participle = |binding: &NameBinding| {
                if binding.is_import() { "imported" } else { "defined" }
            };
3277 3278
            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));
3279
            let note = if b1.expansion == Mark::root() || !lexical && b1.is_glob_import() {
3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298
                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 {
3299 3300 3301 3302 3303 3304 3305 3306 3307
                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();
3308
            }
3309 3310
        }

3311 3312 3313 3314
        for &PrivacyError(span, name, binding) in &self.privacy_errors {
            if !reported_spans.insert(span) { continue }
            if binding.is_extern_crate() {
                // Warn when using an inaccessible extern crate.
3315 3316 3317 3318
                let node_id = match binding.kind {
                    NameBindingKind::Import { directive, .. } => directive.id,
                    _ => unreachable!(),
                };
3319 3320 3321
                let msg = format!("extern crate `{}` is private", name);
                self.session.add_lint(lint::builtin::INACCESSIBLE_EXTERN_CRATE, node_id, span, msg);
            } else {
3322
                let def = binding.def();
3323 3324 3325 3326
                self.session.span_err(span, &format!("{} `{}` is private", def.kind_name(), name));
            }
        }
    }
3327

3328
    fn report_shadowing_errors(&mut self) {
J
Jeffrey Seyfried 已提交
3329
        for (name, scope) in replace(&mut self.lexical_macro_resolutions, Vec::new()) {
3330
            self.resolve_legacy_scope(scope, name, true);
J
Jeffrey Seyfried 已提交
3331 3332
        }

3333
        let mut reported_errors = FxHashSet();
3334
        for binding in replace(&mut self.disallowed_shadowing, Vec::new()) {
3335
            if self.resolve_legacy_scope(&binding.parent, binding.name, false).is_some() &&
3336 3337 3338
               reported_errors.insert((binding.name, binding.span)) {
                let msg = format!("`{}` is already in scope", binding.name);
                self.session.struct_span_err(binding.span, &msg)
3339 3340
                    .note("macro-expanded `macro_rules!`s may not shadow \
                           existing macros (see RFC 1560)")
3341 3342 3343 3344 3345
                    .emit();
            }
        }
    }

3346
    fn report_conflict(&mut self,
3347
                       parent: Module,
3348
                       ident: Ident,
3349 3350 3351 3352
                       ns: Namespace,
                       binding: &NameBinding,
                       old_binding: &NameBinding) {
        // Error on the second of two conflicting names
3353
        if old_binding.span.lo > binding.span.lo {
3354
            return self.report_conflict(parent, ident, ns, old_binding, binding);
3355 3356
        }

J
Jeffrey Seyfried 已提交
3357 3358 3359 3360
        let container = match parent.kind {
            ModuleKind::Def(Def::Mod(_), _) => "module",
            ModuleKind::Def(Def::Trait(_), _) => "trait",
            ModuleKind::Block(..) => "block",
3361 3362 3363
            _ => "enum",
        };

3364
        let (participle, noun) = match old_binding.is_import() {
3365 3366 3367 3368
            true => ("imported", "import"),
            false => ("defined", "definition"),
        };

3369
        let (name, span) = (ident.name, binding.span);
3370 3371 3372 3373 3374 3375 3376

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

3377 3378 3379
        let msg = {
            let kind = match (ns, old_binding.module()) {
                (ValueNS, _) => "a value",
3380
                (MacroNS, _) => "a macro",
3381
                (TypeNS, _) if old_binding.is_extern_crate() => "an extern crate",
J
Jeffrey Seyfried 已提交
3382 3383
                (TypeNS, Some(module)) if module.is_normal() => "a module",
                (TypeNS, Some(module)) if module.is_trait() => "a trait",
3384 3385 3386 3387 3388 3389 3390
                (TypeNS, _) => "a type",
            };
            format!("{} named `{}` has already been {} in this {}",
                    kind, name, participle, container)
        };

        let mut err = match (old_binding.is_extern_crate(), binding.is_extern_crate()) {
3391 3392 3393 3394
            (true, true) => struct_span_err!(self.session, span, E0259, "{}", msg),
            (true, _) | (_, true) => match binding.is_import() && old_binding.is_import() {
                true => struct_span_err!(self.session, span, E0254, "{}", msg),
                false => struct_span_err!(self.session, span, E0260, "{}", msg),
M
Mohit Agarwal 已提交
3395
            },
3396
            _ => match (old_binding.is_import(), binding.is_import()) {
3397 3398 3399
                (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),
3400 3401 3402
            },
        };

3403
        err.span_label(span, format!("`{}` already {}", name, participle));
3404
        if old_binding.span != syntax_pos::DUMMY_SP {
3405
            err.span_label(old_binding.span, format!("previous {} of `{}` here", noun, name));
3406 3407
        }
        err.emit();
3408
        self.name_already_seen.insert(name, span);
3409
    }
J
Jeffrey Seyfried 已提交
3410 3411 3412 3413 3414 3415

    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);
    }
3416 3417 3418 3419 3420

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

        for attr in attrs {
3421 3422 3423 3424
            if attr.path.segments.len() > 1 {
                continue
            }
            let ident = attr.path.segments[0].identifier;
3425 3426 3427 3428
            let result = self.resolve_lexical_macro_path_segment(ident,
                                                                 MacroNS,
                                                                 false,
                                                                 attr.path.span);
3429 3430
            if let Ok(binding) = result {
                if let SyntaxExtension::AttrProcMacro(..) = *binding.binding().get_macro(self) {
3431 3432 3433 3434 3435 3436 3437
                    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)
3438
                        .span_note(binding.span(), "procedural macro imported here")
3439 3440 3441 3442 3443
                        .emit();
                }
            }
        }
    }
3444
}
3445

3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461
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 {
3462
    let mut result = String::new();
3463
    for (i, ident) in idents.iter().filter(|i| i.name != keywords::CrateRoot.name()).enumerate() {
3464 3465 3466
        if i > 0 {
            result.push_str("::");
        }
3467
        result.push_str(&ident.name.as_str());
C
corentih 已提交
3468
    }
3469 3470 3471
    result
}

3472 3473
fn path_names_to_string(path: &Path) -> String {
    names_to_string(&path.segments.iter().map(|seg| seg.identifier).collect::<Vec<_>>())
3474 3475
}

3476
/// Get the path for an enum and the variant from an `ImportSuggestion` for an enum variant.
E
Esteban Küber 已提交
3477
fn import_candidate_to_paths(suggestion: &ImportSuggestion) -> (Span, String, String) {
3478 3479 3480 3481 3482 3483 3484 3485 3486 3487
    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 已提交
3488
    (suggestion.path.span, variant_path_string, enum_path_string)
3489 3490 3491
}


3492 3493 3494
/// 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
3495 3496
fn show_candidates(err: &mut DiagnosticBuilder,
                   span: Span,
3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509
                   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",
3510
    };
3511 3512 3513 3514 3515
    let msg = format!("possible {}candidate{} into scope", better, msg_diff);

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

3517
    err.span_suggestions(span, &msg, path_strings);
3518 3519
}

3520
/// A somewhat inefficient routine to obtain the name of a module.
3521
fn module_to_string(module: Module) -> String {
3522 3523
    let mut names = Vec::new();

3524
    fn collect_mod(names: &mut Vec<Ident>, module: Module) {
J
Jeffrey Seyfried 已提交
3525 3526
        if let ModuleKind::Def(_, name) = module.kind {
            if let Some(parent) = module.parent {
3527
                names.push(Ident::with_empty_ctxt(name));
J
Jeffrey Seyfried 已提交
3528
                collect_mod(names, parent);
3529
            }
J
Jeffrey Seyfried 已提交
3530 3531
        } else {
            // danger, shouldn't be ident?
3532
            names.push(Ident::from_str("<opaque>"));
J
Jeffrey Seyfried 已提交
3533
            collect_mod(names, module.parent.unwrap());
3534 3535 3536 3537
        }
    }
    collect_mod(&mut names, module);

3538
    if names.is_empty() {
3539 3540
        return "???".to_string();
    }
3541
    names_to_string(&names.into_iter().rev().collect::<Vec<_>>())
3542 3543
}

3544
fn err_path_resolution() -> PathResolution {
3545
    PathResolution::new(Def::Err)
3546 3547
}

N
Niko Matsakis 已提交
3548
#[derive(PartialEq,Copy, Clone)]
3549 3550
pub enum MakeGlobMap {
    Yes,
C
corentih 已提交
3551
    No,
3552 3553
}

3554
__build_diagnostic_array! { librustc_resolve, DIAGNOSTICS }