From 1d802656a3616cae8d07b4ec71c28ca5602728d7 Mon Sep 17 00:00:00 2001 From: rzvxa Date: Sat, 20 Jul 2024 14:04:32 +0330 Subject: [PATCH] feat(ast, ast_macros): apply stable_repr to all `#[ast]` items. --- crates/oxc_ast/src/ast/js.rs | 16 ---------- crates/oxc_ast/src/ast/jsx.rs | 1 - crates/oxc_ast/src/ast/ts.rs | 6 ---- crates/oxc_ast_macros/src/lib.rs | 50 ++++++++++++++++++++++++++++++-- 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/crates/oxc_ast/src/ast/js.rs b/crates/oxc_ast/src/ast/js.rs index 85b37fa582f3c3..f31ab3b0e396e7 100644 --- a/crates/oxc_ast/src/ast/js.rs +++ b/crates/oxc_ast/src/ast/js.rs @@ -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))] #[serde(untagged)] @@ -242,7 +241,6 @@ inherit_variants! { /// /// [`ast` module docs]: `super` #[ast(visit)] -#[repr(C, u8)] #[derive(Debug, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[serde(untagged)] @@ -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))] #[serde(untagged)] @@ -387,7 +384,6 @@ pub struct TemplateElementValue<'a> { /// #[ast(visit)] -#[repr(C, u8)] #[derive(Debug, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize, Tsify))] #[serde(untagged)] @@ -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))] #[serde(untagged)] @@ -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))] #[serde(untagged)] @@ -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))] #[serde(untagged)] @@ -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))] #[serde(untagged)] @@ -756,7 +748,6 @@ inherit_variants! { /// /// [`ast` module docs]: `super` #[ast(visit)] -#[repr(C, u8)] #[derive(Debug, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize, Tsify))] #[serde(untagged)] @@ -859,7 +850,6 @@ inherit_variants! { /// /// [`ast` module docs]: `super` #[ast(visit)] -#[repr(C, u8)] #[derive(Debug, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize, Tsify))] #[serde(untagged)] @@ -889,7 +879,6 @@ inherit_variants! { /// /// [`ast` module docs]: `super` #[ast(visit)] -#[repr(C, u8)] #[derive(Debug, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize, Tsify))] #[serde(untagged)] @@ -960,7 +949,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))] #[serde(untagged)] @@ -1127,7 +1115,6 @@ inherit_variants! { /// /// [`ast` module docs]: `super` #[ast(visit)] -#[repr(C, u8)] #[derive(Debug, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize, Tsify))] #[serde(untagged)] @@ -1161,7 +1148,6 @@ inherit_variants! { /// /// [`ast` module docs]: `super` #[ast(visit)] -#[repr(C, u8)] #[derive(Debug, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize, Tsify))] #[serde(untagged)] @@ -1719,7 +1705,6 @@ pub struct StaticBlock<'a> { } #[ast(visit)] -#[repr(C, u8)] #[derive(Debug, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize, Tsify))] #[serde(untagged)] @@ -1948,7 +1933,6 @@ inherit_variants! { /// /// [`ast` module docs]: `super` #[ast(visit)] -#[repr(C, u8)] #[derive(Debug, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize, Tsify))] #[serde(untagged)] diff --git a/crates/oxc_ast/src/ast/jsx.rs b/crates/oxc_ast/src/ast/jsx.rs index ba9bbb42282755..53a9c6d6c888b6 100644 --- a/crates/oxc_ast/src/ast/jsx.rs +++ b/crates/oxc_ast/src/ast/jsx.rs @@ -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))] #[serde(untagged)] diff --git a/crates/oxc_ast/src/ast/ts.rs b/crates/oxc_ast/src/ast/ts.rs index 1164906c940b32..d07b332e2804a9 100644 --- a/crates/oxc_ast/src/ast/ts.rs +++ b/crates/oxc_ast/src/ast/ts.rs @@ -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))] #[serde(untagged)] @@ -132,7 +131,6 @@ pub enum TSLiteral<'a> { } #[ast(visit)] -#[repr(C, u8)] #[derive(Debug, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize, Tsify))] #[serde(untagged, rename_all = "camelCase")] @@ -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))] #[serde(untagged, rename_all = "camelCase")] @@ -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))] #[serde(untagged)] @@ -923,7 +919,6 @@ inherit_variants! { /// /// [`ast` module docs]: `super` #[ast(visit)] -#[repr(C, u8)] #[derive(Debug, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize, Tsify))] #[serde(untagged)] @@ -1096,7 +1091,6 @@ inherit_variants! { /// /// [`ast` module docs]: `super` #[ast(visit)] -#[repr(C, u8)] #[derive(Debug, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize, Tsify))] #[serde(untagged, rename_all = "camelCase")] diff --git a/crates/oxc_ast_macros/src/lib.rs b/crates/oxc_ast_macros/src/lib.rs index f58151719b39c7..eea74c0000e3a0 100644 --- a/crates/oxc_ast_macros/src/lib.rs +++ b/crates/oxc_ast_macros/src/lib.rs @@ -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's role is not to generate code - it's purely a means to communicate information to the codegen. @@ -16,9 +22,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`.