Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Changes attribute/argument parsing to the more usual `field = "value"` / `turbo_tasks(trace_ignore)`
  • Loading branch information
ForsakenHarmony committed Aug 5, 2022
1 parent badc183 commit 0a4ac61
Show file tree
Hide file tree
Showing 33 changed files with 481 additions and 420 deletions.
5 changes: 2 additions & 3 deletions crates/next-dev/src/turbo_tasks_viz.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,9 @@ use turbo_tasks_fs::{File, FileContent, FileContentVc};
use turbo_tasks_memory::{stats::Stats, viz, MemoryBackend};
use turbopack_dev_server::source::{ContentSource, ContentSourceVc};

#[turbo_tasks::value(serialization: none, eq: manual, cell: new, into: new)]
#[turbo_tasks::value(serialization = "none", eq = "manual", cell = "new", into = "new")]
pub struct TurboTasksSource {
#[debug_ignore]
#[trace_ignore]
#[turbo_tasks(debug_ignore, trace_ignore)]
pub turbo_tasks: Arc<TurboTasks<MemoryBackend>>,
}

Expand Down
7 changes: 2 additions & 5 deletions crates/turbo-tasks-build/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -289,11 +289,8 @@ impl<'a> RegisterContext<'a> {
let trait_type_ident = get_trait_type_ident(trait_ident);
self.register(trait_type_ident, self.get_global_name(trait_ident, None))?;

let debug = matches!(
parse_attr_args(attr)?,
Some(ValueTraitArguments { no_debug: false })
);
if debug {
let trait_args: ValueTraitArguments = parse_attr_args(attr)?.unwrap_or_default();
if trait_args.debug {
let ref_ident = get_ref_ident(trait_ident);
self.register_debug_impl(&ref_ident)?;
}
Expand Down
23 changes: 10 additions & 13 deletions crates/turbo-tasks-fs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,18 +85,15 @@ mod watcher_ser {
}
}

#[turbo_tasks::value(cell: new, eq: manual)]
#[turbo_tasks::value(cell = "new", eq = "manual")]
pub struct DiskFileSystem {
pub name: String,
pub root: String,
#[debug_ignore]
#[trace_ignore]
#[turbo_tasks(debug_ignore, trace_ignore)]
invalidators: Arc<InvalidatorMap>,
#[debug_ignore]
#[trace_ignore]
#[turbo_tasks(debug_ignore, trace_ignore)]
dir_invalidators: Arc<InvalidatorMap>,
#[debug_ignore]
#[trace_ignore]
#[turbo_tasks(debug_ignore, trace_ignore)]
#[serde(with = "watcher_ser")]
watcher: Mutex<Option<RecommendedWatcher>>,
}
Expand Down Expand Up @@ -890,7 +887,7 @@ impl From<Permissions> for fs::Permissions {

#[turbo_tasks::value(shared)]
pub enum FileContent {
Content(#[debug_ignore] File),
Content(#[turbo_tasks(debug_ignore)] File),
NotFound,
}

Expand Down Expand Up @@ -1021,7 +1018,7 @@ mod mime_option_serde {
pub struct FileMeta {
permissions: Permissions,
#[serde(with = "mime_option_serde")]
#[trace_ignore]
#[turbo_tasks(trace_ignore)]
content_type: Option<Mime>,
}

Expand Down Expand Up @@ -1214,9 +1211,9 @@ impl FileContentVc {
}
}

#[turbo_tasks::value(shared, serialization: none)]
#[turbo_tasks::value(shared, serialization = "none")]
pub enum FileJsonContent {
Content(#[trace_ignore] JsonValue),
Content(#[turbo_tasks(trace_ignore)] JsonValue),
Unparseable,
NotFound,
}
Expand All @@ -1227,9 +1224,9 @@ pub struct FileLine {
pub bytes_offset: usize,
}

#[turbo_tasks::value(shared, serialization: none)]
#[turbo_tasks::value(shared, serialization = "none")]
pub enum FileLinesContent {
Lines(#[trace_ignore] Vec<FileLine>),
Lines(#[turbo_tasks(trace_ignore)] Vec<FileLine>),
Unparseable,
NotFound,
}
Expand Down
36 changes: 20 additions & 16 deletions crates/turbo-tasks-macros-shared/src/value_trait_arguments.rs
Original file line number Diff line number Diff line change
@@ -1,38 +1,42 @@
use syn::{
parse::{Parse, ParseStream},
Ident, Token,
punctuated::Punctuated,
Meta, Token,
};

/// Arguments to the `#[turbo_tasks::value_trait]` attribute macro.
#[derive(Debug)]
pub struct ValueTraitArguments {
/// Whether the macro should generate a `ValueDebug`-like `dbg()`
/// implementation on the trait's `Vc`.
pub no_debug: bool,
pub debug: bool,
}

impl Default for ValueTraitArguments {
fn default() -> Self {
Self { debug: true }
}
}

impl Parse for ValueTraitArguments {
fn parse(input: ParseStream) -> syn::Result<Self> {
let mut result = ValueTraitArguments { no_debug: false };
let mut result = Self::default();
if input.is_empty() {
return Ok(result);
}
loop {
let path = input.parse::<Ident>()?;
match path.to_string().as_ref() {
"no_debug" => {
result.no_debug = true;

let punctuated: Punctuated<Meta, Token![,]> = input.parse_terminated(Meta::parse)?;
for meta in punctuated {
match meta.path().get_ident().map(ToString::to_string).as_deref() {
Some("no_debug") => {
result.debug = false;
}
_ => {
return Err(input.error("unknown parameter"));
return Err(syn::Error::new_spanned(meta, "unknown parameter"));
}
}
if input.is_empty() {
return Ok(result);
} else if input.peek(Token![,]) {
input.parse::<Token![,]>()?;
} else {
return Err(input.error("expected \",\" or end of attribute"));
}
}

Ok(result)
}
}
56 changes: 56 additions & 0 deletions crates/turbo-tasks-macros/src/derive/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
mod trace_raw_vcs_macro;
mod value_debug_macro;

use syn::{spanned::Spanned, Attribute, Meta, MetaList, NestedMeta};
pub use trace_raw_vcs_macro::derive_trace_raw_vcs;
pub use value_debug_macro::derive_value_debug;

struct FieldAttributes {
trace_ignore: bool,
debug_ignore: bool,
}

impl From<&[Attribute]> for FieldAttributes {
fn from(attrs: &[Attribute]) -> Self {
let mut result = Self {
trace_ignore: false,
debug_ignore: false,
};

for attr in attrs {
if !attr
.path
.get_ident()
.map(|ident| *ident == "turbo_tasks")
.unwrap_or_default()
{
continue;
}
if let Ok(Meta::List(MetaList { nested, .. })) = attr
.parse_meta()
.map_err(|err| err.span().unwrap().error(err.to_string()).emit())
{
for meta in nested {
if let NestedMeta::Meta(Meta::Path(path)) = &meta {
match path.get_ident().map(|ident| ident.to_string()).as_deref() {
Some("trace_ignore") => result.trace_ignore = true,
Some("debug_ignore") => result.debug_ignore = true,
_ => path
.span()
.unwrap()
.error("expected `trace_ignore` or `debug_ignore`")
.emit(),
}
} else {
meta.span()
.unwrap()
.error("expected `trace_ignore` or `debug_ignore`")
.emit();
}
}
}
}

result
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,23 @@ use proc_macro::TokenStream;
use proc_macro2::{Ident, Literal};
use quote::quote;
use syn::{
parse_macro_input, spanned::Spanned, Field, Fields, FieldsNamed, FieldsUnnamed, Item, ItemEnum,
ItemStruct,
parse_macro_input, spanned::Spanned, Data, DataEnum, DataStruct, DeriveInput, Field, Fields,
FieldsNamed, FieldsUnnamed,
};

pub fn derive_trace_raw_vcs(input: TokenStream) -> TokenStream {
fn ignore_field(field: &Field) -> bool {
field
.attrs
.iter()
.any(|attr| attr.path.is_ident("trace_ignore"))
}
use super::FieldAttributes;

fn ignore_field(field: &Field) -> bool {
FieldAttributes::from(field.attrs.as_slice()).trace_ignore
}

let item = parse_macro_input!(input as Item);
pub fn derive_trace_raw_vcs(input: TokenStream) -> TokenStream {
let derive_input = parse_macro_input!(input as DeriveInput);
let ident = &derive_input.ident;
let generics = &derive_input.generics;

let (ident, generics, trace_items) = match &item {
Item::Enum(ItemEnum {
ident,
generics,
variants,
..
}) => (ident, generics, {
let trace_items = match &derive_input.data {
Data::Enum(DataEnum { variants, .. }) => {
let variants_code: Vec<_> = variants.iter().map(|variant| {
let variant_ident = &variant.ident;
match &variant.fields {
Expand All @@ -42,7 +38,7 @@ pub fn derive_trace_raw_vcs(input: TokenStream) -> TokenStream {
})
.collect();
quote! {
#ident::#variant_ident{ #(#ident_pats),* } => {
#ident::#variant_ident{ #(#ident_pats),*, .. } => {
#(
turbo_tasks::trace::TraceRawVcs::trace_raw_vcs(#idents, context);
)*
Expand Down Expand Up @@ -79,46 +75,41 @@ pub fn derive_trace_raw_vcs(input: TokenStream) -> TokenStream {
#(#variants_code)*
}
}
}),
Item::Struct(ItemStruct {
ident,
generics,
fields,
..
}) => (
ident,
generics,
match fields {
Fields::Named(FieldsNamed { named, .. }) => {
let idents: Vec<_> = named
.iter()
.filter(|field| !ignore_field(field))
.filter_map(|field| field.ident.clone())
.collect();
quote! {
#(
turbo_tasks::trace::TraceRawVcs::trace_raw_vcs(&self.#idents, context);
)*
}
}
Data::Struct(DataStruct { fields, .. }) => match fields {
Fields::Named(FieldsNamed { named, .. }) => {
let idents: Vec<_> = named
.iter()
.filter(|field| !ignore_field(field))
.filter_map(|field| field.ident.clone())
.collect();
quote! {
#(
turbo_tasks::trace::TraceRawVcs::trace_raw_vcs(&self.#idents, context);
)*
}
Fields::Unnamed(FieldsUnnamed { unnamed, .. }) => {
let indicies: Vec<_> = unnamed
.iter()
.enumerate()
.filter(|(_, field)| !ignore_field(field))
.map(|(i, _)| Literal::usize_unsuffixed(i))
.collect();
quote! {
#(
turbo_tasks::trace::TraceRawVcs::trace_raw_vcs(&self.#indicies, context);
)*
}
}
Fields::Unnamed(FieldsUnnamed { unnamed, .. }) => {
let indices: Vec<_> = unnamed
.iter()
.enumerate()
.filter(|(_, field)| !ignore_field(field))
.map(|(i, _)| Literal::usize_unsuffixed(i))
.collect();
quote! {
#(
turbo_tasks::trace::TraceRawVcs::trace_raw_vcs(&self.#indices, context);
)*
}
Fields::Unit => quote! {},
},
),
}
Fields::Unit => quote! {},
},
_ => {
item.span().unwrap().error("unsupported syntax").emit();
derive_input
.span()
.unwrap()
.error("unsupported syntax")
.emit();

return quote! {}.into();
}
Expand Down

0 comments on commit 0a4ac61

Please sign in to comment.