Skip to content

Commit

Permalink
feat(ast, ast_macros): apply stable_repr to all #[ast] items.
Browse files Browse the repository at this point in the history
  • Loading branch information
rzvxa authored and overlookmotel committed Jul 20, 2024
1 parent 5f6d7f1 commit 2d948ed
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 26 deletions.
16 changes: 0 additions & 16 deletions crates/oxc_ast/src/ast/js.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -242,7 +241,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -310,7 +308,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -387,7 +384,6 @@ pub struct TemplateElementValue<'a> {

/// <https://tc39.es/ecma262/#prod-MemberExpression>
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -507,7 +503,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -616,7 +611,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand All @@ -635,7 +629,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -690,7 +683,6 @@ macro_rules! match_simple_assignment_target {
pub use match_simple_assignment_target;

#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -762,7 +754,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -865,7 +856,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -895,7 +885,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -966,7 +955,6 @@ pub struct BlockStatement<'a> {

/// Declarations and the Variable Statement
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -1133,7 +1121,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -1167,7 +1154,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -1734,7 +1720,6 @@ pub struct StaticBlock<'a> {
}

#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -1963,7 +1948,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down
1 change: 0 additions & 1 deletion crates/oxc_ast/src/ast/jsx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down
6 changes: 0 additions & 6 deletions crates/oxc_ast/src/ast/ts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -132,7 +131,6 @@ pub enum TSLiteral<'a> {
}

#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged, rename_all = "camelCase"))]
Expand Down Expand Up @@ -383,7 +381,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged, rename_all = "camelCase"))]
Expand Down Expand Up @@ -542,7 +539,6 @@ pub struct TSTypeReference<'a> {
/// IdentifierReference
/// NamespaceName . IdentifierReference
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -926,7 +922,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
Expand Down Expand Up @@ -1099,7 +1094,6 @@ inherit_variants! {
///
/// [`ast` module docs]: `super`
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged, rename_all = "camelCase"))]
Expand Down
50 changes: 47 additions & 3 deletions crates/oxc_ast_macros/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
use proc_macro::TokenStream;
use proc_macro::{TokenStream, TokenTree};
use std::str::FromStr;

enum ItemKind {
Enum,
Struct,
Unknown,
}

/// Attach to AST node type (struct or enum), to signal to codegen to create visitor for this type.
///
/// Macro does not generate any code - it's purely a means to communicate information to the codegen.
Expand All @@ -14,9 +20,47 @@ use std::str::FromStr;
#[proc_macro_attribute]
#[allow(clippy::missing_panics_doc)]
pub fn ast(_args: TokenStream, input: TokenStream) -> TokenStream {
let mut stream = TokenStream::from_str("#[derive(::oxc_ast_macros::Ast)]").unwrap();
let mut input = input.into_iter();
let mut stream = TokenStream::new();
let mut output = TokenStream::from_str("#[derive(::oxc_ast_macros::Ast)]").unwrap();

let mut item_kind = ItemKind::Unknown;

while let Some(next) = input.next() {
if let TokenTree::Ident(ident) = &next {
match ident.to_string().as_str() {
"enum" => {
assert!(matches!(item_kind, ItemKind::Unknown));
item_kind = ItemKind::Enum;
stream.extend(Some(next));
break;
}
"struct" => {
assert!(matches!(item_kind, ItemKind::Unknown));
item_kind = ItemKind::Struct;
stream.extend(Some(next));
break;
}
_ => {}
}
}

stream.extend(Some(next));
}

// append the remained of the input tokens to the stream
stream.extend(input);
stream

let repr = match item_kind {
ItemKind::Enum => TokenStream::from_str("#[repr(C, u8)]").unwrap(),
// ItemKind::Struct => TokenStream::from_str("#[repr(C)]").unwrap(),
ItemKind::Struct => TokenStream::default(),
ItemKind::Unknown => unreachable!(),
};

output.extend(repr);
output.extend(stream);
output
}

/// Dummy derive macro for a non-existent trait `Ast`.
Expand Down

0 comments on commit 2d948ed

Please sign in to comment.