diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index cd501d1f69..58db6832d1 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -465,7 +465,7 @@ impl Enum { // ...and add generic params, if present let p = self.generic_params(db); let r = if !p.params.is_empty() { r.push_generic_params_scope(p) } else { r }; - r.push_scope(Scope::AdtScope(From::from(self))) + r.push_scope(Scope::AdtScope(self.into())) } } diff --git a/crates/ra_hir/src/resolve.rs b/crates/ra_hir/src/resolve.rs index c46f7e157c..3c797c0c3a 100644 --- a/crates/ra_hir/src/resolve.rs +++ b/crates/ra_hir/src/resolve.rs @@ -45,7 +45,7 @@ pub(crate) enum Scope { GenericParams(Arc), /// Brings `Self` in `impl` block into scope ImplBlockScope(ImplBlock), - /// Brings `Self` in enum definition into scope + /// Brings `Self` in enum, struct and union definitions into scope AdtScope(Adt), /// Local bindings ExprScope(ExprScope), diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index 9e5d42509c..a69f04ff15 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs @@ -559,9 +559,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { match resolver.resolve_path_in_type_ns_fully(self.db, &path) { Some(TypeNs::Adt(Adt::Struct(it))) => it.into(), Some(TypeNs::Adt(Adt::Union(it))) => it.into(), - Some(TypeNs::AdtSelfType(Adt::Struct(it))) => it.into(), - Some(TypeNs::AdtSelfType(Adt::Union(it))) => it.into(), - Some(TypeNs::AdtSelfType(Adt::Enum(it))) => it.into(), + Some(TypeNs::AdtSelfType(adt)) => adt.into(), Some(TypeNs::EnumVariant(it)) => it.into(), Some(TypeNs::TypeAlias(it)) => it.into(), diff --git a/crates/ra_ide_api/src/completion/complete_scope.rs b/crates/ra_ide_api/src/completion/complete_scope.rs index 515a6285c1..38a6c3d37b 100644 --- a/crates/ra_ide_api/src/completion/complete_scope.rs +++ b/crates/ra_ide_api/src/completion/complete_scope.rs @@ -309,6 +309,35 @@ mod tests { ); } + #[test] + fn completes_self_in_enum() { + assert_debug_snapshot!( + do_reference_completion( + r" + enum X { + Y(<|>) + } + " + ), + @r###"[ + CompletionItem { + label: "Self", + source_range: [48; 48), + delete: [48; 48), + insert: "Self", + kind: TypeParam, + }, + CompletionItem { + label: "X", + source_range: [48; 48), + delete: [48; 48), + insert: "X", + kind: Enum, + }, +]"### + ); + } + #[test] fn completes_module_items() { assert_debug_snapshot!(