diff --git a/tasks/ast_tools/src/derives/estree.rs b/tasks/ast_tools/src/derives/estree.rs index 7568b8e6af5f1..734483c7cd78c 100644 --- a/tasks/ast_tools/src/derives/estree.rs +++ b/tasks/ast_tools/src/derives/estree.rs @@ -181,6 +181,9 @@ fn parse_estree_attr(location: AttrLocation, part: AttrPart) -> Result<()> { }, // `#[estree]` attr on enum variant AttrLocation::EnumVariant(enum_def, variant_index) => match part { + AttrPart::Tag("skip") => { + enum_def.variants[variant_index].estree.skip = true; + } AttrPart::String("rename", value) => { enum_def.variants[variant_index].estree.rename = Some(value); } @@ -504,6 +507,13 @@ impl<'s> StructSerializerGenerator<'s> { fn generate_body_for_enum(enum_def: &EnumDef, schema: &Schema) -> TokenStream { let match_branches = enum_def.all_variants(schema).map(|variant| { let variant_ident = variant.ident(); + + if should_skip_enum_variant(variant) { + return quote! { + Self::#variant_ident => { unreachable!("This enum variant is skipped.") } + }; + } + if variant.is_fieldless() { let value = get_fieldless_variant_value(enum_def, variant); let value = string_to_tokens(value.as_ref(), false); @@ -563,6 +573,15 @@ pub fn should_skip_field(field: &FieldDef, schema: &Schema) -> bool { } } +/// Get if an enum variant should be skipped when serializing. +/// +/// Returns `true` if the variant has an `#[estree(skip)]` attr on it. +/// +/// This function also used by Typescript and raw transfer generators. +pub fn should_skip_enum_variant(variant: &VariantDef) -> bool { + variant.estree.skip +} + /// Get if should flatten a struct field. /// /// Returns `true` if either the field has an `#[estree(flatten)]` attr on it, diff --git a/tasks/ast_tools/src/generators/raw_transfer.rs b/tasks/ast_tools/src/generators/raw_transfer.rs index 6618eaa0f89ec..597da8f48c0ec 100644 --- a/tasks/ast_tools/src/generators/raw_transfer.rs +++ b/tasks/ast_tools/src/generators/raw_transfer.rs @@ -10,7 +10,8 @@ use crate::{ Generator, RAW_TRANSFER_JS_DESERIALIZER_PATH, RAW_TRANSFER_TS_DESERIALIZER_PATH, codegen::{Codegen, DeriveId}, derives::estree::{ - get_fieldless_variant_value, get_struct_field_name, should_flatten_field, should_skip_field, + get_fieldless_variant_value, get_struct_field_name, should_flatten_field, + should_skip_enum_variant, should_skip_field, }, output::Output, schema::{ @@ -400,7 +401,10 @@ fn generate_enum( }; let body = body.unwrap_or_else(|| { - let mut variants = enum_def.all_variants(schema).collect::>(); + let mut variants = enum_def + .all_variants(schema) + .filter(|variant| !should_skip_enum_variant(variant)) + .collect::>(); variants.sort_by_key(|variant| variant.discriminant); let switch_cases = variants.into_iter().fold(String::new(), |mut s, variant| { diff --git a/tasks/ast_tools/src/generators/typescript.rs b/tasks/ast_tools/src/generators/typescript.rs index 0f246577b2597..3a7d69413a656 100644 --- a/tasks/ast_tools/src/generators/typescript.rs +++ b/tasks/ast_tools/src/generators/typescript.rs @@ -7,7 +7,8 @@ use itertools::Itertools; use crate::{ Codegen, Generator, TYPESCRIPT_DEFINITIONS_PATH, derives::estree::{ - get_fieldless_variant_value, get_struct_field_name, should_flatten_field, should_skip_field, + get_fieldless_variant_value, get_struct_field_name, should_flatten_field, + should_skip_enum_variant, should_skip_field, }, output::Output, schema::{Def, EnumDef, FieldDef, Schema, StructDef, TypeDef}, @@ -319,6 +320,7 @@ fn generate_ts_type_def_for_enum(enum_def: &EnumDef, schema: &Schema) -> Option< let mut variant_type_names = enum_def .variants .iter() + .filter(|variant| !should_skip_enum_variant(variant)) .map(|variant| { if let Some(variant_type) = variant.field_type(schema) { if let Some(converter_name) = &variant.estree.via { diff --git a/tasks/ast_tools/src/schema/extensions/estree.rs b/tasks/ast_tools/src/schema/extensions/estree.rs index eb775dbb3075e..1cc107c4e869a 100644 --- a/tasks/ast_tools/src/schema/extensions/estree.rs +++ b/tasks/ast_tools/src/schema/extensions/estree.rs @@ -63,6 +63,7 @@ pub struct ESTreeStructField { /// Configuration for ESTree generator on an enum variant. #[derive(Default, Debug)] pub struct ESTreeEnumVariant { + pub skip: bool, pub rename: Option, pub via: Option, pub is_ts: bool,