359: fix: typos in tutorial ir chapter r=nikomatsakis a=dawnofmidnight

Looking at the tutorial, I believe `ProgramSource` is a typo for `SourceProgram`. I'm also pretty sure the `define` -> `derive` is correct, unless `define` is some attribute I'm not aware of.

361: test for compiling failure: lru can not be used with specify r=nikomatsakis a=XFFXFF

ref #354  
Test for compile failures with [tybuild](https://github.com/dtolnay/trybuild.git). This is an example to show how it works.

Co-authored-by: dawn <78233879+dawnofmidnight@users.noreply.github.com>
Co-authored-by: XFFXFF <1247714429@qq.com>
This commit is contained in:
bors[bot] 2022-08-18 23:46:02 +00:00 committed by GitHub
commit 80d0d14194
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 39 additions and 6 deletions

View file

@ -34,7 +34,7 @@ Inputs are defined as Rust structs with a `#[salsa::input]` annotation:
{{#include ../../../calc-example/calc/src/ir.rs:input}}
```
In our compiler, we have just one simple input, the `ProgramSource`, which has a `text` field (the string).
In our compiler, we have just one simple input, the `SourceProgram`, which has a `text` field (the string).
### The data lives in the database
@ -43,18 +43,18 @@ The values of their fields are stored in the salsa database, and the struct itse
This means that the struct instances are copy (no matter what fields they contain).
Creating instances of the struct and accessing fields is done by invoking methods like `new` as well as getters and setters.
More concretely, the `#[salsa::input]` annotation will generate a struct for `ProgramSource` like this:
More concretely, the `#[salsa::input]` annotation will generate a struct for `SourceProgram` like this:
```rust
#[define(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ProgramSource(salsa::Id);
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SourceProgram(salsa::Id);
```
It will also generate a method `new` that lets you create a `ProgramSource` in the database.
It will also generate a method `new` that lets you create a `SourceProgram` in the database.
For an input, a `&mut db` reference is required, along with the values for each field:
```rust
let source = ProgramSource::new(&mut db, "print 11 + 11".to_string());
let source = SourceProgram::new(&mut db, "print 11 + 11".to_string());
```
You can read the value of the field with `source.text(&db)`,

View file

@ -11,3 +11,4 @@ expect-test = "1.4.0"
parking_lot = "0.12.1"
test-log = "0.2.11"
env_logger = "*"
trybuild = "1.0"

View file

@ -0,0 +1,16 @@
#[salsa::jar(db = Db)]
struct Jar(MyInput, lru_can_not_be_used_with_specify);
trait Db: salsa::DbWithJar<Jar> {}
#[salsa::input(jar = Jar)]
struct MyInput {
field: u32,
}
#[salsa::tracked(jar = Jar, lru = 3, specify)]
fn lru_can_not_be_used_with_specify(db: &dyn Db, input: MyInput) -> u32 {
input.field(db)
}
fn main() {}

View file

@ -0,0 +1,11 @@
error: `specify` and `lru` cannot be used together
--> tests/compile-fail/lru_can_not_be_used_with_specify.rs:11:38
|
11 | #[salsa::tracked(jar = Jar, lru = 3, specify)]
| ^^^^^^^
error[E0412]: cannot find type `lru_can_not_be_used_with_specify` in this scope
--> tests/compile-fail/lru_can_not_be_used_with_specify.rs:2:21
|
2 | struct Jar(MyInput, lru_can_not_be_used_with_specify);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope

View file

@ -0,0 +1,5 @@
#[test]
fn compile_fail() {
let t = trybuild::TestCases::new();
t.compile_fail("tests/compile-fail/*.rs");
}