aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2019-10-08 12:46:14 +0100
committerGitHub <[email protected]>2019-10-08 12:46:14 +0100
commit92cf0eba93b8d2705ed39bef1a4ea665ed3c25dc (patch)
treea015a8a8162acacb61b3353b4642c93cd80e51ae /crates/ra_hir/src/ty
parent93199002af05f3a3dfd274fe10633372f2471b73 (diff)
parentb043358be936b7f139efd49b7d187d64e319830e (diff)
Merge #1924
1924: Support inferring&completing `Self` type in enum/struct/union definitions r=ice1000 a=ice1000 Signed-off-by: ice1000 <[email protected]> An attempt to fix #1908. This code works, but I believe the implementation is ugly. Please give me suggestions! Co-authored-by: ice1000 <[email protected]>
Diffstat (limited to 'crates/ra_hir/src/ty')
-rw-r--r--crates/ra_hir/src/ty/infer.rs1
-rw-r--r--crates/ra_hir/src/ty/lower.rs1
-rw-r--r--crates/ra_hir/src/ty/tests.rs19
3 files changed, 21 insertions, 0 deletions
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs
index ca9aefc42..a69f04ff1 100644
--- a/crates/ra_hir/src/ty/infer.rs
+++ b/crates/ra_hir/src/ty/infer.rs
@@ -559,6 +559,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
559 match resolver.resolve_path_in_type_ns_fully(self.db, &path) { 559 match resolver.resolve_path_in_type_ns_fully(self.db, &path) {
560 Some(TypeNs::Adt(Adt::Struct(it))) => it.into(), 560 Some(TypeNs::Adt(Adt::Struct(it))) => it.into(),
561 Some(TypeNs::Adt(Adt::Union(it))) => it.into(), 561 Some(TypeNs::Adt(Adt::Union(it))) => it.into(),
562 Some(TypeNs::AdtSelfType(adt)) => adt.into(),
562 Some(TypeNs::EnumVariant(it)) => it.into(), 563 Some(TypeNs::EnumVariant(it)) => it.into(),
563 Some(TypeNs::TypeAlias(it)) => it.into(), 564 Some(TypeNs::TypeAlias(it)) => it.into(),
564 565
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs
index 4b67c82e7..a604c02e2 100644
--- a/crates/ra_hir/src/ty/lower.rs
+++ b/crates/ra_hir/src/ty/lower.rs
@@ -175,6 +175,7 @@ impl Ty {
175 Ty::Param { idx, name } 175 Ty::Param { idx, name }
176 } 176 }
177 TypeNs::SelfType(impl_block) => impl_block.target_ty(db), 177 TypeNs::SelfType(impl_block) => impl_block.target_ty(db),
178 TypeNs::AdtSelfType(adt) => adt.ty(db),
178 179
179 TypeNs::Adt(it) => Ty::from_hir_path_inner(db, resolver, resolved_segment, it.into()), 180 TypeNs::Adt(it) => Ty::from_hir_path_inner(db, resolver, resolved_segment, it.into()),
180 TypeNs::BuiltinType(it) => { 181 TypeNs::BuiltinType(it) => {
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs
index 25dad81eb..03b30adcd 100644
--- a/crates/ra_hir/src/ty/tests.rs
+++ b/crates/ra_hir/src/ty/tests.rs
@@ -135,6 +135,25 @@ mod boxed {
135} 135}
136 136
137#[test] 137#[test]
138fn infer_adt_self() {
139 let (db, pos) = MockDatabase::with_position(
140 r#"
141//- /main.rs
142enum Nat { Succ(Self), Demo(Nat), Zero }
143
144fn test() {
145 let foo: Nat = Nat::Zero;
146 if let Nat::Succ(x) = foo {
147 x<|>
148 }
149}
150
151"#,
152 );
153 assert_eq!("Nat", type_at_pos(&db, pos));
154}
155
156#[test]
138fn infer_try() { 157fn infer_try() {
139 let (mut db, pos) = MockDatabase::with_position( 158 let (mut db, pos) = MockDatabase::with_position(
140 r#" 159 r#"