From 3a3b40a55430756436cb9a0602d4449a5177be69 Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 10 Jun 2020 11:11:47 -0600 Subject: Created goto Self enum variant test --- crates/ra_ide/src/goto_definition.rs | 80 ++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/crates/ra_ide/src/goto_definition.rs b/crates/ra_ide/src/goto_definition.rs index 0798d2c36..450ce0ba7 100644 --- a/crates/ra_ide/src/goto_definition.rs +++ b/crates/ra_ide/src/goto_definition.rs @@ -908,4 +908,84 @@ mod tests { "x: i32|x", ); } + + #[test] + fn goto_def_for_enum_variant_self_pattern_const() { + check_goto( + " + //- /lib.rs + enum Foo { + Bar, + } + impl Foo { + fn baz(self) { + match self { + Self::Bar<|> => {} + } + } + } + ", + "Bar ENUM_VARIANT FileId(1) 15..18 15..18", + "Bar|Bar", + ); + } + + #[test] + fn goto_def_for_enum_variant_self_pattern_record() { + check_goto( + " + //- /lib.rs + enum Foo { + Bar { val: i32 }, + } + impl Foo { + fn baz(self) -> i32 { + match self { + Self::Bar<|> { val } => {} + } + } + } + ", + "Bar ENUM_VARIANT FileId(1) 15..31 15..18", + "Bar { val: i32 }|Bar", + ); + } + + #[test] + fn goto_def_for_enum_variant_self_expr_const() { + check_goto( + " + //- /lib.rs + enum Foo { + Bar, + } + impl Foo { + fn baz(self) { + Self::Bar<|>; + } + } + ", + "Bar ENUM_VARIANT FileId(1) 15..18 15..18", + "Bar|Bar", + ); + } + + #[test] + fn goto_def_for_enum_variant_self_expr_record() { + check_goto( + " + //- /lib.rs + enum Foo { + Bar { val: i32 }, + } + impl Foo { + fn baz(self) { + Self::Bar<|> {val: 4}; + } + } + ", + "Bar ENUM_VARIANT FileId(1) 15..31 15..18", + "Bar { val: i32 }|Bar", + ); + } } -- cgit v1.2.3 From bdf7e70820243812dd27d96c38fb6d5db359c2f1 Mon Sep 17 00:00:00 2001 From: BGluth Date: Mon, 15 Jun 2020 14:30:25 -0600 Subject: Enum variants with `Self::[variant]` now resolve (#4879) --- crates/ra_hir/src/source_analyzer.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/crates/ra_hir/src/source_analyzer.rs b/crates/ra_hir/src/source_analyzer.rs index 757d1e397..1d6c47103 100644 --- a/crates/ra_hir/src/source_analyzer.rs +++ b/crates/ra_hir/src/source_analyzer.rs @@ -216,13 +216,43 @@ impl SourceAnalyzer { if let Some(assoc) = self.infer.as_ref()?.assoc_resolutions_for_expr(expr_id) { return Some(PathResolution::AssocItem(assoc.into())); } + if let Some(VariantId::EnumVariantId(variant)) = + self.infer.as_ref()?.variant_resolution_for_expr(expr_id) + { + return Some(PathResolution::Def(ModuleDef::EnumVariant(variant.into()))); + } } + if let Some(path_pat) = path.syntax().parent().and_then(ast::PathPat::cast) { let pat_id = self.pat_id(&path_pat.into())?; if let Some(assoc) = self.infer.as_ref()?.assoc_resolutions_for_pat(pat_id) { return Some(PathResolution::AssocItem(assoc.into())); } + if let Some(VariantId::EnumVariantId(variant)) = + self.infer.as_ref()?.variant_resolution_for_pat(pat_id) + { + return Some(PathResolution::Def(ModuleDef::EnumVariant(variant.into()))); + } + } + + if let Some(rec_lit) = path.syntax().parent().and_then(ast::RecordLit::cast) { + let expr_id = self.expr_id(db, &rec_lit.into())?; + if let Some(VariantId::EnumVariantId(variant)) = + self.infer.as_ref()?.variant_resolution_for_expr(expr_id) + { + return Some(PathResolution::Def(ModuleDef::EnumVariant(variant.into()))); + } } + + if let Some(rec_pat) = path.syntax().parent().and_then(ast::RecordPat::cast) { + let pat_id = self.pat_id(&rec_pat.into())?; + if let Some(VariantId::EnumVariantId(variant)) = + self.infer.as_ref()?.variant_resolution_for_pat(pat_id) + { + return Some(PathResolution::Def(ModuleDef::EnumVariant(variant.into()))); + } + } + // This must be a normal source file rather than macro file. let hir_path = crate::Path::from_src(path.clone(), &Hygiene::new(db.upcast(), self.file_id))?; -- cgit v1.2.3