remove the DB parameter

This had two unexpected consequences, one unfortunate, one "medium":

* All `salsa::Database` must be `'static`. This falls out from
`Q::DynDb` not having access to any lifetimes, but also the defaulting
rules for `dyn QueryGroup` that make it `dyn QueryGroup + 'static`. We
don't really support generic databases anyway yet so this isn't a big
deal, and we can add workarounds later (ideally via GATs).

* It is now statically impossible to invoke `snapshot` from a query,
and so we don't need to test that it panics. This is because the
signature of `snapshot` returns a `Snapshot<Self>` and that is not
accessible to a `dyn QueryGroup` type. Similarly, invoking
`Runtime::snapshot` directly is not possible becaues it is
crate-private. So I removed the test. This seems ok, but eventually I
would like to expose ways for queries to do parallel
execution (matklad and I had talked about a "speculation" primitive
for enabling that).

* This commit is 99% boilerplate I did with search-and-replace. I also
rolled in a few other changes I might have preferred to factor out,
most notably removing the `GetQueryTable` plumbing trait in favor of
free-methods, but it was awkward to factor them out and get all the
generics right (so much simpler in this version).
This commit is contained in:
Niko Matsakis 2020-07-03 10:46:00 +00:00
parent d64dfa1727
commit fad97eeb6a
36 changed files with 410 additions and 455 deletions

View file

@ -26,7 +26,7 @@ trait RequestParser {
}
// ANCHOR_END: request
fn parse(_db: &impl RequestParser) -> ParsedResult {
fn parse(_db: &dyn RequestParser) -> ParsedResult {
panic!()
}

View file

@ -6,7 +6,7 @@ trait RequestUtil: RequestParser {
fn content_type(&self) -> Option<String>;
}
fn content_type(db: &impl RequestUtil) -> Option<String> {
fn content_type(db: &dyn RequestUtil) -> Option<String> {
db.parse()
.header
.iter()

View file

@ -7,11 +7,11 @@ trait RequestUtil: RequestParser {
fn content_type(&self) -> Option<String>;
}
fn header(db: &impl RequestUtil) -> Vec<ParsedHeader> {
fn header(db: &dyn RequestUtil) -> Vec<ParsedHeader> {
db.parse().header.clone()
}
fn content_type(db: &impl RequestUtil) -> Option<String> {
fn content_type(db: &dyn RequestUtil) -> Option<String> {
db.header()
.iter()
.find(|header| header.key == "content-type")