diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/hir/src/lib.rs | 7 | ||||
-rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 1 | ||||
-rw-r--r-- | crates/hir_ty/src/infer/path.rs | 1 | ||||
-rw-r--r-- | crates/hir_ty/src/method_resolution.rs | 35 |
4 files changed, 40 insertions, 4 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 30e577671..1a65a5cad 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs | |||
@@ -1967,12 +1967,18 @@ impl Type { | |||
1967 | let env = self.ty.environment.clone(); | 1967 | let env = self.ty.environment.clone(); |
1968 | let krate = krate.id; | 1968 | let krate = krate.id; |
1969 | 1969 | ||
1970 | let from_module = match self.as_adt() { | ||
1971 | Some(adt) => Some(adt.module(db).id), | ||
1972 | None => None, | ||
1973 | }; | ||
1974 | |||
1970 | method_resolution::iterate_method_candidates( | 1975 | method_resolution::iterate_method_candidates( |
1971 | &canonical, | 1976 | &canonical, |
1972 | db, | 1977 | db, |
1973 | env, | 1978 | env, |
1974 | krate, | 1979 | krate, |
1975 | traits_in_scope, | 1980 | traits_in_scope, |
1981 | from_module, | ||
1976 | name, | 1982 | name, |
1977 | method_resolution::LookupMode::MethodCall, | 1983 | method_resolution::LookupMode::MethodCall, |
1978 | |ty, it| match it { | 1984 | |ty, it| match it { |
@@ -2004,6 +2010,7 @@ impl Type { | |||
2004 | env, | 2010 | env, |
2005 | krate, | 2011 | krate, |
2006 | traits_in_scope, | 2012 | traits_in_scope, |
2013 | None, | ||
2007 | name, | 2014 | name, |
2008 | method_resolution::LookupMode::Path, | 2015 | method_resolution::LookupMode::Path, |
2009 | |ty, it| callback(ty, it.into()), | 2016 | |ty, it| callback(ty, it.into()), |
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index 9bf9f87e4..b08880cdf 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs | |||
@@ -849,6 +849,7 @@ impl<'a> InferenceContext<'a> { | |||
849 | self.trait_env.clone(), | 849 | self.trait_env.clone(), |
850 | krate, | 850 | krate, |
851 | &traits_in_scope, | 851 | &traits_in_scope, |
852 | self.resolver.module(), | ||
852 | method_name, | 853 | method_name, |
853 | ) | 854 | ) |
854 | }); | 855 | }); |
diff --git a/crates/hir_ty/src/infer/path.rs b/crates/hir_ty/src/infer/path.rs index 58cce56ab..cefa38509 100644 --- a/crates/hir_ty/src/infer/path.rs +++ b/crates/hir_ty/src/infer/path.rs | |||
@@ -230,6 +230,7 @@ impl<'a> InferenceContext<'a> { | |||
230 | self.trait_env.clone(), | 230 | self.trait_env.clone(), |
231 | krate, | 231 | krate, |
232 | &traits_in_scope, | 232 | &traits_in_scope, |
233 | None, | ||
233 | Some(name), | 234 | Some(name), |
234 | method_resolution::LookupMode::Path, | 235 | method_resolution::LookupMode::Path, |
235 | move |_ty, item| { | 236 | move |_ty, item| { |
diff --git a/crates/hir_ty/src/method_resolution.rs b/crates/hir_ty/src/method_resolution.rs index da6bc2a4a..6c34982a1 100644 --- a/crates/hir_ty/src/method_resolution.rs +++ b/crates/hir_ty/src/method_resolution.rs | |||
@@ -295,6 +295,7 @@ pub(crate) fn lookup_method( | |||
295 | env: Arc<TraitEnvironment>, | 295 | env: Arc<TraitEnvironment>, |
296 | krate: CrateId, | 296 | krate: CrateId, |
297 | traits_in_scope: &FxHashSet<TraitId>, | 297 | traits_in_scope: &FxHashSet<TraitId>, |
298 | visible_from_module: Option<ModuleId>, | ||
298 | name: &Name, | 299 | name: &Name, |
299 | ) -> Option<(Ty, FunctionId)> { | 300 | ) -> Option<(Ty, FunctionId)> { |
300 | iterate_method_candidates( | 301 | iterate_method_candidates( |
@@ -303,6 +304,7 @@ pub(crate) fn lookup_method( | |||
303 | env, | 304 | env, |
304 | krate, | 305 | krate, |
305 | &traits_in_scope, | 306 | &traits_in_scope, |
307 | visible_from_module, | ||
306 | Some(name), | 308 | Some(name), |
307 | LookupMode::MethodCall, | 309 | LookupMode::MethodCall, |
308 | |ty, f| match f { | 310 | |ty, f| match f { |
@@ -333,6 +335,7 @@ pub fn iterate_method_candidates<T>( | |||
333 | env: Arc<TraitEnvironment>, | 335 | env: Arc<TraitEnvironment>, |
334 | krate: CrateId, | 336 | krate: CrateId, |
335 | traits_in_scope: &FxHashSet<TraitId>, | 337 | traits_in_scope: &FxHashSet<TraitId>, |
338 | visible_from_module: Option<ModuleId>, | ||
336 | name: Option<&Name>, | 339 | name: Option<&Name>, |
337 | mode: LookupMode, | 340 | mode: LookupMode, |
338 | mut callback: impl FnMut(&Ty, AssocItemId) -> Option<T>, | 341 | mut callback: impl FnMut(&Ty, AssocItemId) -> Option<T>, |
@@ -344,6 +347,7 @@ pub fn iterate_method_candidates<T>( | |||
344 | env, | 347 | env, |
345 | krate, | 348 | krate, |
346 | traits_in_scope, | 349 | traits_in_scope, |
350 | visible_from_module, | ||
347 | name, | 351 | name, |
348 | mode, | 352 | mode, |
349 | &mut |ty, item| { | 353 | &mut |ty, item| { |
@@ -361,6 +365,7 @@ fn iterate_method_candidates_impl( | |||
361 | env: Arc<TraitEnvironment>, | 365 | env: Arc<TraitEnvironment>, |
362 | krate: CrateId, | 366 | krate: CrateId, |
363 | traits_in_scope: &FxHashSet<TraitId>, | 367 | traits_in_scope: &FxHashSet<TraitId>, |
368 | visible_from_module: Option<ModuleId>, | ||
364 | name: Option<&Name>, | 369 | name: Option<&Name>, |
365 | mode: LookupMode, | 370 | mode: LookupMode, |
366 | callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool, | 371 | callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool, |
@@ -398,6 +403,7 @@ fn iterate_method_candidates_impl( | |||
398 | env.clone(), | 403 | env.clone(), |
399 | krate, | 404 | krate, |
400 | traits_in_scope, | 405 | traits_in_scope, |
406 | visible_from_module, | ||
401 | name, | 407 | name, |
402 | callback, | 408 | callback, |
403 | ) { | 409 | ) { |
@@ -427,6 +433,7 @@ fn iterate_method_candidates_with_autoref( | |||
427 | env: Arc<TraitEnvironment>, | 433 | env: Arc<TraitEnvironment>, |
428 | krate: CrateId, | 434 | krate: CrateId, |
429 | traits_in_scope: &FxHashSet<TraitId>, | 435 | traits_in_scope: &FxHashSet<TraitId>, |
436 | visible_from_module: Option<ModuleId>, | ||
430 | name: Option<&Name>, | 437 | name: Option<&Name>, |
431 | mut callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool, | 438 | mut callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool, |
432 | ) -> bool { | 439 | ) -> bool { |
@@ -437,6 +444,7 @@ fn iterate_method_candidates_with_autoref( | |||
437 | env.clone(), | 444 | env.clone(), |
438 | krate, | 445 | krate, |
439 | &traits_in_scope, | 446 | &traits_in_scope, |
447 | visible_from_module, | ||
440 | name, | 448 | name, |
441 | &mut callback, | 449 | &mut callback, |
442 | ) { | 450 | ) { |
@@ -453,6 +461,7 @@ fn iterate_method_candidates_with_autoref( | |||
453 | env.clone(), | 461 | env.clone(), |
454 | krate, | 462 | krate, |
455 | &traits_in_scope, | 463 | &traits_in_scope, |
464 | visible_from_module, | ||
456 | name, | 465 | name, |
457 | &mut callback, | 466 | &mut callback, |
458 | ) { | 467 | ) { |
@@ -469,6 +478,7 @@ fn iterate_method_candidates_with_autoref( | |||
469 | env, | 478 | env, |
470 | krate, | 479 | krate, |
471 | &traits_in_scope, | 480 | &traits_in_scope, |
481 | visible_from_module, | ||
472 | name, | 482 | name, |
473 | &mut callback, | 483 | &mut callback, |
474 | ) { | 484 | ) { |
@@ -484,6 +494,7 @@ fn iterate_method_candidates_by_receiver( | |||
484 | env: Arc<TraitEnvironment>, | 494 | env: Arc<TraitEnvironment>, |
485 | krate: CrateId, | 495 | krate: CrateId, |
486 | traits_in_scope: &FxHashSet<TraitId>, | 496 | traits_in_scope: &FxHashSet<TraitId>, |
497 | visible_from_module: Option<ModuleId>, | ||
487 | name: Option<&Name>, | 498 | name: Option<&Name>, |
488 | mut callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool, | 499 | mut callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool, |
489 | ) -> bool { | 500 | ) -> bool { |
@@ -491,7 +502,15 @@ fn iterate_method_candidates_by_receiver( | |||
491 | // be found in any of the derefs of receiver_ty, so we have to go through | 502 | // be found in any of the derefs of receiver_ty, so we have to go through |
492 | // that. | 503 | // that. |
493 | for self_ty in std::iter::once(receiver_ty).chain(rest_of_deref_chain) { | 504 | for self_ty in std::iter::once(receiver_ty).chain(rest_of_deref_chain) { |
494 | if iterate_inherent_methods(self_ty, db, name, Some(receiver_ty), krate, &mut callback) { | 505 | if iterate_inherent_methods( |
506 | self_ty, | ||
507 | db, | ||
508 | name, | ||
509 | Some(receiver_ty), | ||
510 | krate, | ||
511 | visible_from_module, | ||
512 | &mut callback, | ||
513 | ) { | ||
495 | return true; | 514 | return true; |
496 | } | 515 | } |
497 | } | 516 | } |
@@ -521,7 +540,7 @@ fn iterate_method_candidates_for_self_ty( | |||
521 | name: Option<&Name>, | 540 | name: Option<&Name>, |
522 | mut callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool, | 541 | mut callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool, |
523 | ) -> bool { | 542 | ) -> bool { |
524 | if iterate_inherent_methods(self_ty, db, name, None, krate, &mut callback) { | 543 | if iterate_inherent_methods(self_ty, db, name, None, krate, None, &mut callback) { |
525 | return true; | 544 | return true; |
526 | } | 545 | } |
527 | iterate_trait_method_candidates(self_ty, db, env, krate, traits_in_scope, name, None, callback) | 546 | iterate_trait_method_candidates(self_ty, db, env, krate, traits_in_scope, name, None, callback) |
@@ -558,7 +577,7 @@ fn iterate_trait_method_candidates( | |||
558 | // iteration | 577 | // iteration |
559 | let mut known_implemented = false; | 578 | let mut known_implemented = false; |
560 | for (_name, item) in data.items.iter() { | 579 | for (_name, item) in data.items.iter() { |
561 | if !is_valid_candidate(db, name, receiver_ty, *item, self_ty) { | 580 | if !is_valid_candidate(db, name, receiver_ty, *item, self_ty, None) { |
562 | continue; | 581 | continue; |
563 | } | 582 | } |
564 | if !known_implemented { | 583 | if !known_implemented { |
@@ -582,6 +601,7 @@ fn iterate_inherent_methods( | |||
582 | name: Option<&Name>, | 601 | name: Option<&Name>, |
583 | receiver_ty: Option<&Canonical<Ty>>, | 602 | receiver_ty: Option<&Canonical<Ty>>, |
584 | krate: CrateId, | 603 | krate: CrateId, |
604 | visible_from_module: Option<ModuleId>, | ||
585 | callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool, | 605 | callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool, |
586 | ) -> bool { | 606 | ) -> bool { |
587 | let def_crates = match self_ty.value.def_crates(db, krate) { | 607 | let def_crates = match self_ty.value.def_crates(db, krate) { |
@@ -593,7 +613,7 @@ fn iterate_inherent_methods( | |||
593 | 613 | ||
594 | for &impl_def in impls.for_self_ty(&self_ty.value) { | 614 | for &impl_def in impls.for_self_ty(&self_ty.value) { |
595 | for &item in db.impl_data(impl_def).items.iter() { | 615 | for &item in db.impl_data(impl_def).items.iter() { |
596 | if !is_valid_candidate(db, name, receiver_ty, item, self_ty) { | 616 | if !is_valid_candidate(db, name, receiver_ty, item, self_ty, visible_from_module) { |
597 | continue; | 617 | continue; |
598 | } | 618 | } |
599 | // we have to check whether the self type unifies with the type | 619 | // we have to check whether the self type unifies with the type |
@@ -638,6 +658,7 @@ fn is_valid_candidate( | |||
638 | receiver_ty: Option<&Canonical<Ty>>, | 658 | receiver_ty: Option<&Canonical<Ty>>, |
639 | item: AssocItemId, | 659 | item: AssocItemId, |
640 | self_ty: &Canonical<Ty>, | 660 | self_ty: &Canonical<Ty>, |
661 | visible_from_module: Option<ModuleId>, | ||
641 | ) -> bool { | 662 | ) -> bool { |
642 | match item { | 663 | match item { |
643 | AssocItemId::FunctionId(m) => { | 664 | AssocItemId::FunctionId(m) => { |
@@ -659,6 +680,12 @@ fn is_valid_candidate( | |||
659 | return false; | 680 | return false; |
660 | } | 681 | } |
661 | } | 682 | } |
683 | if let Some(from_module) = visible_from_module { | ||
684 | if !db.fn_visibility(m).is_visible_from(db.upcast(), from_module) { | ||
685 | return false; | ||
686 | } | ||
687 | } | ||
688 | |||
662 | true | 689 | true |
663 | } | 690 | } |
664 | AssocItemId::ConstId(c) => { | 691 | AssocItemId::ConstId(c) => { |