salsa/tests/return_mode.rs
CheaterCodes 13a2bd7461
Changed return_ref syntax to returns(as_ref) and returns(cloned) (#772)
* Changed `return_ref` syntax to `returns(as_ref)` and `returns(cloned)`

* Implement

* renamed module for return_mode

* Rename macro, fix docs, add tests, validate return modes

* Cargo fmt

---------

Co-authored-by: Micha Reiser <micha@reiser.io>
2025-05-09 07:28:54 +00:00

172 lines
3.7 KiB
Rust

use salsa::Database;
#[salsa::input]
struct DefaultInput {
text: String,
}
#[salsa::tracked]
fn default_fn(db: &dyn Database, input: DefaultInput) -> String {
let input: String = input.text(db);
input
}
#[test]
fn default_test() {
salsa::DatabaseImpl::new().attach(|db| {
let input = DefaultInput::new(db, "Test".into());
let x: String = default_fn(db, input);
expect_test::expect![[r#"
"Test"
"#]]
.assert_debug_eq(&x);
})
}
#[salsa::input]
struct CopyInput {
#[returns(copy)]
text: &'static str,
}
#[salsa::tracked(returns(copy))]
fn copy_fn(db: &dyn Database, input: CopyInput) -> &'static str {
let input: &'static str = input.text(db);
input
}
#[test]
fn copy_test() {
salsa::DatabaseImpl::new().attach(|db| {
let input = CopyInput::new(db, "Test");
let x: &str = copy_fn(db, input);
expect_test::expect![[r#"
"Test"
"#]]
.assert_debug_eq(&x);
})
}
#[salsa::input]
struct CloneInput {
#[returns(clone)]
text: String,
}
#[salsa::tracked(returns(clone))]
fn clone_fn(db: &dyn Database, input: CloneInput) -> String {
let input: String = input.text(db);
input
}
#[test]
fn clone_test() {
salsa::DatabaseImpl::new().attach(|db| {
let input = CloneInput::new(db, "Test".into());
let x: String = clone_fn(db, input);
expect_test::expect![[r#"
"Test"
"#]]
.assert_debug_eq(&x);
})
}
#[salsa::input]
struct RefInput {
#[returns(ref)]
text: String,
}
#[salsa::tracked(returns(ref))]
fn ref_fn(db: &dyn Database, input: RefInput) -> String {
let input: &String = input.text(db);
input.to_owned()
}
#[test]
fn ref_test() {
salsa::DatabaseImpl::new().attach(|db| {
let input = RefInput::new(db, "Test".into());
let x: &String = ref_fn(db, input);
expect_test::expect![[r#"
"Test"
"#]]
.assert_debug_eq(&x);
})
}
#[salsa::input]
struct DerefInput {
#[returns(deref)]
text: String,
}
#[salsa::tracked(returns(deref))]
fn deref_fn(db: &dyn Database, input: DerefInput) -> String {
let input: &str = input.text(db);
input.to_owned()
}
#[test]
fn deref_test() {
salsa::DatabaseImpl::new().attach(|db| {
let input = DerefInput::new(db, "Test".into());
let x: &str = deref_fn(db, input);
expect_test::expect![[r#"
"Test"
"#]]
.assert_debug_eq(&x);
})
}
#[salsa::input]
struct AsRefInput {
#[returns(as_ref)]
text: Option<String>,
}
#[salsa::tracked(returns(as_ref))]
fn as_ref_fn(db: &dyn Database, input: AsRefInput) -> Option<String> {
let input: Option<&String> = input.text(db);
input.cloned()
}
#[test]
fn as_ref_test() {
salsa::DatabaseImpl::new().attach(|db| {
let input = AsRefInput::new(db, Some("Test".into()));
let x: Option<&String> = as_ref_fn(db, input);
expect_test::expect![[r#"
Some(
"Test",
)
"#]]
.assert_debug_eq(&x);
})
}
#[salsa::input]
struct AsDerefInput {
#[returns(as_deref)]
text: Option<String>,
}
#[salsa::tracked(returns(as_deref))]
fn as_deref_fn(db: &dyn Database, input: AsDerefInput) -> Option<String> {
let input: Option<&str> = input.text(db);
input.map(|s| s.to_owned())
}
#[test]
fn as_deref_test() {
salsa::DatabaseImpl::new().attach(|db| {
let input = AsDerefInput::new(db, Some("Test".into()));
let x: Option<&str> = as_deref_fn(db, input);
expect_test::expect![[r#"
Some(
"Test",
)
"#]]
.assert_debug_eq(&x);
})
}