From 036dbacac95b0cffdeda432f072a6f834d1f33ed Mon Sep 17 00:00:00 2001 From: bagel897 Date: Wed, 19 Feb 2025 11:25:40 -0800 Subject: [PATCH 1/6] Convert to quote --- Cargo.lock | 4 + Cargo.toml | 2 +- codegen-sdk-analyzer/Cargo.toml | 2 +- codegen-sdk-ast/Cargo.toml | 2 +- codegen-sdk-common/Cargo.toml | 4 +- codegen-sdk-cst-generator/Cargo.toml | 6 +- codegen-sdk-cst-generator/src/generator.rs | 2 +- .../src/generator/enum_generator.rs | 93 +++++++++++-------- .../src/generator/state.rs | 4 +- codegen-sdk-cst-generator/src/lib.rs | 1 + codegen-sdk-cst/Cargo.toml | 2 +- codegen-sdk-macros/Cargo.toml | 2 +- rustc-ice-2025-02-19T17_57_00-40929.txt | 58 ++++++++++++ 13 files changed, 131 insertions(+), 51 deletions(-) create mode 100644 rustc-ice-2025-02-19T17_57_00-40929.txt diff --git a/Cargo.lock b/Cargo.lock index cdb8fe2..5944474 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -276,10 +276,12 @@ dependencies = [ "lazy_static", "ouroboros", "phf", + "quote", "rkyv", "serde", "serde_json", "sha2", + "syn 2.0.98", "thiserror", "tree-sitter", "tree-sitter-java", @@ -338,6 +340,8 @@ dependencies = [ "convert_case", "log", "prettyplease", + "proc-macro2", + "quote", "syn 2.0.98", "tree-sitter", ] diff --git a/Cargo.toml b/Cargo.toml index db9338e..349fa79 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "codegen-sdk-core" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] clap = { version = "4.5.28", features = ["derive"] } diff --git a/codegen-sdk-analyzer/Cargo.toml b/codegen-sdk-analyzer/Cargo.toml index c8690d8..58a3475 100644 --- a/codegen-sdk-analyzer/Cargo.toml +++ b/codegen-sdk-analyzer/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "codegen-sdk-analyzer" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] salsa = "0.16.1" diff --git a/codegen-sdk-ast/Cargo.toml b/codegen-sdk-ast/Cargo.toml index b852f17..ca1413f 100644 --- a/codegen-sdk-ast/Cargo.toml +++ b/codegen-sdk-ast/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "codegen-sdk-ast" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] codegen-sdk-cst = { path = "../codegen-sdk-cst" } diff --git a/codegen-sdk-common/Cargo.toml b/codegen-sdk-common/Cargo.toml index 5a7d5c4..7e78c78 100644 --- a/codegen-sdk-common/Cargo.toml +++ b/codegen-sdk-common/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "codegen-sdk-common" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] bytes = { workspace = true } @@ -27,6 +27,8 @@ base64 = "0.22.1" buildid = "1.0.3" sha2 = "0.10.8" zstd = { version = "0.13.2", features = ["zstdmt"] } +syn = "2.0.98" +quote = "1.0.38" [features] python = ["dep:tree-sitter-python"] json = ["dep:tree-sitter-json"] diff --git a/codegen-sdk-cst-generator/Cargo.toml b/codegen-sdk-cst-generator/Cargo.toml index 98e82dd..f8bf1c9 100644 --- a/codegen-sdk-cst-generator/Cargo.toml +++ b/codegen-sdk-cst-generator/Cargo.toml @@ -1,16 +1,18 @@ [package] name = "codegen-sdk-cst-generator" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] convert_case = { workspace = true } prettyplease = "0.2.29" -syn = "2.0.98" +syn = { version = "2.0.98", features = ["proc-macro"] } tree-sitter = { workspace = true } log = { workspace = true } codegen-sdk-common = { path = "../codegen-sdk-common" } anyhow = { workspace = true } +quote = "1.0.38" +proc-macro2 = "1.0.93" [dev-dependencies] codegen-sdk-common = { path = "../codegen-sdk-common" , features = ["python"] } diff --git a/codegen-sdk-cst-generator/src/generator.rs b/codegen-sdk-cst-generator/src/generator.rs index bbf4fff..1cb0444 100644 --- a/codegen-sdk-cst-generator/src/generator.rs +++ b/codegen-sdk-cst-generator/src/generator.rs @@ -48,7 +48,7 @@ pub(crate) fn generate_cst(node_types: &Vec) -> anyhow::Result { } } let mut result = IMPORTS.to_string(); - result.push_str(&state.enums); + result.push_str(&state.enums.to_string()); result.push_str(&state.structs); let formatted = format::format_cst(&result); match formatted { diff --git a/codegen-sdk-cst-generator/src/generator/enum_generator.rs b/codegen-sdk-cst-generator/src/generator/enum_generator.rs index 30e354d..c2a36f2 100644 --- a/codegen-sdk-cst-generator/src/generator/enum_generator.rs +++ b/codegen-sdk-cst-generator/src/generator/enum_generator.rs @@ -2,32 +2,43 @@ use codegen_sdk_common::{ naming::{normalize_string, normalize_type_name}, parser::TypeDefinition, }; +use proc_macro2::TokenStream; +use quote::{TokenStreamExt, format_ident, quote}; use crate::generator::state::State; fn get_cases( variants: &Vec, - cases: &mut String, state: &State, override_variant_name: Option<&str>, existing_cases: &mut Vec, -) { +) -> Vec<(String, TokenStream)> { + let mut cases = Vec::new(); for t in variants { let normalized_variant_name = normalize_type_name(&t.type_name); if normalized_variant_name.is_empty() { continue; } let variant_name = override_variant_name.unwrap_or_else(|| &normalized_variant_name); - let prefix = format!("{}::{}", "Self", variant_name); if let Some(variants) = state.variants.get(&normalized_variant_name) { - get_cases(variants, cases, state, Some(variant_name), existing_cases); + cases.extend(get_cases( + variants, + state, + Some(variant_name), + existing_cases, + )); } else if !existing_cases.contains(&t.type_name) { existing_cases.push(t.type_name.clone()); - cases.push_str(&format!( - "\"{}\" => Ok({}({variant_name}::from_node(node, buffer)?)),", - t.type_name, prefix, + let variant_name = format_ident!("{}", variant_name); + cases.push(( + t.type_name.clone(), + quote!{ Self::#variant_name (#variant_name::from_node(node, buffer)?)}, )); + // cases.insert(t.type_name.clone(), quote!{ + // #t.type_name => Ok(#(#prefix)::from_node(node, buffer)?), + // }.to_string()); } } + return cases; } pub fn generate_enum( variants: &Vec, @@ -35,29 +46,32 @@ pub fn generate_enum( enum_name: &str, anonymous_nodes: bool, ) { - state.enums.push_str(&format!( - " - #[derive(Debug, Clone, Archive, Portable, Deserialize, Serialize)] - #[repr(C, u8)] - pub enum {enum_name} {{\n", - enum_name = enum_name - )); + let mut variant_tokens = Vec::new(); for t in variants { let variant_name = normalize_type_name(&t.type_name); if variant_name.is_empty() { continue; } - state - .enums - .push_str(&format!(" {}({variant_name}),\n", variant_name)); + let variant_name = format_ident!("{}", variant_name); + variant_tokens.push(quote! { + #variant_name(#variant_name) + }); } if anonymous_nodes { - state.enums.push_str(" Anonymous,\n"); + variant_tokens.push(quote! { + Anonymous, + }); } - state.enums.push_str("}\n"); - let mut cases = String::new(); + let enum_name = format_ident!("{}", enum_name); + state.enums.extend_one(quote! { + #[derive(Debug, Clone, Archive, Portable, Deserialize, Serialize)] + #[repr(C, u8)] + pub enum #enum_name { + #(#variant_tokens),* + } + }); let mut existing_cases = Vec::new(); - get_cases(variants, &mut cases, state, None, &mut existing_cases); + let mut cases = get_cases(variants, state, None, &mut existing_cases); if anonymous_nodes { for (name, _variant_name) in state.anonymous_nodes.iter() { if name.is_empty() { @@ -67,27 +81,26 @@ pub fn generate_enum( continue; } let normalized_name = normalize_string(name); - cases.push_str(&format!( - "\"{}\" => Ok(Self::Anonymous),\n", - normalized_name - )); + cases.push((normalized_name, quote!{Self::Anonymous})); } } - state.enums.push_str(&format!( - " - impl FromNode for {enum_name} {{ - fn from_node(node: tree_sitter::Node, buffer: &Arc) -> Result {{ - match node.kind() {{ - {cases} - _ => Err(ParseError::UnexpectedNode {{ + let mut keys = Vec::new(); + let mut values = Vec::new(); + for (key, value) in cases { + keys.push(key); + values.push(value); + } + state.enums.extend_one(quote! { + impl FromNode for #enum_name { + fn from_node(node: tree_sitter::Node, buffer: &Arc) -> Result { + match node.kind() { + #(#keys => Ok(#values)),*, + _ => Err(ParseError::UnexpectedNode { node_type: node.kind().to_string(), backtrace: Backtrace::capture(), - }}), - }} - }} - }} - ", - enum_name = enum_name, - cases = cases - )); + }), + } + } + } + }); } diff --git a/codegen-sdk-cst-generator/src/generator/state.rs b/codegen-sdk-cst-generator/src/generator/state.rs index bb2c71b..f4433df 100644 --- a/codegen-sdk-cst-generator/src/generator/state.rs +++ b/codegen-sdk-cst-generator/src/generator/state.rs @@ -1,10 +1,10 @@ use std::collections::HashMap; use codegen_sdk_common::parser::TypeDefinition; - +use proc_macro2::TokenStream; #[derive(Default, Debug)] pub struct State { - pub enums: String, + pub enums: TokenStream, pub structs: String, pub variants: HashMap>, pub anonymous_nodes: HashMap, diff --git a/codegen-sdk-cst-generator/src/lib.rs b/codegen-sdk-cst-generator/src/lib.rs index 14f938e..914366d 100644 --- a/codegen-sdk-cst-generator/src/lib.rs +++ b/codegen-sdk-cst-generator/src/lib.rs @@ -1,3 +1,4 @@ +#![feature(extend_one)] mod generator; use codegen_sdk_common::language::Language; pub fn generate_cst(language: &Language) -> anyhow::Result<()> { diff --git a/codegen-sdk-cst/Cargo.toml b/codegen-sdk-cst/Cargo.toml index fe844dd..3e1f55f 100644 --- a/codegen-sdk-cst/Cargo.toml +++ b/codegen-sdk-cst/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "codegen-sdk-cst" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] tree-sitter = { workspace = true } diff --git a/codegen-sdk-macros/Cargo.toml b/codegen-sdk-macros/Cargo.toml index 340258d..70ae7cf 100644 --- a/codegen-sdk-macros/Cargo.toml +++ b/codegen-sdk-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "codegen-sdk-macros" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] codegen-sdk-common = { path = "../codegen-sdk-common", features = ["all"] } diff --git a/rustc-ice-2025-02-19T17_57_00-40929.txt b/rustc-ice-2025-02-19T17_57_00-40929.txt new file mode 100644 index 0000000..62ed454 --- /dev/null +++ b/rustc-ice-2025-02-19T17_57_00-40929.txt @@ -0,0 +1,58 @@ +thread 'rustc' panicked at compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs:698:32: +Box +stack backtrace: + 0: 0x111926e5c - std::backtrace::Backtrace::create::h22a5f2472c3379b7 + 1: 0x10fba31a8 - std[3e85eb19313b776c]::panicking::update_hook::>::{closure#0} + 2: 0x11194227c - std::panicking::rust_panic_with_hook::h72d50930cf23b185 + 3: 0x10fc1d010 - std[3e85eb19313b776c]::panicking::begin_panic::::{closure#0} + 4: 0x10fc0c850 - std[3e85eb19313b776c]::sys::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x114458f04 - std[3e85eb19313b776c]::panicking::begin_panic:: + 6: 0x10fc305cc - ::emit_producing_guarantee + 7: 0x1107ab5bc - rustc_middle[afb34f13fcd6275]::util::bug::opt_span_bug_fmt::::{closure#0} + 8: 0x11076cbb4 - rustc_middle[afb34f13fcd6275]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 9: 0x11076c698 - rustc_middle[afb34f13fcd6275]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 10: 0x1144cb37c - rustc_middle[afb34f13fcd6275]::util::bug::bug_fmt + 11: 0x1105e5da0 - >::call_once + 12: 0x1107775cc - ::def_path_hash_to_def_id + 13: 0x1110ccca4 - rustc_query_impl[899f123acbfb8324]::plumbing::force_from_dep_node::, rustc_query_system[6275da08863e1d0b]::dep_graph::graph::DepNodeIndex>, false, false, false>> + 14: 0x11105b560 - ::{closure#0} as core[f28eb5e7393d6f19]::ops::function::FnOnce<(rustc_middle[afb34f13fcd6275]::ty::context::TyCtxt, rustc_query_system[6275da08863e1d0b]::dep_graph::dep_node::DepNode)>>::call_once + 15: 0x110e4b800 - >::try_mark_previous_green:: + 16: 0x110e4b5a4 - >::try_mark_green:: + 17: 0x110e96684 - rustc_query_system[6275da08863e1d0b]::query::plumbing::try_execute_query::>, false, false, false>, rustc_query_impl[899f123acbfb8324]::plumbing::QueryCtxt, true> + 18: 0x11110c2c0 - rustc_query_impl[899f123acbfb8324]::query_impl::def_span::get_query_incr::__rust_end_short_backtrace + 19: 0x110cea188 - rustc_middle[afb34f13fcd6275]::query::plumbing::query_get_at::>> + 20: 0x110d5c8f4 - ::check_attributes + 21: 0x110cdf734 - rustc_hir[b2bb725e25a6fa2d]::intravisit::walk_expr:: + 22: 0x110cdf7c4 - rustc_hir[b2bb725e25a6fa2d]::intravisit::walk_expr:: + 23: 0x110cdf598 - rustc_hir[b2bb725e25a6fa2d]::intravisit::walk_expr:: + 24: 0x110cd190c - rustc_hir[b2bb725e25a6fa2d]::intravisit::walk_block:: + 25: 0x110cdf5c8 - rustc_hir[b2bb725e25a6fa2d]::intravisit::walk_expr:: + 26: 0x110cd190c - rustc_hir[b2bb725e25a6fa2d]::intravisit::walk_block:: + 27: 0x110d6570c - rustc_passes[614940582c3667d6]::check_attr::check_mod_attrs + 28: 0x1110d0e60 - rustc_query_impl[899f123acbfb8324]::plumbing::__rust_begin_short_backtrace::> + 29: 0x110ed90cc - rustc_query_system[6275da08863e1d0b]::query::plumbing::try_execute_query::>, false, false, false>, rustc_query_impl[899f123acbfb8324]::plumbing::QueryCtxt, true> + 30: 0x1110fcabc - rustc_query_impl[899f123acbfb8324]::query_impl::check_mod_attrs::get_query_incr::__rust_end_short_backtrace + 31: 0x110374f70 - ::par_for_each_module::::{closure#0} + 32: 0x11034ce6c - rayon[1c09da1ccc61fb4b]::iter::plumbing::bridge_producer_consumer::helper::, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>> + 33: 0x1103776c8 - rayon_core[15fd5bb237f8999e]::join::join_context::, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>>::{closure#0}, rayon[1c09da1ccc61fb4b]::iter::plumbing::bridge_producer_consumer::helper, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>>::{closure#1}, (), ()>::{closure#0} + 34: 0x11034d110 - rayon[1c09da1ccc61fb4b]::iter::plumbing::bridge_producer_consumer::helper::, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>> + 35: 0x1103776c8 - rayon_core[15fd5bb237f8999e]::join::join_context::, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>>::{closure#0}, rayon[1c09da1ccc61fb4b]::iter::plumbing::bridge_producer_consumer::helper, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>>::{closure#1}, (), ()>::{closure#0} + 36: 0x11034d110 - rayon[1c09da1ccc61fb4b]::iter::plumbing::bridge_producer_consumer::helper::, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>> + 37: 0x1103b900c - , rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>>::{closure#1}>::{closure#0}, ()> as rayon_core[15fd5bb237f8999e]::job::Job>::execute + 38: 0x11440ea64 - ::wait_until_cold + 39: 0x10f26e844 - ::run + 40: 0x10fba728c - <::spawn<::build_scoped::{closure#1}, ()>::{closure#3}::{closure#0}::{closure#0}, rustc_interface[244443ed173c2581]::util::run_in_thread_pool_with_globals::{closure#1}, ()>::{closure#3}::{closure#0}::{closure#1}, ()>::{closure#0}::{closure#0}::{closure#0}, ()>::{closure#0} as core[f28eb5e7393d6f19]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 41: 0x10fb91fc8 - std[3e85eb19313b776c]::sys::backtrace::__rust_begin_short_backtrace:: + core[f28eb5e7393d6f19]::marker::Send>, ()> + 42: 0x10fba62a8 - <::spawn_unchecked_ + core[f28eb5e7393d6f19]::marker::Send>, ()>::{closure#1} as core[f28eb5e7393d6f19]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 43: 0x11194cd38 - std::sys::pal::unix::thread::Thread::new::thread_start::h5a3e2f10a5e00760 + 44: 0x188ca82e4 - __pthread_deallocate + + +rustc version: 1.86.0-nightly (ef148cd7e 2025-02-12) +platform: aarch64-apple-darwin + +query stack during panic: +#0 [def_span] looking up span for `javascript::_::::check_bytes` +#1 [check_mod_attrs] checking attributes in module `javascript` +#2 [analysis] running analysis passes on this crate +end of query stack From c87be2c8327773ac36fee1d1e15d811c8b811fb7 Mon Sep 17 00:00:00 2001 From: bagel897 Date: Wed, 19 Feb 2025 12:06:29 -0800 Subject: [PATCH 2/6] Convert struct generation to use quote --- Cargo.lock | 1 + codegen-sdk-cst-generator/Cargo.toml | 2 +- codegen-sdk-cst-generator/src/generator.rs | 40 ++- .../src/generator/enum_generator.rs | 2 +- .../src/generator/state.rs | 2 +- .../src/generator/struct_generator.rs | 312 +++++++++--------- codegen-sdk-cst/build.rs | 1 + 7 files changed, 177 insertions(+), 183 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5944474..eeed31d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -343,6 +343,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.98", + "tempfile", "tree-sitter", ] diff --git a/codegen-sdk-cst-generator/Cargo.toml b/codegen-sdk-cst-generator/Cargo.toml index f8bf1c9..107fef1 100644 --- a/codegen-sdk-cst-generator/Cargo.toml +++ b/codegen-sdk-cst-generator/Cargo.toml @@ -13,6 +13,6 @@ codegen-sdk-common = { path = "../codegen-sdk-common" } anyhow = { workspace = true } quote = "1.0.38" proc-macro2 = "1.0.93" - +tempfile = "3.8.1" [dev-dependencies] codegen-sdk-common = { path = "../codegen-sdk-common" , features = ["python"] } diff --git a/codegen-sdk-cst-generator/src/generator.rs b/codegen-sdk-cst-generator/src/generator.rs index 1cb0444..af33fc9 100644 --- a/codegen-sdk-cst-generator/src/generator.rs +++ b/codegen-sdk-cst-generator/src/generator.rs @@ -8,16 +8,23 @@ mod enum_generator; mod format; mod state; mod struct_generator; -const IMPORTS: &str = " -use std::sync::Arc; -use tree_sitter; -use derive_more::Debug; -use codegen_sdk_common::*; -use std::backtrace::Backtrace; -use bytes::Bytes; -use rkyv::{Archive, Deserialize, Serialize, Portable}; -"; +use std::io::Write; +use proc_macro2::TokenStream; +use quote::quote; +fn get_imports() -> TokenStream { + quote! { + + use std::sync::Arc; + use tree_sitter; + use derive_more::Debug; + use codegen_sdk_common::*; + use std::backtrace::Backtrace; + use bytes::Bytes; + use rkyv::{Archive, Deserialize, Serialize, Portable}; + + } +} pub(crate) fn generate_cst(node_types: &Vec) -> anyhow::Result { let mut state = State::default(); let mut nodes = HashSet::new(); @@ -47,15 +54,18 @@ pub(crate) fn generate_cst(node_types: &Vec) -> anyhow::Result { generate_struct(node, &mut state, &name); } } - let mut result = IMPORTS.to_string(); - result.push_str(&state.enums.to_string()); - result.push_str(&state.structs); - let formatted = format::format_cst(&result); + let mut result = get_imports(); + result.extend_one(state.enums); + result.extend_one(state.structs); + let formatted = format::format_cst(&result.to_string()); match formatted { Ok(formatted) => return Ok(formatted), Err(e) => { - log::error!("Failed to format CST: {}", e); - return Ok(result.to_string()); + let mut out_file = tempfile::NamedTempFile::with_suffix(".rs")?; + log::error!("Failed to format CST, writing to temp file at {}", out_file.path().display()); + out_file.write_all(result.to_string().as_bytes())?; + out_file.keep()?; + return Err(e); } } } diff --git a/codegen-sdk-cst-generator/src/generator/enum_generator.rs b/codegen-sdk-cst-generator/src/generator/enum_generator.rs index c2a36f2..70f938e 100644 --- a/codegen-sdk-cst-generator/src/generator/enum_generator.rs +++ b/codegen-sdk-cst-generator/src/generator/enum_generator.rs @@ -3,7 +3,7 @@ use codegen_sdk_common::{ parser::TypeDefinition, }; use proc_macro2::TokenStream; -use quote::{TokenStreamExt, format_ident, quote}; +use quote::{format_ident, quote}; use crate::generator::state::State; fn get_cases( diff --git a/codegen-sdk-cst-generator/src/generator/state.rs b/codegen-sdk-cst-generator/src/generator/state.rs index f4433df..95383fb 100644 --- a/codegen-sdk-cst-generator/src/generator/state.rs +++ b/codegen-sdk-cst-generator/src/generator/state.rs @@ -5,7 +5,7 @@ use proc_macro2::TokenStream; #[derive(Default, Debug)] pub struct State { pub enums: TokenStream, - pub structs: String, + pub structs: TokenStream, pub variants: HashMap>, pub anonymous_nodes: HashMap, } diff --git a/codegen-sdk-cst-generator/src/generator/struct_generator.rs b/codegen-sdk-cst-generator/src/generator/struct_generator.rs index b4f7930..8851370 100644 --- a/codegen-sdk-cst-generator/src/generator/struct_generator.rs +++ b/codegen-sdk-cst-generator/src/generator/struct_generator.rs @@ -1,80 +1,12 @@ use codegen_sdk_common::{ naming::{normalize_field_name, normalize_type_name}, - parser::{Children, Fields, Node, TypeDefinition}, + parser::{Children, FieldDefinition, Fields, Node, TypeDefinition}, }; +use proc_macro2::TokenStream; +use quote::{format_ident, quote}; use super::enum_generator::generate_enum; use crate::generator::state::State; -const HEADER_TEMPLATE: &str = " -#[derive(Debug, Clone, Deserialize, Archive, Serialize)] -#[rkyv(serialize_bounds( - __S: rkyv::ser::Writer + rkyv::ser::Allocator, - __S::Error: rkyv::rancor::Source, -))] -#[rkyv(deserialize_bounds(__D::Error: rkyv::rancor::Source))] -#[rkyv(bytecheck( - bounds( - __C: rkyv::validation::ArchiveContext, - __C::Error: rkyv::rancor::Source, - ) -))] -pub struct {name} { - start_byte: usize, - end_byte: usize, - #[debug(\"[{},{}]\", start_position.row, start_position.column)] - start_position: Point, - #[debug(\"[{},{}]\", end_position.row, end_position.column)] - end_position: Point, - #[debug(ignore)] - buffer: Arc, - #[debug(ignore)] - kind_id: u16, -"; -const FOOTER_TEMPLATE: &str = " -} -"; - -const CONSTRUCTOR_TEMPLATE: &str = " -impl CSTNode for {{name}} { - fn start_byte(&self) -> usize { - self.start_byte - } - fn end_byte(&self) -> usize { - self.end_byte - } - fn start_position(&self) -> Point { - self.start_position - } - fn end_position(&self) -> Point { - self.end_position - } - fn buffer(&self) -> &Bytes { - &self.buffer - } - fn kind_id(&self) -> u16 { - self.kind_id - } -} -impl HasChildren for {{name}} { - type Child = {{children}}; - fn children(&self) -> &Vec { - self.children.as_ref() - } -} -impl FromNode for {{name}} { - fn from_node(node: tree_sitter::Node, buffer: &Arc) -> Result { - Ok(Self { - start_byte: node.start_byte(), - end_byte: node.end_byte(), - start_position: node.start_position().into(), - end_position: node.end_position().into(), - buffer: buffer.clone(), - kind_id: node.kind_id(), - {{fields}} - }) - } -} -"; fn convert_type_definition( type_name: &Vec, state: &mut State, @@ -101,132 +33,182 @@ fn convert_type_definition( fn generate_multiple_field( field_name: &str, converted_type_name: &str, - state: &mut State, - constructor_fields: &mut Vec, original_name: &str, -) { - state.structs.push_str(&format!( - " pub {field_name}: Vec<{}>,\n", - converted_type_name - )); - constructor_fields.push(format!( - " {field_name}: get_multiple_children_by_field_name(&node, \"{name}\", buffer)?", - field_name = field_name, - name = original_name - )); +) -> (TokenStream, TokenStream) { + let field_name = format_ident!("{}", field_name); + let converted_type_name = format_ident!("{}", converted_type_name); + let struct_field = quote! { + #[rkyv(omit_bounds)] + pub #field_name: Vec<#converted_type_name> + }; + let constructor_field = quote! { + #field_name: get_multiple_children_by_field_name(&node, #original_name, buffer)? + }; + (struct_field, constructor_field) } fn generate_required_field( field_name: &str, converted_type_name: &str, - state: &mut State, - constructor_fields: &mut Vec, original_name: &str, -) { - state.structs.push_str("#[rkyv(omit_bounds)]"); - state.structs.push_str(&format!( - " pub {field_name}: Box<{type_name}>,\n", - field_name = field_name, - type_name = converted_type_name - )); - constructor_fields.push(format!( - " {field_name}: Box::new(get_child_by_field_name(&node, \"{name}\", buffer)?)", - field_name = field_name, - name = original_name - )); +) -> (TokenStream, TokenStream) { + let field_name = format_ident!("{}", field_name); + let converted_type_name = format_ident!("{}", converted_type_name); + let struct_field = quote! { + #[rkyv(omit_bounds)] + pub #field_name: Box<#converted_type_name> + }; + let constructor_field = quote! { + #field_name: Box::new(get_child_by_field_name(&node, #original_name, buffer)?) + }; + (struct_field, constructor_field) } fn generate_optional_field( field_name: &str, converted_type_name: &str, - state: &mut State, - constructor_fields: &mut Vec, original_name: &str, -) { - state.structs.push_str("#[rkyv(omit_bounds)]"); - state.structs.push_str(&format!( - " pub {field_name}: Box>,\n", - field_name = field_name, - type_name = converted_type_name - )); - constructor_fields.push(format!( - " {field_name}: Box::new(get_optional_child_by_field_name(&node, \"{name}\", buffer)?)", - field_name = field_name, - name = original_name - )); +) -> (TokenStream, TokenStream) { + let field_name = format_ident!("{}", field_name); + let converted_type_name = format_ident!("{}", converted_type_name); + let struct_field = quote! { + #[rkyv(omit_bounds)] + pub #field_name: Box> + }; + let constructor_field = quote! { + #field_name: Box::new(get_optional_child_by_field_name(&node, #original_name, buffer)?) + }; + (struct_field, constructor_field) +} +fn generate_field( + field: &FieldDefinition, + state: &mut State, + node: &Node, + name: &str, +) -> (TokenStream, TokenStream) { + let field_name = normalize_field_name(name); + let converted_type_name = convert_type_definition(&field.types, state, &node.type_name, name); + if field.multiple { + return generate_multiple_field(&field_name, &converted_type_name, name); + } else if field.required { + return generate_required_field(&field_name, &converted_type_name, name); + } else { + return generate_optional_field(&field_name, &converted_type_name, name); + } } fn generate_fields( fields: &Fields, state: &mut State, node: &Node, - constructor_fields: &mut Vec, -) { +) -> (Vec, Vec) { + let mut struct_fields = Vec::new(); + let mut constructor_fields = Vec::new(); for (name, field) in &fields.fields { - let field_name = normalize_field_name(name); - let converted_type_name = - convert_type_definition(&field.types, state, &node.type_name, name); - if field.multiple { - generate_multiple_field( - &field_name, - &converted_type_name, - state, - constructor_fields, - name, - ); - } else if field.required { - generate_required_field( - &field_name, - &converted_type_name, - state, - constructor_fields, - name, - ); - } else { - generate_optional_field( - &field_name, - &converted_type_name, - state, - constructor_fields, - name, - ); - } + let (struct_field, constructor_field) = generate_field(field, state, node, name); + struct_fields.push(struct_field); + constructor_fields.push(constructor_field); } + (struct_fields, constructor_fields) } fn generate_children( children: &Children, state: &mut State, node_name: &str, - constructor_fields: &mut Vec, -) -> String { +) -> (String, TokenStream) { let converted_type_name = convert_type_definition(&children.types, state, node_name, "children"); - constructor_fields - .push(" children: named_children_without_field_names(node, buffer)?".to_string()); - - converted_type_name + let constructor_field = quote! { + children: named_children_without_field_names(node, buffer)? + }; + (converted_type_name, constructor_field) } pub fn generate_struct(node: &Node, state: &mut State, name: &str) { - state - .structs - .push_str(&HEADER_TEMPLATE.replace("{name}", name)); let mut constructor_fields = Vec::new(); + let mut struct_fields = Vec::new(); if let Some(fields) = &node.fields { - generate_fields(fields, state, node, &mut constructor_fields); + (struct_fields, constructor_fields) = generate_fields(fields, state, node); } let mut children_type_name = "Self".to_string(); if let Some(children) = &node.children { - state.structs.push_str("#[rkyv(omit_bounds)]"); - children_type_name = - generate_children(children, state, &node.type_name, &mut constructor_fields); + let constructor_field; + (children_type_name, constructor_field) = + generate_children(children, state, &node.type_name); + constructor_fields.push(constructor_field); } else { - state.structs.push_str("#[rkyv(omit_bounds)]"); - constructor_fields.push(" children: vec![]".to_string()); + constructor_fields.push(quote! { + children: vec![] + }); + } + let name = format_ident!("{}", name); + let children_type_name = format_ident!("{}", children_type_name); + let definition = quote! { + #[derive(Debug, Clone, Deserialize, Archive, Serialize)] + #[rkyv(serialize_bounds( + __S: rkyv::ser::Writer + rkyv::ser::Allocator, + __S::Error: rkyv::rancor::Source, + ))] + #[rkyv(deserialize_bounds(__D::Error: rkyv::rancor::Source))] + #[rkyv(bytecheck( + bounds( + __C: rkyv::validation::ArchiveContext, + __C::Error: rkyv::rancor::Source, + ) + ))] + pub struct #name { + start_byte: usize, + end_byte: usize, + #[debug("[{},{}]", start_position.row, start_position.column)] + start_position: Point, + #[debug("[{},{}]", end_position.row, end_position.column)] + end_position: Point, + #[debug(ignore)] + buffer: Arc, + #[debug(ignore)] + kind_id: u16, + #[rkyv(omit_bounds)] + pub children: Vec<#children_type_name>, + #(#struct_fields),* } - state - .structs - .push_str(&format!(" pub children: Vec<{}>,\n", children_type_name)); - state.structs.push_str(FOOTER_TEMPLATE); - let constructor = &CONSTRUCTOR_TEMPLATE - .replace("{{fields}}", &constructor_fields.join(",\n ")) - .replace("{{name}}", name) - .replace("{{children}}", &children_type_name); - state.structs.push_str(&constructor); + }; + state.structs.extend_one(definition); + let implementation = quote! { + impl CSTNode for #name { + fn start_byte(&self) -> usize { + self.start_byte + } + fn end_byte(&self) -> usize { + self.end_byte + } + fn start_position(&self) -> Point { + self.start_position + } + fn end_position(&self) -> Point { + self.end_position + } + fn buffer(&self) -> &Bytes { + &self.buffer + } + fn kind_id(&self) -> u16 { + self.kind_id + } + } + impl HasChildren for #name { + type Child = #children_type_name; + fn children(&self) -> &Vec { + self.children.as_ref() + } + } + impl FromNode for #name { + fn from_node(node: tree_sitter::Node, buffer: &Arc) -> Result { + Ok(Self { + start_byte: node.start_byte(), + end_byte: node.end_byte(), + start_position: node.start_position().into(), + end_position: node.end_position().into(), + buffer: buffer.clone(), + kind_id: node.kind_id(), + #(#constructor_fields),* + }) + } + } + }; + state.structs.extend_one(implementation); } diff --git a/codegen-sdk-cst/build.rs b/codegen-sdk-cst/build.rs index fd140ff..6e21cae 100644 --- a/codegen-sdk-cst/build.rs +++ b/codegen-sdk-cst/build.rs @@ -2,6 +2,7 @@ use codegen_sdk_common::language::LANGUAGES; use codegen_sdk_cst_generator::generate_cst; use rayon::prelude::*; fn main() { + env_logger::init(); println!("cargo:rerun-if-changed=build.rs"); LANGUAGES.par_iter().for_each(|language| { generate_cst(language).unwrap(); From ef5a531c52e4143344dc1e7639beeef35e512aea Mon Sep 17 00:00:00 2001 From: bagel897 Date: Wed, 19 Feb 2025 12:12:09 -0800 Subject: [PATCH 3/6] fix: serialization --- codegen-sdk-cst-generator/src/generator/struct_generator.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/codegen-sdk-cst-generator/src/generator/struct_generator.rs b/codegen-sdk-cst-generator/src/generator/struct_generator.rs index 8851370..4efa9fb 100644 --- a/codegen-sdk-cst-generator/src/generator/struct_generator.rs +++ b/codegen-sdk-cst-generator/src/generator/struct_generator.rs @@ -38,7 +38,6 @@ fn generate_multiple_field( let field_name = format_ident!("{}", field_name); let converted_type_name = format_ident!("{}", converted_type_name); let struct_field = quote! { - #[rkyv(omit_bounds)] pub #field_name: Vec<#converted_type_name> }; let constructor_field = quote! { From 4650a22f7f7acd7224585de564c5ac0eb1e2dd00 Mon Sep 17 00:00:00 2001 From: bagel897 <57874654+bagel897@users.noreply.github.com> Date: Wed, 19 Feb 2025 20:15:47 +0000 Subject: [PATCH 4/6] Automated pre-commit update --- codegen-sdk-cst-generator/src/generator.rs | 5 ++++- codegen-sdk-cst-generator/src/generator/enum_generator.rs | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/codegen-sdk-cst-generator/src/generator.rs b/codegen-sdk-cst-generator/src/generator.rs index af33fc9..8253126 100644 --- a/codegen-sdk-cst-generator/src/generator.rs +++ b/codegen-sdk-cst-generator/src/generator.rs @@ -62,7 +62,10 @@ pub(crate) fn generate_cst(node_types: &Vec) -> anyhow::Result { Ok(formatted) => return Ok(formatted), Err(e) => { let mut out_file = tempfile::NamedTempFile::with_suffix(".rs")?; - log::error!("Failed to format CST, writing to temp file at {}", out_file.path().display()); + log::error!( + "Failed to format CST, writing to temp file at {}", + out_file.path().display() + ); out_file.write_all(result.to_string().as_bytes())?; out_file.keep()?; return Err(e); diff --git a/codegen-sdk-cst-generator/src/generator/enum_generator.rs b/codegen-sdk-cst-generator/src/generator/enum_generator.rs index 70f938e..34b3984 100644 --- a/codegen-sdk-cst-generator/src/generator/enum_generator.rs +++ b/codegen-sdk-cst-generator/src/generator/enum_generator.rs @@ -31,7 +31,7 @@ fn get_cases( let variant_name = format_ident!("{}", variant_name); cases.push(( t.type_name.clone(), - quote!{ Self::#variant_name (#variant_name::from_node(node, buffer)?)}, + quote! { Self::#variant_name (#variant_name::from_node(node, buffer)?)}, )); // cases.insert(t.type_name.clone(), quote!{ // #t.type_name => Ok(#(#prefix)::from_node(node, buffer)?), @@ -81,7 +81,7 @@ pub fn generate_enum( continue; } let normalized_name = normalize_string(name); - cases.push((normalized_name, quote!{Self::Anonymous})); + cases.push((normalized_name, quote! {Self::Anonymous})); } } let mut keys = Vec::new(); From b4b3a28d744de3d9c870de75fc35053aed64db03 Mon Sep 17 00:00:00 2001 From: bagel897 Date: Wed, 19 Feb 2025 12:24:54 -0800 Subject: [PATCH 5/6] Prune deps --- Cargo.lock | 65 ----------------------------------- Cargo.toml | 1 - codegen-sdk-common/Cargo.toml | 3 -- codegen-sdk-cst/Cargo.toml | 1 - 4 files changed, 70 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eeed31d..09021f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,12 +26,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - [[package]] name = "anstream" version = "0.6.18" @@ -274,14 +268,11 @@ dependencies = [ "bytes", "convert_case", "lazy_static", - "ouroboros", "phf", - "quote", "rkyv", "serde", "serde_json", "sha2", - "syn 2.0.98", "thiserror", "tree-sitter", "tree-sitter-java", @@ -324,7 +315,6 @@ dependencies = [ "derive_more", "env_logger", "log", - "ouroboros", "rayon", "rkyv", "tempfile", @@ -587,12 +577,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -754,30 +738,6 @@ version = "11.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" -[[package]] -name = "ouroboros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" -dependencies = [ - "aliasable", - "ouroboros_macro", - "static_assertions", -] - -[[package]] -name = "ouroboros_macro" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.98", -] - [[package]] name = "parking_lot" version = "0.11.2" @@ -870,19 +830,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", - "version_check", - "yansi", -] - [[package]] name = "ptr_meta" version = "0.3.0" @@ -1167,12 +1114,6 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "streaming-iterator" version = "0.1.9" @@ -1563,12 +1504,6 @@ version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "213b7324336b53d2414b2db8537e56544d981803139155afa84f76eeebb7a546" -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - [[package]] name = "zstd" version = "0.13.2" diff --git a/Cargo.toml b/Cargo.toml index 349fa79..797438c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,7 +28,6 @@ members = [ rayon = "1.10.0" env_logger = "0.11.6" log = "0.4.25" -ouroboros = "0.18.5" tree-sitter = "0.25.1" tree-sitter-python = "0.23.6" tree-sitter-typescript = "0.23.2" diff --git a/codegen-sdk-common/Cargo.toml b/codegen-sdk-common/Cargo.toml index 7e78c78..65a8e32 100644 --- a/codegen-sdk-common/Cargo.toml +++ b/codegen-sdk-common/Cargo.toml @@ -6,7 +6,6 @@ edition = "2024" [dependencies] bytes = { workspace = true } tree-sitter = { workspace = true } -ouroboros = { workspace = true } tree-sitter-python = { workspace = true, optional = true } tree-sitter-typescript = { workspace = true, optional = true } tree-sitter-javascript = { workspace = true, optional = true } @@ -27,8 +26,6 @@ base64 = "0.22.1" buildid = "1.0.3" sha2 = "0.10.8" zstd = { version = "0.13.2", features = ["zstdmt"] } -syn = "2.0.98" -quote = "1.0.38" [features] python = ["dep:tree-sitter-python"] json = ["dep:tree-sitter-json"] diff --git a/codegen-sdk-cst/Cargo.toml b/codegen-sdk-cst/Cargo.toml index 3e1f55f..794d69e 100644 --- a/codegen-sdk-cst/Cargo.toml +++ b/codegen-sdk-cst/Cargo.toml @@ -5,7 +5,6 @@ edition = "2024" [dependencies] tree-sitter = { workspace = true } -ouroboros = { workspace = true } bytes = { workspace = true } codegen-sdk-common = { path = "../codegen-sdk-common", features = ["ts_query"] } codegen-sdk-macros = { path = "../codegen-sdk-macros" } From def89692873bdc13359f51cd8d15996fbc3a35ac Mon Sep 17 00:00:00 2001 From: bagel897 Date: Wed, 19 Feb 2025 12:25:17 -0800 Subject: [PATCH 6/6] remove file --- rustc-ice-2025-02-19T17_57_00-40929.txt | 58 ------------------------- 1 file changed, 58 deletions(-) delete mode 100644 rustc-ice-2025-02-19T17_57_00-40929.txt diff --git a/rustc-ice-2025-02-19T17_57_00-40929.txt b/rustc-ice-2025-02-19T17_57_00-40929.txt deleted file mode 100644 index 62ed454..0000000 --- a/rustc-ice-2025-02-19T17_57_00-40929.txt +++ /dev/null @@ -1,58 +0,0 @@ -thread 'rustc' panicked at compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs:698:32: -Box -stack backtrace: - 0: 0x111926e5c - std::backtrace::Backtrace::create::h22a5f2472c3379b7 - 1: 0x10fba31a8 - std[3e85eb19313b776c]::panicking::update_hook::>::{closure#0} - 2: 0x11194227c - std::panicking::rust_panic_with_hook::h72d50930cf23b185 - 3: 0x10fc1d010 - std[3e85eb19313b776c]::panicking::begin_panic::::{closure#0} - 4: 0x10fc0c850 - std[3e85eb19313b776c]::sys::backtrace::__rust_end_short_backtrace::::{closure#0}, !> - 5: 0x114458f04 - std[3e85eb19313b776c]::panicking::begin_panic:: - 6: 0x10fc305cc - ::emit_producing_guarantee - 7: 0x1107ab5bc - rustc_middle[afb34f13fcd6275]::util::bug::opt_span_bug_fmt::::{closure#0} - 8: 0x11076cbb4 - rustc_middle[afb34f13fcd6275]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} - 9: 0x11076c698 - rustc_middle[afb34f13fcd6275]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> - 10: 0x1144cb37c - rustc_middle[afb34f13fcd6275]::util::bug::bug_fmt - 11: 0x1105e5da0 - >::call_once - 12: 0x1107775cc - ::def_path_hash_to_def_id - 13: 0x1110ccca4 - rustc_query_impl[899f123acbfb8324]::plumbing::force_from_dep_node::, rustc_query_system[6275da08863e1d0b]::dep_graph::graph::DepNodeIndex>, false, false, false>> - 14: 0x11105b560 - ::{closure#0} as core[f28eb5e7393d6f19]::ops::function::FnOnce<(rustc_middle[afb34f13fcd6275]::ty::context::TyCtxt, rustc_query_system[6275da08863e1d0b]::dep_graph::dep_node::DepNode)>>::call_once - 15: 0x110e4b800 - >::try_mark_previous_green:: - 16: 0x110e4b5a4 - >::try_mark_green:: - 17: 0x110e96684 - rustc_query_system[6275da08863e1d0b]::query::plumbing::try_execute_query::>, false, false, false>, rustc_query_impl[899f123acbfb8324]::plumbing::QueryCtxt, true> - 18: 0x11110c2c0 - rustc_query_impl[899f123acbfb8324]::query_impl::def_span::get_query_incr::__rust_end_short_backtrace - 19: 0x110cea188 - rustc_middle[afb34f13fcd6275]::query::plumbing::query_get_at::>> - 20: 0x110d5c8f4 - ::check_attributes - 21: 0x110cdf734 - rustc_hir[b2bb725e25a6fa2d]::intravisit::walk_expr:: - 22: 0x110cdf7c4 - rustc_hir[b2bb725e25a6fa2d]::intravisit::walk_expr:: - 23: 0x110cdf598 - rustc_hir[b2bb725e25a6fa2d]::intravisit::walk_expr:: - 24: 0x110cd190c - rustc_hir[b2bb725e25a6fa2d]::intravisit::walk_block:: - 25: 0x110cdf5c8 - rustc_hir[b2bb725e25a6fa2d]::intravisit::walk_expr:: - 26: 0x110cd190c - rustc_hir[b2bb725e25a6fa2d]::intravisit::walk_block:: - 27: 0x110d6570c - rustc_passes[614940582c3667d6]::check_attr::check_mod_attrs - 28: 0x1110d0e60 - rustc_query_impl[899f123acbfb8324]::plumbing::__rust_begin_short_backtrace::> - 29: 0x110ed90cc - rustc_query_system[6275da08863e1d0b]::query::plumbing::try_execute_query::>, false, false, false>, rustc_query_impl[899f123acbfb8324]::plumbing::QueryCtxt, true> - 30: 0x1110fcabc - rustc_query_impl[899f123acbfb8324]::query_impl::check_mod_attrs::get_query_incr::__rust_end_short_backtrace - 31: 0x110374f70 - ::par_for_each_module::::{closure#0} - 32: 0x11034ce6c - rayon[1c09da1ccc61fb4b]::iter::plumbing::bridge_producer_consumer::helper::, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>> - 33: 0x1103776c8 - rayon_core[15fd5bb237f8999e]::join::join_context::, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>>::{closure#0}, rayon[1c09da1ccc61fb4b]::iter::plumbing::bridge_producer_consumer::helper, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>>::{closure#1}, (), ()>::{closure#0} - 34: 0x11034d110 - rayon[1c09da1ccc61fb4b]::iter::plumbing::bridge_producer_consumer::helper::, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>> - 35: 0x1103776c8 - rayon_core[15fd5bb237f8999e]::join::join_context::, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>>::{closure#0}, rayon[1c09da1ccc61fb4b]::iter::plumbing::bridge_producer_consumer::helper, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>>::{closure#1}, (), ()>::{closure#0} - 36: 0x11034d110 - rayon[1c09da1ccc61fb4b]::iter::plumbing::bridge_producer_consumer::helper::, rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>> - 37: 0x1103b900c - , rayon[1c09da1ccc61fb4b]::iter::for_each::ForEachConsumer::par_for_each_module::{closure#0}>::{closure#0}::{closure#0}>>::{closure#1}>::{closure#0}, ()> as rayon_core[15fd5bb237f8999e]::job::Job>::execute - 38: 0x11440ea64 - ::wait_until_cold - 39: 0x10f26e844 - ::run - 40: 0x10fba728c - <::spawn<::build_scoped::{closure#1}, ()>::{closure#3}::{closure#0}::{closure#0}, rustc_interface[244443ed173c2581]::util::run_in_thread_pool_with_globals::{closure#1}, ()>::{closure#3}::{closure#0}::{closure#1}, ()>::{closure#0}::{closure#0}::{closure#0}, ()>::{closure#0} as core[f28eb5e7393d6f19]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} - 41: 0x10fb91fc8 - std[3e85eb19313b776c]::sys::backtrace::__rust_begin_short_backtrace:: + core[f28eb5e7393d6f19]::marker::Send>, ()> - 42: 0x10fba62a8 - <::spawn_unchecked_ + core[f28eb5e7393d6f19]::marker::Send>, ()>::{closure#1} as core[f28eb5e7393d6f19]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} - 43: 0x11194cd38 - std::sys::pal::unix::thread::Thread::new::thread_start::h5a3e2f10a5e00760 - 44: 0x188ca82e4 - __pthread_deallocate - - -rustc version: 1.86.0-nightly (ef148cd7e 2025-02-12) -platform: aarch64-apple-darwin - -query stack during panic: -#0 [def_span] looking up span for `javascript::_::::check_bytes` -#1 [check_mod_attrs] checking attributes in module `javascript` -#2 [analysis] running analysis passes on this crate -end of query stack