mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-08 19:28:54 +00:00
124 lines
2.5 KiB
Rust
124 lines
2.5 KiB
Rust
|
use super::*;
|
||
|
|
||
|
use std::sync::Arc;
|
||
|
|
||
|
use ra_db::SourceDatabase;
|
||
|
|
||
|
fn check_def_map_is_not_recomputed(initial: &str, file_change: &str) {
|
||
|
let (mut db, pos) = MockDatabase::with_position(initial);
|
||
|
let crate_id = db.crate_graph().iter().next().unwrap();
|
||
|
let krate = Crate { crate_id };
|
||
|
{
|
||
|
let events = db.log_executed(|| {
|
||
|
db.crate_def_map(krate);
|
||
|
});
|
||
|
assert!(format!("{:?}", events).contains("crate_def_map"), "{:#?}", events)
|
||
|
}
|
||
|
db.set_file_text(pos.file_id, Arc::new(file_change.to_string()));
|
||
|
|
||
|
{
|
||
|
let events = db.log_executed(|| {
|
||
|
db.crate_def_map(krate);
|
||
|
});
|
||
|
assert!(!format!("{:?}", events).contains("crate_def_map"), "{:#?}", events)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn typing_inside_a_function_should_not_invalidate_def_map() {
|
||
|
check_def_map_is_not_recomputed(
|
||
|
"
|
||
|
//- /lib.rs
|
||
|
mod foo;<|>
|
||
|
|
||
|
use crate::foo::bar::Baz;
|
||
|
|
||
|
fn foo() -> i32 {
|
||
|
1 + 1
|
||
|
}
|
||
|
//- /foo/mod.rs
|
||
|
pub mod bar;
|
||
|
|
||
|
//- /foo/bar.rs
|
||
|
pub struct Baz;
|
||
|
",
|
||
|
"
|
||
|
mod foo;
|
||
|
|
||
|
use crate::foo::bar::Baz;
|
||
|
|
||
|
fn foo() -> i32 { 92 }
|
||
|
",
|
||
|
);
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn adding_inner_items_should_not_invalidate_def_map() {
|
||
|
check_def_map_is_not_recomputed(
|
||
|
"
|
||
|
//- /lib.rs
|
||
|
struct S { a: i32}
|
||
|
enum E { A }
|
||
|
trait T {
|
||
|
fn a() {}
|
||
|
}
|
||
|
mod foo;<|>
|
||
|
impl S {
|
||
|
fn a() {}
|
||
|
}
|
||
|
use crate::foo::bar::Baz;
|
||
|
//- /foo/mod.rs
|
||
|
pub mod bar;
|
||
|
|
||
|
//- /foo/bar.rs
|
||
|
pub struct Baz;
|
||
|
",
|
||
|
"
|
||
|
struct S { a: i32, b: () }
|
||
|
enum E { A, B }
|
||
|
trait T {
|
||
|
fn a() {}
|
||
|
fn b() {}
|
||
|
}
|
||
|
mod foo;<|>
|
||
|
impl S {
|
||
|
fn a() {}
|
||
|
fn b() {}
|
||
|
}
|
||
|
use crate::foo::bar::Baz;
|
||
|
",
|
||
|
);
|
||
|
}
|
||
|
|
||
|
// It would be awesome to make this work, but it's unclear how
|
||
|
#[test]
|
||
|
#[ignore]
|
||
|
fn typing_inside_a_function_inside_a_macro_should_not_invalidate_def_map() {
|
||
|
check_def_map_is_not_recomputed(
|
||
|
"
|
||
|
//- /lib.rs
|
||
|
mod foo;
|
||
|
|
||
|
use crate::foo::bar::Baz;
|
||
|
|
||
|
//- /foo/mod.rs
|
||
|
pub mod bar;
|
||
|
|
||
|
//- /foo/bar.rs
|
||
|
<|>
|
||
|
salsa::query_group! {
|
||
|
trait Baz {
|
||
|
fn foo() -> i32 { 1 + 1 }
|
||
|
}
|
||
|
}
|
||
|
",
|
||
|
"
|
||
|
salsa::query_group! {
|
||
|
trait Baz {
|
||
|
fn foo() -> i32 { 92 }
|
||
|
}
|
||
|
}
|
||
|
",
|
||
|
);
|
||
|
}
|