Skip to content

Commit 54b75a1

Browse files
authored
Merge pull request #18779 from ChayimFriedman2/enum-variant
fix: Consider `Enum::Variant` even when it comes from a different crate
2 parents 47f497d + 30fa18c commit 54b75a1

File tree

5 files changed

+66
-39
lines changed

5 files changed

+66
-39
lines changed

src/tools/rust-analyzer/crates/hir-def/src/nameres/collector.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use crate::{
3838
attr_resolution::{attr_macro_as_call_id, derive_macro_as_call_id},
3939
diagnostics::DefDiagnostic,
4040
mod_resolution::ModDir,
41-
path_resolution::{ReachedFixedPoint, ResolvePathResultPrefixInfo},
41+
path_resolution::ReachedFixedPoint,
4242
proc_macro::{parse_macro_name_and_helper_attrs, ProcMacroDef, ProcMacroKind},
4343
sub_namespace_match, BuiltinShadowMode, DefMap, MacroSubNs, ModuleData, ModuleOrigin,
4444
ResolveMode,
@@ -797,7 +797,7 @@ impl DefCollector<'_> {
797797
return PartialResolvedImport::Unresolved;
798798
}
799799

800-
if let ResolvePathResultPrefixInfo::DifferingCrate = res.prefix_info {
800+
if res.prefix_info.differing_crate {
801801
return PartialResolvedImport::Resolved(
802802
def.filter_visibility(|v| matches!(v, Visibility::Public)),
803803
);

src/tools/rust-analyzer/crates/hir-def/src/nameres/path_resolution.rs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,11 @@ pub(super) struct ResolvePathResult {
4646
pub(super) prefix_info: ResolvePathResultPrefixInfo,
4747
}
4848

49-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
50-
pub enum ResolvePathResultPrefixInfo {
51-
None,
52-
DifferingCrate,
49+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
50+
pub struct ResolvePathResultPrefixInfo {
51+
pub(crate) differing_crate: bool,
5352
/// Path of the form `Enum::Variant` (and not `Variant` alone).
54-
Enum,
53+
pub enum_variant: bool,
5554
}
5655

5756
impl ResolvePathResult {
@@ -60,7 +59,7 @@ impl ResolvePathResult {
6059
PerNs::none(),
6160
reached_fixedpoint,
6261
None,
63-
ResolvePathResultPrefixInfo::None,
62+
ResolvePathResultPrefixInfo::default(),
6463
)
6564
}
6665

@@ -170,17 +169,8 @@ impl DefMap {
170169
if result.reached_fixedpoint == ReachedFixedPoint::No {
171170
result.reached_fixedpoint = new.reached_fixedpoint;
172171
}
173-
result.prefix_info = match (result.prefix_info, new.prefix_info) {
174-
(ResolvePathResultPrefixInfo::None, it) => it,
175-
(ResolvePathResultPrefixInfo::DifferingCrate, _) => {
176-
ResolvePathResultPrefixInfo::DifferingCrate
177-
}
178-
(
179-
ResolvePathResultPrefixInfo::Enum,
180-
ResolvePathResultPrefixInfo::DifferingCrate,
181-
) => ResolvePathResultPrefixInfo::DifferingCrate,
182-
(ResolvePathResultPrefixInfo::Enum, _) => ResolvePathResultPrefixInfo::Enum,
183-
};
172+
result.prefix_info.differing_crate |= new.prefix_info.differing_crate;
173+
result.prefix_info.enum_variant |= new.prefix_info.enum_variant;
184174
result.segment_index = match (result.segment_index, new.segment_index) {
185175
(Some(idx), None) => Some(idx),
186176
(Some(old), Some(new)) => Some(old.max(new)),
@@ -460,13 +450,22 @@ impl DefMap {
460450
// because `macro_use` and other preludes should be taken into account. At
461451
// this point, we know we're resolving a multi-segment path so macro kind
462452
// expectation is discarded.
463-
let (def, s) =
464-
defp_map.resolve_path(db, module.local_id, &path, shadow, None);
453+
let resolution = defp_map.resolve_path_fp_with_macro(
454+
db,
455+
ResolveMode::Other,
456+
module.local_id,
457+
&path,
458+
shadow,
459+
None,
460+
);
465461
return ResolvePathResult::new(
466-
def,
462+
resolution.resolved_def,
467463
ReachedFixedPoint::Yes,
468-
s.map(|s| s + i),
469-
ResolvePathResultPrefixInfo::DifferingCrate,
464+
resolution.segment_index.map(|s| s + i),
465+
ResolvePathResultPrefixInfo {
466+
differing_crate: true,
467+
enum_variant: resolution.prefix_info.enum_variant,
468+
},
470469
);
471470
}
472471

@@ -522,15 +521,18 @@ impl DefMap {
522521
res,
523522
ReachedFixedPoint::Yes,
524523
None,
525-
ResolvePathResultPrefixInfo::Enum,
524+
ResolvePathResultPrefixInfo {
525+
enum_variant: true,
526+
..ResolvePathResultPrefixInfo::default()
527+
},
526528
)
527529
}
528530
}
529531
None => ResolvePathResult::new(
530532
PerNs::types(e.into(), curr.vis, curr.import),
531533
ReachedFixedPoint::Yes,
532534
Some(i),
533-
ResolvePathResultPrefixInfo::None,
535+
ResolvePathResultPrefixInfo::default(),
534536
),
535537
};
536538
}
@@ -547,7 +549,7 @@ impl DefMap {
547549
PerNs::types(s, curr.vis, curr.import),
548550
ReachedFixedPoint::Yes,
549551
Some(i),
550-
ResolvePathResultPrefixInfo::None,
552+
ResolvePathResultPrefixInfo::default(),
551553
);
552554
}
553555
};
@@ -560,7 +562,7 @@ impl DefMap {
560562
curr_per_ns,
561563
ReachedFixedPoint::Yes,
562564
None,
563-
ResolvePathResultPrefixInfo::None,
565+
ResolvePathResultPrefixInfo::default(),
564566
)
565567
}
566568

