Make HirFileId, EditionedFileId and macro files Salsa struct

And make more queries non-interned.

Also flip the default for queries, now the default is to not intern and to intern a query you need to say `invoke_interned`.
This commit is contained in:
Chayim Refael Friedman 2025-04-18 12:10:29 +03:00
parent 02ade79631
commit c58ddafe90
195 changed files with 1473 additions and 1525 deletions

View file

@ -136,7 +136,7 @@ pub(crate) fn query_group_impl(
let (_attrs, salsa_attrs) = filter_attrs(method.attrs.clone());
let mut query_kind = QueryKind::Tracked;
let mut query_kind = QueryKind::TrackedWithSalsaStruct;
let mut invoke = None;
let mut cycle = None;
let mut interned_struct_path = None;
@ -183,14 +183,17 @@ pub(crate) fn query_group_impl(
interned_struct_path = Some(path.path.clone());
query_kind = QueryKind::Interned;
}
"invoke_interned" => {
let path = syn::parse::<Parenthesized<Path>>(tts)?;
invoke = Some(path.0.clone());
query_kind = QueryKind::Tracked;
}
"invoke" => {
let path = syn::parse::<Parenthesized<Path>>(tts)?;
invoke = Some(path.0.clone());
}
"invoke_actual" => {
let path = syn::parse::<Parenthesized<Path>>(tts)?;
invoke = Some(path.0.clone());
query_kind = QueryKind::TrackedWithSalsaStruct;
if query_kind != QueryKind::Transparent {
query_kind = QueryKind::TrackedWithSalsaStruct;
}
}
"tracked" if method.default.is_some() => {
query_kind = QueryKind::TrackedWithSalsaStruct;
@ -292,10 +295,6 @@ pub(crate) fn query_group_impl(
trait_methods.push(Queries::TrackedQuery(method));
}
(QueryKind::TrackedWithSalsaStruct, invoke) => {
// while it is possible to make this reachable, it's not really worthwhile for a migration aid.
// doing this would require attaching an attribute to the salsa struct parameter
// in the query.
assert_ne!(invoke.is_none(), method.default.is_none());
let method = TrackedQuery {
trait_name: trait_name_ident.clone(),
generated_struct: None,

View file

@ -2,12 +2,16 @@ use query_group_macro::query_group;
#[query_group]
pub trait ArityDb: salsa::Database {
#[salsa::invoke_interned(one)]
fn one(&self, a: ()) -> String;
#[salsa::invoke_interned(two)]
fn two(&self, a: (), b: ()) -> String;
#[salsa::invoke_interned(three)]
fn three(&self, a: (), b: (), c: ()) -> String;
#[salsa::invoke_interned(none)]
fn none(&self) -> String;
}

View file

@ -94,12 +94,7 @@ fn cycle_a(db: &dyn CycleDatabase, abc: ABC) -> Result<(), Error> {
abc.a(db).invoke(db, abc)
}
fn recover_a(
_db: &dyn CycleDatabase,
cycle: &salsa::Cycle,
_: CycleDatabaseData,
_abc: ABC,
) -> Result<(), Error> {
fn recover_a(_db: &dyn CycleDatabase, cycle: &salsa::Cycle, _abc: ABC) -> Result<(), Error> {
Err(Error { cycle: cycle.participant_keys().map(|k| format!("{k:?}")).collect() })
}
@ -107,12 +102,7 @@ fn cycle_b(db: &dyn CycleDatabase, abc: ABC) -> Result<(), Error> {
abc.b(db).invoke(db, abc)
}
fn recover_b(
_db: &dyn CycleDatabase,
cycle: &salsa::Cycle,
_: CycleDatabaseData,
_abc: ABC,
) -> Result<(), Error> {
fn recover_b(_db: &dyn CycleDatabase, cycle: &salsa::Cycle, _abc: ABC) -> Result<(), Error> {
Err(Error { cycle: cycle.participant_keys().map(|k| format!("{k:?}")).collect() })
}
@ -156,11 +146,11 @@ fn inner_cycle() {
let err = db.cycle_c(abc);
assert!(err.is_err());
let expected = expect![[r#"
[
"cycle_a_shim(Id(1400))",
"cycle_b_shim(Id(1000))",
]
"#]];
[
"cycle_a_shim(Id(0))",
"cycle_b_shim(Id(0))",
]
"#]];
expected.assert_debug_eq(&err.unwrap_err().cycle);
}
@ -241,16 +231,16 @@ fn cycle_multiple() {
let expected = expect![[r#"
(
[
"cycle_a_shim(Id(1000))",
"cycle_b_shim(Id(1400))",
"cycle_a_shim(Id(0))",
"cycle_b_shim(Id(0))",
],
[
"cycle_a_shim(Id(1000))",
"cycle_b_shim(Id(1400))",
"cycle_a_shim(Id(0))",
"cycle_b_shim(Id(0))",
],
[
"cycle_a_shim(Id(1000))",
"cycle_b_shim(Id(1400))",
"cycle_a_shim(Id(0))",
"cycle_b_shim(Id(0))",
],
)
"#]];
@ -267,8 +257,8 @@ fn cycle_mixed_1() {
let expected = expect![[r#"
[
"cycle_b_shim(Id(1000))",
"cycle_c_shim(Id(c00))",
"cycle_b_shim(Id(0))",
"cycle_c_shim(Id(0))",
]
"#]];
expected.assert_debug_eq(&db.cycle_c(abc).unwrap_err().cycle);

View file

@ -12,13 +12,14 @@ pub trait HelloWorldDatabase: salsa::Database {
fn input_string(&self) -> String;
// unadorned query
#[salsa::invoke_interned(length_query)]
fn length_query(&self, key: ()) -> usize;
// unadorned query
fn length_query_with_no_params(&self) -> usize;
// renamed/invoke query
#[salsa::invoke(invoke_length_query_actual)]
#[salsa::invoke_interned(invoke_length_query_actual)]
fn invoke_length_query(&self, key: ()) -> usize;
// not a query. should not invoked
@ -26,7 +27,7 @@ pub trait HelloWorldDatabase: salsa::Database {
fn transparent_length(&self, key: ()) -> usize;
#[salsa::transparent]
#[salsa::invoke(transparent_and_invoke_length_actual)]
#[salsa::invoke_interned(transparent_and_invoke_length_actual)]
fn transparent_and_invoke_length(&self, key: ()) -> usize;
}
@ -121,5 +122,8 @@ fn transparent_invoke() {
"salsa_event(WillExecute { database_key: create_data_HelloWorldDatabase(Id(0)) })",
"salsa_event(WillCheckCancellation)",
"salsa_event(DidValidateMemoizedValue { database_key: create_data_HelloWorldDatabase(Id(0)) })",
"salsa_event(WillCheckCancellation)",
"salsa_event(WillExecute { database_key: transparent_and_invoke_length_shim(Id(800)) })",
"salsa_event(WillCheckCancellation)",
]"#]]);
}

View file

@ -45,8 +45,6 @@ fn intern_with_query() {
db.assert_logs(expect![[r#"
[
"salsa_event(WillCheckCancellation)",
"salsa_event(WillExecute { database_key: create_data_InternedDB(Id(400)) })",
"salsa_event(WillCheckCancellation)",
"salsa_event(WillExecute { database_key: interned_len_shim(Id(c00)) })",
"salsa_event(WillExecute { database_key: interned_len_shim(Id(0)) })",
]"#]]);
}

View file

@ -11,10 +11,11 @@ pub trait LruDB: salsa::Database {
fn input_string(&self) -> String;
#[salsa::lru(16)]
#[salsa::invoke_interned(length_query)]
fn length_query(&self, key: ()) -> usize;
#[salsa::lru(16)]
#[salsa::invoke(invoked_query)]
#[salsa::invoke_interned(invoked_query)]
fn length_query_invoke(&self, key: ()) -> usize;
}

View file

@ -6,11 +6,13 @@ pub trait DatabaseOne: salsa::Database {
fn input_string(&self) -> String;
// unadorned query
#[salsa::invoke_interned(length)]
fn length(&self, key: ()) -> usize;
}
#[query_group]
pub trait DatabaseTwo: DatabaseOne {
#[salsa::invoke_interned(second_length)]
fn second_length(&self, key: ()) -> usize;
}

View file

@ -46,9 +46,7 @@ fn unadorned_query() {
db.assert_logs(expect![[r#"
[
"salsa_event(WillCheckCancellation)",
"salsa_event(WillExecute { database_key: create_data_PartialMigrationDatabase(Id(400)) })",
"salsa_event(WillCheckCancellation)",
"salsa_event(WillExecute { database_key: length_query_shim(Id(c00)) })",
"salsa_event(WillExecute { database_key: length_query_shim(Id(0)) })",
]"#]]);
}
@ -63,9 +61,7 @@ fn invoke_query() {
db.assert_logs(expect![[r#"
[
"salsa_event(WillCheckCancellation)",
"salsa_event(WillExecute { database_key: create_data_PartialMigrationDatabase(Id(400)) })",
"salsa_event(WillCheckCancellation)",
"salsa_event(WillExecute { database_key: invoke_length_query_shim(Id(c00)) })",
"salsa_event(WillExecute { database_key: invoke_length_query_shim(Id(0)) })",
]"#]]);
}
@ -81,9 +77,7 @@ fn invoke_tracked_query() {
db.assert_logs(expect![[r#"
[
"salsa_event(WillCheckCancellation)",
"salsa_event(WillExecute { database_key: create_data_PartialMigrationDatabase(Id(400)) })",
"salsa_event(WillCheckCancellation)",
"salsa_event(WillExecute { database_key: invoke_length_tracked_shim(Id(c00)) })",
"salsa_event(WillExecute { database_key: invoke_length_tracked_shim(Id(0)) })",
"salsa_event(WillCheckCancellation)",
"salsa_event(WillExecute { database_key: invoke_length_tracked_actual(Id(0)) })",
]"#]]);

View file

@ -12,8 +12,10 @@ pub trait ResultDatabase: salsa::Database {
#[salsa::input]
fn input_string(&self) -> String;
#[salsa::invoke_interned(length)]
fn length(&self, key: ()) -> Result<usize, Error>;
#[salsa::invoke_interned(length2)]
fn length2(&self, key: ()) -> Result<usize, Error>;
}

View file

@ -8,6 +8,7 @@ pub trait SourceDb: salsa::Database {
#[query_group]
pub trait RootDb: SourceDb {
#[salsa::invoke_interned(parse)]
fn parse(&self, id: usize) -> String;
}

View file

@ -9,6 +9,7 @@ pub trait HelloWorldDatabase: salsa::Database {
#[salsa::input]
fn input_string(&self) -> String;
#[salsa::invoke_interned(length_query)]
fn length_query(&self, key: ()) -> (usize, usize);
}