Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir/eval/tests.rs')
-rw-r--r--crates/hir-ty/src/mir/eval/tests.rs149
1 files changed, 87 insertions, 62 deletions
diff --git a/crates/hir-ty/src/mir/eval/tests.rs b/crates/hir-ty/src/mir/eval/tests.rs
index c1f86960e1..2a6e3a147a 100644
--- a/crates/hir-ty/src/mir/eval/tests.rs
+++ b/crates/hir-ty/src/mir/eval/tests.rs
@@ -5,39 +5,44 @@ use syntax::{TextRange, TextSize};
use test_fixture::WithFixture;
use crate::display::DisplayTarget;
-use crate::{Interner, Substitution, db::HirDatabase, mir::MirLowerError, test_db::TestDB};
+use crate::{
+ Interner, Substitution, db::HirDatabase, mir::MirLowerError, setup_tracing, test_db::TestDB,
+};
use super::{MirEvalError, interpret_mir};
fn eval_main(db: &TestDB, file_id: EditionedFileId) -> Result<(String, String), MirEvalError> {
- let module_id = db.module_for_file(file_id.file_id(db));
- let def_map = module_id.def_map(db);
- let scope = &def_map[module_id.local_id].scope;
- let func_id = scope
- .declarations()
- .find_map(|x| match x {
- hir_def::ModuleDefId::FunctionId(x) => {
- if db.function_signature(x).name.display(db, Edition::CURRENT).to_string() == "main"
- {
- Some(x)
- } else {
- None
+ salsa::attach(db, || {
+ let module_id = db.module_for_file(file_id.file_id(db));
+ let def_map = module_id.def_map(db);
+ let scope = &def_map[module_id.local_id].scope;
+ let func_id = scope
+ .declarations()
+ .find_map(|x| match x {
+ hir_def::ModuleDefId::FunctionId(x) => {
+ if db.function_signature(x).name.display(db, Edition::CURRENT).to_string()
+ == "main"
+ {
+ Some(x)
+ } else {
+ None
+ }
}
- }
- _ => None,
- })
- .expect("no main function found");
- let body = db
- .monomorphized_mir_body(
- func_id.into(),
- Substitution::empty(Interner),
- db.trait_environment(func_id.into()),
- )
- .map_err(|e| MirEvalError::MirLowerError(func_id, e))?;
-
- let (result, output) = interpret_mir(db, body, false, None)?;
- result?;
- Ok((output.stdout().into_owned(), output.stderr().into_owned()))
+ _ => None,
+ })
+ .expect("no main function found");
+ let body = db
+ .monomorphized_mir_body(
+ func_id.into(),
+ Substitution::empty(Interner),
+ db.trait_environment(func_id.into()),
+ )
+ .map_err(|e| MirEvalError::MirLowerError(func_id, e))?;
+
+ let (result, output) = interpret_mir(db, body, false, None)?;
+ result?;
+ Ok((output.stdout().into_owned(), output.stderr().into_owned()))
+ })
}
fn check_pass(#[rust_analyzer::rust_fixture] ra_fixture: &str) {
@@ -49,44 +54,62 @@ fn check_pass_and_stdio(
expected_stdout: &str,
expected_stderr: &str,
) {
+ let _tracing = setup_tracing();
let (db, file_ids) = TestDB::with_many_files(ra_fixture);
- let file_id = *file_ids.last().unwrap();
- let x = eval_main(&db, file_id);
- match x {
- Err(e) => {
- let mut err = String::new();
- let line_index = |size: TextSize| {
- let mut size = u32::from(size) as usize;
- let lines = ra_fixture.lines().enumerate();
- for (i, l) in lines {
- if let Some(x) = size.checked_sub(l.len()) {
- size = x;
- } else {
- return (i, size);
+ salsa::attach(&db, || {
+ let file_id = *file_ids.last().unwrap();
+ let x = eval_main(&db, file_id);
+ match x {
+ Err(e) => {
+ let mut err = String::new();
+ let line_index = |size: TextSize| {
+ let mut size = u32::from(size) as usize;
+ let lines = ra_fixture.lines().enumerate();
+ for (i, l) in lines {
+ if let Some(x) = size.checked_sub(l.len()) {
+ size = x;
+ } else {
+ return (i, size);
+ }
}
- }
- (usize::MAX, size)
- };
- let span_formatter = |file, range: TextRange| {
- format!("{:?} {:?}..{:?}", file, line_index(range.start()), line_index(range.end()))
- };
- let krate = db.module_for_file(file_id.file_id(&db)).krate();
- e.pretty_print(&mut err, &db, span_formatter, DisplayTarget::from_crate(&db, krate))
+ (usize::MAX, size)
+ };
+ let span_formatter = |file, range: TextRange| {
+ format!(
+ "{:?} {:?}..{:?}",
+ file,
+ line_index(range.start()),
+ line_index(range.end())
+ )
+ };
+ let krate = db.module_for_file(file_id.file_id(&db)).krate();
+ e.pretty_print(
+ &mut err,
+ &db,
+ span_formatter,
+ DisplayTarget::from_crate(&db, krate),
+ )
.unwrap();
- panic!("Error in interpreting: {err}");
- }
- Ok((stdout, stderr)) => {
- assert_eq!(stdout, expected_stdout);
- assert_eq!(stderr, expected_stderr);
+ panic!("Error in interpreting: {err}");
+ }
+ Ok((stdout, stderr)) => {
+ assert_eq!(stdout, expected_stdout);
+ assert_eq!(stderr, expected_stderr);
+ }
}
- }
+ })
}
fn check_panic(#[rust_analyzer::rust_fixture] ra_fixture: &str, expected_panic: &str) {
let (db, file_ids) = TestDB::with_many_files(ra_fixture);
- let file_id = *file_ids.last().unwrap();
- let e = eval_main(&db, file_id).unwrap_err();
- assert_eq!(e.is_panic().unwrap_or_else(|| panic!("unexpected error: {e:?}")), expected_panic);
+ salsa::attach(&db, || {
+ let file_id = *file_ids.last().unwrap();
+ let e = eval_main(&db, file_id).unwrap_err();
+ assert_eq!(
+ e.is_panic().unwrap_or_else(|| panic!("unexpected error: {e:?}")),
+ expected_panic
+ );
+ })
}
fn check_error_with(
@@ -94,9 +117,11 @@ fn check_error_with(
expect_err: impl FnOnce(MirEvalError) -> bool,
) {
let (db, file_ids) = TestDB::with_many_files(ra_fixture);
- let file_id = *file_ids.last().unwrap();
- let e = eval_main(&db, file_id).unwrap_err();
- assert!(expect_err(e));
+ salsa::attach(&db, || {
+ let file_id = *file_ids.last().unwrap();
+ let e = eval_main(&db, file_id).unwrap_err();
+ assert!(expect_err(e));
+ })
}
#[test]
@@ -489,7 +514,7 @@ fn main() {
fn from_fn() {
check_pass(
r#"
-//- minicore: fn, iterator
+//- minicore: fn, iterator, sized
struct FromFn<F>(F);
impl<T, F: FnMut() -> Option<T>> Iterator for FromFn<F> {