src/tools/rust-analyzer/crates/hir-def/src/resolver.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ impl Resolver {
293293
},
294294
None,
295295
),
296-
ResolvePathResultPrefixInfo::None,
296+
ResolvePathResultPrefixInfo::default(),
297297
))
298298
}
299299
Path::LangItem(l, Some(_)) => {
@@ -310,7 +310,7 @@ impl Resolver {
310310
};
311311
return Some((
312312
ResolveValueResult::Partial(type_ns, 1, None),
313-
ResolvePathResultPrefixInfo::None,
313+
ResolvePathResultPrefixInfo::default(),
314314
));
315315
}
316316
};
@@ -346,7 +346,7 @@ impl Resolver {
346346
ValueNs::LocalBinding(e.binding()),
347347
None,
348348
),
349-
ResolvePathResultPrefixInfo::None,
349+
ResolvePathResultPrefixInfo::default(),
350350
));
351351
}
352352
}
@@ -370,15 +370,15 @@ impl Resolver {
370370
let val = ValueNs::GenericParam(id);
371371
return Some((
372372
ResolveValueResult::ValueNs(val, None),
373-
ResolvePathResultPrefixInfo::None,
373+
ResolvePathResultPrefixInfo::default(),
374374
));
375375
}
376376
}
377377
&Scope::ImplDefScope(impl_) => {
378378
if *first_name == sym::Self_.clone() {
379379
return Some((
380380
ResolveValueResult::ValueNs(ValueNs::ImplSelf(impl_), None),
381-
ResolvePathResultPrefixInfo::None,
381+
ResolvePathResultPrefixInfo::default(),
382382
));
383383
}
384384
}
@@ -400,15 +400,15 @@ impl Resolver {
400400
let ty = TypeNs::GenericParam(id);
401401
return Some((
402402
ResolveValueResult::Partial(ty, 1, None),
403-
ResolvePathResultPrefixInfo::None,
403+
ResolvePathResultPrefixInfo::default(),
404404
));
405405
}
406406
}
407407
&Scope::ImplDefScope(impl_) => {
408408
if *first_name == sym::Self_.clone() {
409409
return Some((
410410
ResolveValueResult::Partial(TypeNs::SelfType(impl_), 1, None),
411-
ResolvePathResultPrefixInfo::None,
411+
ResolvePathResultPrefixInfo::default(),
412412
));
413413
}
414414
}
@@ -417,7 +417,7 @@ impl Resolver {
417417
let ty = TypeNs::AdtSelfType(*adt);
418418
return Some((
419419
ResolveValueResult::Partial(ty, 1, None),
420-
ResolvePathResultPrefixInfo::None,
420+
ResolvePathResultPrefixInfo::default(),
421421
));
422422
}
423423
}
@@ -441,7 +441,7 @@ impl Resolver {
441441
if let Some(builtin) = BuiltinType::by_name(first_name) {
442442
return Some((
443443
ResolveValueResult::Partial(TypeNs::BuiltinType(builtin), 1, None),
444-
ResolvePathResultPrefixInfo::None,
444+
ResolvePathResultPrefixInfo::default(),
445445
));
446446
}
447447
}

src/tools/rust-analyzer/crates/hir-ty/src/lower.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use hir_def::{
3232
WherePredicateTypeTarget,
3333
},
3434
lang_item::LangItem,
35-
nameres::{MacroSubNs, ResolvePathResultPrefixInfo},
35+
nameres::MacroSubNs,
3636
path::{GenericArg, GenericArgs, ModPath, Path, PathKind, PathSegment, PathSegments},
3737
resolver::{HasResolver, LifetimeNs, ResolveValueResult, Resolver, TypeNs, ValueNs},
3838
type_ref::{
@@ -826,7 +826,7 @@ impl<'a> TyLoweringContext<'a> {
826826
(segments.take(unresolved_segment - 1), None)
827827
}
828828
ResolveValueResult::ValueNs(ValueNs::EnumVariantId(_), _)
829-
if prefix_info == ResolvePathResultPrefixInfo::Enum =>
829+
if prefix_info.enum_variant =>
830830
{
831831
(segments.strip_last_two(), segments.len().checked_sub(2))
832832
}

src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/generic_args_prohibited.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,31 @@ fn bar() {
575575
// ^^^^^^ 💡 error: generic arguments are not allowed on modules
576576
let _: &foo::<()>::Trait;
577577
// ^^^^^^ 💡 error: generic arguments are not allowed on modules
578+
}
579+
"#,
580+
);
581+
}
582+
583+
#[test]
584+
fn regression_18768() {
585+
check_diagnostics(
586+
r#"
587+
//- minicore: result
588+
//- /foo.rs crate:foo edition:2018
589+
pub mod lib {
590+
mod core {
591+
pub use core::*;
592+
}
593+
pub use self::core::result;
594+
}
595+
596+
pub mod __private {
597+
pub use crate::lib::result::Result::{self, Err, Ok};
598+
}
599+
600+
//- /bar.rs crate:bar deps:foo edition:2018
601+
fn bar() {
602+
_ = foo::__private::Result::<(), ()>::Ok;
578603
}
579604
"#,
580605
);

0 commit comments

Comments
 (0)