Unnamed repository; edit this file 'description' to name the repository.
Simplify
| -rw-r--r-- | crates/hir/src/source_analyzer.rs | 16 | ||||
| -rw-r--r-- | crates/ide_db/src/defs.rs | 2 |
2 files changed, 9 insertions, 9 deletions
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs index 880596b37c..79163ad4d0 100644 --- a/crates/hir/src/source_analyzer.rs +++ b/crates/hir/src/source_analyzer.rs @@ -291,15 +291,12 @@ impl SourceAnalyzer { } } - if let Some(pat) = parent() - .and_then(ast::RecordPat::cast) - .map(ast::Pat::from) - .or_else(|| parent().and_then(ast::TupleStructPat::cast).map(ast::Pat::from)) - { + let record_pat = parent().and_then(ast::RecordPat::cast).map(ast::Pat::from); + let tuple_struct_pat = || parent().and_then(ast::TupleStructPat::cast).map(ast::Pat::from); + if let Some(pat) = record_pat.or_else(tuple_struct_pat) { let pat_id = self.pat_id(&pat)?; - if let Some(VariantId::EnumVariantId(variant)) = - self.infer.as_ref()?.variant_resolution_for_pat(pat_id) - { + let variant_res_for_pat = self.infer.as_ref()?.variant_resolution_for_pat(pat_id); + if let Some(VariantId::EnumVariantId(variant)) = variant_res_for_pat { return Some(PathResolution::Def(ModuleDef::Variant(variant.into()))); } } @@ -335,6 +332,9 @@ impl SourceAnalyzer { } } } else if is_path_of_attr { + // Case where we are resolving the final path segment of a path in an attribute + // in this case we have to check for inert/builtin attributes and tools and prioritize + // resolution of attributes over other namesapces let name_ref = path.as_single_name_ref(); let builtin = name_ref.as_ref().map(ast::NameRef::text).as_deref().and_then(BuiltinAttr::by_name); diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index ef2f0f940f..30ebf7828a 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs @@ -447,7 +447,7 @@ impl NameRefClass { } } - if let Some(path) = name_ref.syntax().ancestors().find_map(ast::Path::cast) { + if let Some(path) = ast::PathSegment::cast(parent.clone()).map(|it| it.parent_path()) { if path.qualifier().is_none() { if let Some(macro_call) = path.syntax().parent().and_then(ast::MacroCall::cast) { // Only use this to resolve single-segment macro calls like `foo!()`. Multi-segment |