add attributes and visibility, fix ::salsa, hide some docs

This commit is contained in:
Cormac Relf 2019-01-22 01:13:15 +11:00 committed by Niko Matsakis
parent 3b15a09b8e
commit 857181dd17

View file

@ -1,7 +1,7 @@
use crate::parenthesized::Parenthesized; use crate::parenthesized::Parenthesized;
use proc_macro::TokenStream; use proc_macro::TokenStream;
use syn::parse::{Parse, ParseStream, Peek}; use syn::parse::{Parse, ParseStream, Peek};
use syn::{Ident, Path, Token}; use syn::{Ident, Path, Token, Attribute, Visibility};
/// Implementation for `salsa::database_storage!` macro. /// Implementation for `salsa::database_storage!` macro.
/// ///
@ -24,6 +24,8 @@ pub(crate) fn database_storage(input: TokenStream) -> TokenStream {
storage_struct_name, storage_struct_name,
database_name, database_name,
query_groups, query_groups,
attributes,
visibility,
} = syn::parse_macro_input!(input as DatabaseStorage); } = syn::parse_macro_input!(input as DatabaseStorage);
let each_query = || { let each_query = || {
@ -48,12 +50,16 @@ pub(crate) fn database_storage(input: TokenStream) -> TokenStream {
}); });
} }
let mut attrs = proc_macro2::TokenStream::new();
for attr in attributes {
attrs.extend(quote!{ #attr });
}
// Create the storage struct defintion // Create the storage struct defintion
let mut output = quote! { let mut output = quote! {
#[derive(Default)] #[derive(Default)]
// XXX attributes #attrs
// XXX visibility #visibility struct #storage_struct_name {
struct #storage_struct_name {
#fields #fields
} }
}; };
@ -61,8 +67,8 @@ pub(crate) fn database_storage(input: TokenStream) -> TokenStream {
// create query descriptor wrapper struct // create query descriptor wrapper struct
output.extend(quote! { output.extend(quote! {
#[derive(Clone, Debug, PartialEq, Eq, Hash)] #[derive(Clone, Debug, PartialEq, Eq, Hash)]
// XXX visibility #[doc(hidden)]
struct __SalsaQueryDescriptor { #visibility struct __SalsaQueryDescriptor {
kind: __SalsaQueryDescriptorKind kind: __SalsaQueryDescriptorKind
} }
}); });
@ -108,7 +114,7 @@ pub(crate) fn database_storage(input: TokenStream) -> TokenStream {
impl ::salsa::plumbing::DatabaseOps for #database_name { impl ::salsa::plumbing::DatabaseOps for #database_name {
fn for_each_query( fn for_each_query(
&self, &self,
mut op: impl FnMut(&dyn salsa::plumbing::QueryStorageMassOps<Self>), mut op: impl FnMut(&dyn ::salsa::plumbing::QueryStorageMassOps<Self>),
) { ) {
#for_each_ops #for_each_ops
} }
@ -123,9 +129,9 @@ pub(crate) fn database_storage(input: TokenStream) -> TokenStream {
{ {
for_each_query_desc.extend(quote! { for_each_query_desc.extend(quote! {
__SalsaQueryDescriptorKind::#query_name(key) => { __SalsaQueryDescriptorKind::#query_name(key) => {
let runtime = salsa::Database::salsa_runtime(db); let runtime = ::salsa::Database::salsa_runtime(db);
let storage = &runtime.storage().#query_name; let storage = &runtime.storage().#query_name;
<_ as salsa::plumbing::QueryStorageOps<#database_name, #query_type>>::maybe_changed_since( <_ as ::salsa::plumbing::QueryStorageOps<#database_name, #query_type>>::maybe_changed_since(
storage, storage,
db, db,
revision, revision,
@ -141,7 +147,7 @@ pub(crate) fn database_storage(input: TokenStream) -> TokenStream {
fn maybe_changed_since( fn maybe_changed_since(
&self, &self,
db: &#database_name, db: &#database_name,
revision: salsa::plumbing::Revision, revision: ::salsa::plumbing::Revision,
) -> bool { ) -> bool {
match &self.kind { match &self.kind {
#for_each_query_desc #for_each_query_desc
@ -157,13 +163,13 @@ pub(crate) fn database_storage(input: TokenStream) -> TokenStream {
} in each_query() } in each_query()
{ {
for_each_query_table.extend(quote! { for_each_query_table.extend(quote! {
impl salsa::plumbing::GetQueryTable<#query_type> for #database_name { impl ::salsa::plumbing::GetQueryTable<#query_type> for #database_name {
fn get_query_table( fn get_query_table(
db: &Self, db: &Self,
) -> salsa::QueryTable<'_, Self, #query_type> { ) -> ::salsa::QueryTable<'_, Self, #query_type> {
salsa::QueryTable::new( ::salsa::QueryTable::new(
db, db,
&salsa::Database::salsa_runtime(db) &::salsa::Database::salsa_runtime(db)
.storage() .storage()
.#query_name, .#query_name,
) )
@ -171,11 +177,11 @@ pub(crate) fn database_storage(input: TokenStream) -> TokenStream {
fn get_query_table_mut( fn get_query_table_mut(
db: &mut Self, db: &mut Self,
) -> salsa::QueryTableMut<'_, Self, #query_type> { ) -> ::salsa::QueryTableMut<'_, Self, #query_type> {
let db = &*db; let db = &*db;
salsa::QueryTableMut::new( ::salsa::QueryTableMut::new(
db, db,
&salsa::Database::salsa_runtime(db) &::salsa::Database::salsa_runtime(db)
.storage() .storage()
.#query_name, .#query_name,
) )
@ -183,8 +189,8 @@ pub(crate) fn database_storage(input: TokenStream) -> TokenStream {
fn descriptor( fn descriptor(
db: &Self, db: &Self,
key: <#query_type as salsa::Query<Self>>::Key, key: <#query_type as ::salsa::Query<Self>>::Key,
) -> <Self as salsa::plumbing::DatabaseStorageTypes>::QueryDescriptor { ) -> <Self as ::salsa::plumbing::DatabaseStorageTypes>::QueryDescriptor {
__SalsaQueryDescriptor { __SalsaQueryDescriptor {
kind: __SalsaQueryDescriptorKind::#query_name(key), kind: __SalsaQueryDescriptorKind::#query_name(key),
} }
@ -202,6 +208,8 @@ struct DatabaseStorage {
storage_struct_name: Ident, storage_struct_name: Ident,
database_name: Path, database_name: Path,
query_groups: Vec<QueryGroup>, query_groups: Vec<QueryGroup>,
attributes: Vec<Attribute>,
visibility: Visibility,
} }
struct QueryGroup { struct QueryGroup {
@ -216,6 +224,8 @@ struct Query {
impl Parse for DatabaseStorage { impl Parse for DatabaseStorage {
fn parse(input: ParseStream) -> syn::Result<Self> { fn parse(input: ParseStream) -> syn::Result<Self> {
let attributes = input.call(Attribute::parse_outer)?;
let visibility = input.parse()?;
let _struct_token: Token![struct ] = input.parse()?; let _struct_token: Token![struct ] = input.parse()?;
let storage_struct_name: Ident = input.parse()?; let storage_struct_name: Ident = input.parse()?;
let _for_token: Token![for ] = input.parse()?; let _for_token: Token![for ] = input.parse()?;
@ -224,6 +234,8 @@ impl Parse for DatabaseStorage {
syn::braced!(content in input); syn::braced!(content in input);
let query_groups: Vec<QueryGroup> = parse_while(Token![impl ], &content)?; let query_groups: Vec<QueryGroup> = parse_while(Token![impl ], &content)?;
Ok(DatabaseStorage { Ok(DatabaseStorage {
attributes,
visibility,
storage_struct_name, storage_struct_name,
database_name, database_name,
query_groups, query_groups,