aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/hir/src/source_analyzer.rs17
-rw-r--r--crates/ide/src/references.rs23
2 files changed, 34 insertions, 6 deletions
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs
index 626c3078a..bed3fa50f 100644
--- a/crates/hir/src/source_analyzer.rs
+++ b/crates/hir/src/source_analyzer.rs
@@ -222,8 +222,9 @@ impl SourceAnalyzer {
222 db: &dyn HirDatabase, 222 db: &dyn HirDatabase,
223 path: &ast::Path, 223 path: &ast::Path,
224 ) -> Option<PathResolution> { 224 ) -> Option<PathResolution> {
225 let parent = || path.syntax().parent();
225 let mut prefer_value_ns = false; 226 let mut prefer_value_ns = false;
226 if let Some(path_expr) = path.syntax().parent().and_then(ast::PathExpr::cast) { 227 if let Some(path_expr) = parent().and_then(ast::PathExpr::cast) {
227 let expr_id = self.expr_id(db, &path_expr.into())?; 228 let expr_id = self.expr_id(db, &path_expr.into())?;
228 let infer = self.infer.as_ref()?; 229 let infer = self.infer.as_ref()?;
229 if let Some(assoc) = infer.assoc_resolutions_for_expr(expr_id) { 230 if let Some(assoc) = infer.assoc_resolutions_for_expr(expr_id) {
@@ -237,7 +238,7 @@ impl SourceAnalyzer {
237 prefer_value_ns = true; 238 prefer_value_ns = true;
238 } 239 }
239 240
240 if let Some(path_pat) = path.syntax().parent().and_then(ast::PathPat::cast) { 241 if let Some(path_pat) = parent().and_then(ast::PathPat::cast) {
241 let pat_id = self.pat_id(&path_pat.into())?; 242 let pat_id = self.pat_id(&path_pat.into())?;
242 if let Some(assoc) = self.infer.as_ref()?.assoc_resolutions_for_pat(pat_id) { 243 if let Some(assoc) = self.infer.as_ref()?.assoc_resolutions_for_pat(pat_id) {
243 return Some(PathResolution::AssocItem(assoc.into())); 244 return Some(PathResolution::AssocItem(assoc.into()));
@@ -249,7 +250,7 @@ impl SourceAnalyzer {
249 } 250 }
250 } 251 }
251 252
252 if let Some(rec_lit) = path.syntax().parent().and_then(ast::RecordExpr::cast) { 253 if let Some(rec_lit) = parent().and_then(ast::RecordExpr::cast) {
253 let expr_id = self.expr_id(db, &rec_lit.into())?; 254 let expr_id = self.expr_id(db, &rec_lit.into())?;
254 if let Some(VariantId::EnumVariantId(variant)) = 255 if let Some(VariantId::EnumVariantId(variant)) =
255 self.infer.as_ref()?.variant_resolution_for_expr(expr_id) 256 self.infer.as_ref()?.variant_resolution_for_expr(expr_id)
@@ -258,8 +259,12 @@ impl SourceAnalyzer {
258 } 259 }
259 } 260 }
260 261
261 if let Some(rec_pat) = path.syntax().parent().and_then(ast::RecordPat::cast) { 262 if let Some(pat) = parent()
262 let pat_id = self.pat_id(&rec_pat.into())?; 263 .and_then(ast::RecordPat::cast)
264 .map(ast::Pat::from)
265 .or_else(|| parent().and_then(ast::TupleStructPat::cast).map(ast::Pat::from))
266 {
267 let pat_id = self.pat_id(&pat)?;
263 if let Some(VariantId::EnumVariantId(variant)) = 268 if let Some(VariantId::EnumVariantId(variant)) =
264 self.infer.as_ref()?.variant_resolution_for_pat(pat_id) 269 self.infer.as_ref()?.variant_resolution_for_pat(pat_id)
265 { 270 {
@@ -272,7 +277,7 @@ impl SourceAnalyzer {
272 277
273 // Case where path is a qualifier of another path, e.g. foo::bar::Baz where we 278 // Case where path is a qualifier of another path, e.g. foo::bar::Baz where we
274 // trying to resolve foo::bar. 279 // trying to resolve foo::bar.
275 if let Some(outer_path) = path.syntax().parent().and_then(ast::Path::cast) { 280 if let Some(outer_path) = parent().and_then(ast::Path::cast) {
276 if let Some(qualifier) = outer_path.qualifier() { 281 if let Some(qualifier) = outer_path.qualifier() {
277 if path == &qualifier { 282 if path == &qualifier {
278 return resolve_hir_path_qualifier(db, &self.resolver, &hir_path); 283 return resolve_hir_path_qualifier(db, &self.resolver, &hir_path);
diff --git a/crates/ide/src/references.rs b/crates/ide/src/references.rs
index 40d9487eb..6999dacee 100644
--- a/crates/ide/src/references.rs
+++ b/crates/ide/src/references.rs
@@ -1114,4 +1114,27 @@ trait Foo {
1114 "#]], 1114 "#]],
1115 ); 1115 );
1116 } 1116 }
1117
1118 #[test]
1119 fn test_self_variant_with_payload() {
1120 check(
1121 r#"
1122enum Foo { Bar() }
1123
1124impl Foo {
1125 fn foo(self) {
1126 match self {
1127 Self::Bar$0() => (),
1128 }
1129 }
1130}
1131
1132"#,
1133 expect![[r#"
1134 Bar Variant FileId(0) 11..16 11..14 Other
1135
1136 FileId(0) 89..92 Other
1137 "#]],
1138 );
1139 }
1117} 1140}