Macro salsa::query_group
source · macro_rules! query_group {
(
$(#[$attr:meta])* $v:vis trait $name:ident { $($t:tt)* }
) => { ... };
(
$(#[$attr:meta])* $v:vis trait $name:ident : $($t:tt)*
) => { ... };
(
attr[$($trait_attr:tt)*];
headers[$v:vis, $query_trait:ident, $($header:tt)*];
tokens[{
$(
$(#[$method_attr:meta])*
fn $method_name:ident($($key_name:ident: $key_ty:ty),* $(,)*) -> $value_ty:ty {
type $QueryType:ident;
$(storage $storage:ident;)* // FIXME(rust-lang/rust#48075) should be `?`
$(use fn $fn_path:path;)* // FIXME(rust-lang/rust#48075) should be `?`
}
)*
}];
) => { ... };
(
@query_fn[
storage(input);
method_name($method_name:ident);
fn_path();
$($rest:tt)*
]
) => { ... };
(
@query_fn[
storage(input);
method_name($method_name:ident);
fn_path($fn_path:path);
$($rest:tt)*
]
) => { ... };
(
@query_fn[
storage($($storage:ident)*);
method_name($method_name:ident);
fn_path();
$($rest:tt)*
]
) => { ... };
(
@query_fn[
storage($($storage:ident)*);
method_name($method_name:ident);
fn_path($fn_path:path);
db_trait($DbTrait:path);
query_type($QueryType:ty);
key($key_name:ident: $key_ty:ty);
]
) => { ... };
(
@query_fn[
storage($($storage:ident)*);
method_name($method_name:ident);
fn_path($fn_path:path);
db_trait($DbTrait:path);
query_type($QueryType:ty);
key($($key_name:ident: $key_ty:ty),*);
]
) => { ... };
(
attr[$($attr:tt)*];
headers[$($headers:tt)*];
tokens[$token:tt $($tokens:tt)*];
) => { ... };
(
// Default case:
@storage_ty[$DB:ident, $Self:ident, ]
) => { ... };
(
@storage_ty[$DB:ident, $Self:ident, memoized]
) => { ... };
(
@storage_ty[$DB:ident, $Self:ident, volatile]
) => { ... };
(
@storage_ty[$DB:ident, $Self:ident, dependencies]
) => { ... };
(
@storage_ty[$DB:ident, $Self:ident, input]
) => { ... };
}
Expand description
A macro that helps in defining the “context trait” of a given module. This is a trait that defines everything that a block of queries need to execute, as well as defining the queries themselves that are exported for others to use.
This macro declares the “prototype” for a group of queries. It will expand into a trait and a set of structs, one per query.
For each query, you give the name of the accessor method to invoke
the query (e.g., my_query
, below), as well as its parameter
types and the output type. You also give the name for a query type
(e.g., MyQuery
, below) that represents the query, and optionally
other details, such as its storage.
Examples
The simplest example is something like this:
ⓘ
trait TypeckDatabase {
query_group! {
/// Comments or other attributes can go here
fn my_query(input: u32) -> u64 {
type MyQuery;
storage memoized; // optional, this is the default
use fn path::to::fn; // optional, default is `my_query`
}
/// Queries can have any number of inputs; the key type will be
/// a tuple of the input types, so in this case `(u32, f32)`.
fn other_query(input1: u32, input2: f32) -> u64 {
type OtherQuery;
}
}
}