diff options
Diffstat (limited to 'crates/ra_hir_ty/src/tests.rs')
-rw-r--r-- | crates/ra_hir_ty/src/tests.rs | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/crates/ra_hir_ty/src/tests.rs b/crates/ra_hir_ty/src/tests.rs index 2a85ce85d..5424e6bb1 100644 --- a/crates/ra_hir_ty/src/tests.rs +++ b/crates/ra_hir_ty/src/tests.rs | |||
@@ -17,17 +17,18 @@ use hir_def::{ | |||
17 | item_scope::ItemScope, | 17 | item_scope::ItemScope, |
18 | keys, | 18 | keys, |
19 | nameres::CrateDefMap, | 19 | nameres::CrateDefMap, |
20 | AssocItemId, DefWithBodyId, LocalModuleId, Lookup, ModuleDefId, ModuleId, | 20 | AssocItemId, DefWithBodyId, LocalModuleId, Lookup, ModuleDefId, |
21 | }; | 21 | }; |
22 | use hir_expand::{db::AstDatabase, InFile}; | 22 | use hir_expand::{db::AstDatabase, InFile}; |
23 | use insta::assert_snapshot; | 23 | use insta::assert_snapshot; |
24 | use ra_db::{fixture::WithFixture, salsa::Database, FilePosition, SourceDatabase}; | 24 | use ra_db::{fixture::WithFixture, salsa::Database, FileRange, SourceDatabase}; |
25 | use ra_syntax::{ | 25 | use ra_syntax::{ |
26 | algo, | 26 | algo, |
27 | ast::{self, AstNode}, | 27 | ast::{self, AstNode}, |
28 | SyntaxNode, | 28 | SyntaxNode, |
29 | }; | 29 | }; |
30 | use stdx::format_to; | 30 | use stdx::format_to; |
31 | use test_utils::extract_annotations; | ||
31 | 32 | ||
32 | use crate::{ | 33 | use crate::{ |
33 | db::HirDatabase, display::HirDisplay, infer::TypeMismatch, test_db::TestDB, InferenceResult, Ty, | 34 | db::HirDatabase, display::HirDisplay, infer::TypeMismatch, test_db::TestDB, InferenceResult, Ty, |
@@ -37,21 +38,38 @@ use crate::{ | |||
37 | // against snapshots of the expected results using insta. Use cargo-insta to | 38 | // against snapshots of the expected results using insta. Use cargo-insta to |
38 | // update the snapshots. | 39 | // update the snapshots. |
39 | 40 | ||
40 | fn type_at_pos(db: &TestDB, pos: FilePosition) -> String { | 41 | fn check_types(ra_fixture: &str) { |
41 | type_at_pos_displayed(db, pos, |ty, _| ty.display(db).to_string()) | 42 | check_types_impl(ra_fixture, false) |
42 | } | 43 | } |
43 | 44 | ||
44 | fn displayed_source_at_pos(db: &TestDB, pos: FilePosition) -> String { | 45 | fn check_types_source_code(ra_fixture: &str) { |
45 | type_at_pos_displayed(db, pos, |ty, module_id| ty.display_source_code(db, module_id).unwrap()) | 46 | check_types_impl(ra_fixture, true) |
46 | } | 47 | } |
47 | 48 | ||
48 | fn type_at_pos_displayed( | 49 | fn check_types_impl(ra_fixture: &str, display_source: bool) { |
49 | db: &TestDB, | 50 | let db = TestDB::with_files(ra_fixture); |
50 | pos: FilePosition, | 51 | let mut checked_one = false; |
51 | display_fn: impl FnOnce(&Ty, ModuleId) -> String, | 52 | for file_id in db.all_files() { |
52 | ) -> String { | 53 | let text = db.parse(file_id).syntax_node().to_string(); |
54 | let annotations = extract_annotations(&text); | ||
55 | for (range, expected) in annotations { | ||
56 | let ty = type_at_range(&db, FileRange { file_id, range }); | ||
57 | let actual = if display_source { | ||
58 | let module = db.module_for_file(file_id); | ||
59 | ty.display_source_code(&db, module).unwrap() | ||
60 | } else { | ||
61 | ty.display(&db).to_string() | ||
62 | }; | ||
63 | assert_eq!(expected, actual); | ||
64 | checked_one = true; | ||
65 | } | ||
66 | } | ||
67 | assert!(checked_one, "no `//^` annotations found"); | ||
68 | } | ||
69 | |||
70 | fn type_at_range(db: &TestDB, pos: FileRange) -> Ty { | ||
53 | let file = db.parse(pos.file_id).ok().unwrap(); | 71 | let file = db.parse(pos.file_id).ok().unwrap(); |
54 | let expr = algo::find_node_at_offset::<ast::Expr>(file.syntax(), pos.offset).unwrap(); | 72 | let expr = algo::find_node_at_range::<ast::Expr>(file.syntax(), pos.range).unwrap(); |
55 | let fn_def = expr.syntax().ancestors().find_map(ast::FnDef::cast).unwrap(); | 73 | let fn_def = expr.syntax().ancestors().find_map(ast::FnDef::cast).unwrap(); |
56 | let module = db.module_for_file(pos.file_id); | 74 | let module = db.module_for_file(pos.file_id); |
57 | let func = *module.child_by_source(db)[keys::FUNCTION] | 75 | let func = *module.child_by_source(db)[keys::FUNCTION] |
@@ -61,17 +79,11 @@ fn type_at_pos_displayed( | |||
61 | let (_body, source_map) = db.body_with_source_map(func.into()); | 79 | let (_body, source_map) = db.body_with_source_map(func.into()); |
62 | if let Some(expr_id) = source_map.node_expr(InFile::new(pos.file_id.into(), &expr)) { | 80 | if let Some(expr_id) = source_map.node_expr(InFile::new(pos.file_id.into(), &expr)) { |
63 | let infer = db.infer(func.into()); | 81 | let infer = db.infer(func.into()); |
64 | let ty = &infer[expr_id]; | 82 | return infer[expr_id].clone(); |
65 | return display_fn(ty, module); | ||
66 | } | 83 | } |
67 | panic!("Can't find expression") | 84 | panic!("Can't find expression") |
68 | } | 85 | } |
69 | 86 | ||
70 | fn type_at(ra_fixture: &str) -> String { | ||
71 | let (db, file_pos) = TestDB::with_position(ra_fixture); | ||
72 | type_at_pos(&db, file_pos) | ||
73 | } | ||
74 | |||
75 | fn infer(ra_fixture: &str) -> String { | 87 | fn infer(ra_fixture: &str) -> String { |
76 | infer_with_mismatches(ra_fixture, false) | 88 | infer_with_mismatches(ra_fixture, false) |
77 | } | 89 | } |