use base_db::SourceDatabaseExt; use test_fixture::WithFixture; use triomphe::Arc; use crate::{db::HirDatabase, test_db::TestDB}; use super::visit_module; #[test] fn typing_whitespace_inside_a_function_should_not_invalidate_types() { let (mut db, pos) = TestDB::with_position( " //- /lib.rs fn foo() -> i32 { $01 + 1 }", ); { let events = db.log_executed(|| { let module = db.module_for_file(pos.file_id); let crate_def_map = module.def_map(&db); visit_module(&db, &crate_def_map, module.local_id, &mut |def| { db.infer(def); }); }); assert!(format!("{events:?}").contains("infer")) } let new_text = " fn foo() -> i32 { 1 + 1 }"; db.set_file_text(pos.file_id, Arc::from(new_text)); { let events = db.log_executed(|| { let module = db.module_for_file(pos.file_id); let crate_def_map = module.def_map(&db); visit_module(&db, &crate_def_map, module.local_id, &mut |def| { db.infer(def); }); }); assert!(!format!("{events:?}").contains("infer"), "{events:#?}") } } #[test] fn typing_inside_a_function_should_not_invalidate_types_in_another() { let (mut db, pos) = TestDB::with_position( " //- /lib.rs fn foo() -> f32 { 1.0 + 2.0 } fn bar() -> i32 { $01 + 1 } fn baz() -> i32 { 1 + 1 }", ); { let events = db.log_executed(|| { let module = db.module_for_file(pos.file_id); let crate_def_map = module.def_map(&db); visit_module(&db, &crate_def_map, module.local_id, &mut |def| { db.infer(def); }); }); assert!(format!("{events:?}").contains("infer")) } let new_text = " fn foo() -> f32 { 1.0 + 2.0 } fn bar() -> i32 { 53 } fn baz() -> i32 { 1 + 1 } "; db.set_file_text(pos.file_id, Arc::from(new_text)); { let events = db.log_executed(|| { let module = db.module_for_file(pos.file_id); let crate_def_map = module.def_map(&db); visit_module(&db, &crate_def_map, module.local_id, &mut |def| { db.infer(def); }); }); assert!(format!("{events:?}").matches("infer").count() == 1, "{events:#?}") } }