Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/context/tests.rs')
-rw-r--r--crates/ide-completion/src/context/tests.rs96
1 files changed, 94 insertions, 2 deletions
diff --git a/crates/ide-completion/src/context/tests.rs b/crates/ide-completion/src/context/tests.rs
index 75c20968e1..445afa75f3 100644
--- a/crates/ide-completion/src/context/tests.rs
+++ b/crates/ide-completion/src/context/tests.rs
@@ -1,3 +1,4 @@
+use base_db::salsa;
use expect_test::{Expect, expect};
use hir::HirDisplay;
@@ -9,11 +10,16 @@ use crate::{
fn check_expected_type_and_name(#[rust_analyzer::rust_fixture] ra_fixture: &str, expect: Expect) {
let (db, pos) = position(ra_fixture);
let config = TEST_CONFIG;
- let (completion_context, _analysis) = CompletionContext::new(&db, pos, &config).unwrap();
+ let (completion_context, _analysis) =
+ salsa::attach(&db, || CompletionContext::new(&db, pos, &config).unwrap());
let ty = completion_context
.expected_type
- .map(|t| t.display_test(&db, completion_context.krate.to_display_target(&db)).to_string())
+ .map(|t| {
+ salsa::attach(&db, || {
+ t.display_test(&db, completion_context.krate.to_display_target(&db)).to_string()
+ })
+ })
.unwrap_or("?".to_owned());
let name =
@@ -434,3 +440,89 @@ fn f(thing: u32) -> &u32 {
expect!["ty: u32, name: ?"],
);
}
+
+#[test]
+fn expected_type_assign() {
+ check_expected_type_and_name(
+ r#"
+enum State { Stop }
+fn foo() {
+ let x: &mut State = &mut State::Stop;
+ x = $0;
+}
+"#,
+ expect![[r#"ty: &'_ mut State, name: ?"#]],
+ );
+}
+
+#[test]
+fn expected_type_deref_assign() {
+ check_expected_type_and_name(
+ r#"
+enum State { Stop }
+fn foo() {
+ let x: &mut State = &mut State::Stop;
+ match x {
+ State::Stop => {
+ *x = $0;
+ },
+ }
+}
+"#,
+ expect![[r#"ty: State, name: ?"#]],
+ );
+}
+
+#[test]
+fn expected_type_deref_assign_at_block_end() {
+ check_expected_type_and_name(
+ r#"
+enum State { Stop }
+fn foo() {
+ let x: &mut State = &mut State::Stop;
+ match x {
+ State::Stop => {
+ *x = $0
+ },
+ }
+}
+"#,
+ expect![[r#"ty: State, name: ?"#]],
+ );
+}
+
+#[test]
+fn expected_type_return_expr() {
+ check_expected_type_and_name(
+ r#"
+enum State { Stop }
+fn foo() -> State {
+ let _: i32 = if true {
+ 8
+ } else {
+ return $0;
+ };
+}
+"#,
+ expect![[r#"ty: State, name: ?"#]],
+ );
+}
+
+#[test]
+fn expected_type_return_expr_in_closure() {
+ check_expected_type_and_name(
+ r#"
+enum State { Stop }
+fn foo() {
+ let _f: fn() -> State = || {
+ let _: i32 = if true {
+ 8
+ } else {
+ return $0;
+ };
+ };
+}
+"#,
+ expect![[r#"ty: State, name: ?"#]],
+ );
+}