diff --git a/tools/parse_rust_ast.rs b/tools/parse_rust_ast.rs index 67842a7..20a2b9f 100644 --- a/tools/parse_rust_ast.rs +++ b/tools/parse_rust_ast.rs @@ -3,7 +3,6 @@ use serde::Serialize; use std::env; use std::fs; use std::process; -use syn::spanned::Spanned; use syn::{ FnArg, Item, ItemEnum, ItemFn, ItemImpl, ItemMod, ItemStruct, ItemTrait, Pat, Type, Visibility, }; @@ -51,17 +50,6 @@ fn main() { let mut decls = Vec::new(); - // Package comment (first comment group before package decl) - let pkg_comment = ""; - for cg in &syntax.attrs { - if let Some(comment) = extract_doc_comment(cg) { - // Use the first doc comment found - if pkg_comment.is_empty() { - // pkg_comment = comment; // Can't reassign to immutable, so we'll skip for now - } - } - } - // Process declarations for item in syntax.items { match item { @@ -104,8 +92,8 @@ fn main() { } fn parse_function(item_fn: ItemFn, _content: &str) -> Option { - let start_line = item_fn.span().start().line; - let end_line = item_fn.span().end().line; + let start_line = item_fn.sig.ident.span().start().line; + let end_line = item_fn.sig.ident.span().end().line; let mut parameters = Vec::new(); for input in &item_fn.sig.inputs { @@ -145,8 +133,8 @@ fn parse_function(item_fn: ItemFn, _content: &str) -> Option { } fn parse_struct(item_struct: ItemStruct, _content: &str) -> Option { - let start_line = item_struct.span().start().line; - let end_line = item_struct.span().end().line; + let start_line = item_struct.ident.span().start().line; + let end_line = item_struct.ident.span().end().line; let fields: Vec = item_struct .fields @@ -177,8 +165,8 @@ fn parse_struct(item_struct: ItemStruct, _content: &str) -> Option { } fn parse_enum(item_enum: ItemEnum, _content: &str) -> Option { - let start_line = item_enum.span().start().line; - let end_line = item_enum.span().end().line; + let start_line = item_enum.ident.span().start().line; + let end_line = item_enum.ident.span().end().line; let variants: Vec = item_enum .variants @@ -209,8 +197,8 @@ fn parse_enum(item_enum: ItemEnum, _content: &str) -> Option { } fn parse_trait(item_trait: ItemTrait, _content: &str) -> Option { - let start_line = item_trait.span().start().line; - let end_line = item_trait.span().end().line; + let start_line = item_trait.ident.span().start().line; + let end_line = item_trait.ident.span().end().line; let methods: Vec = item_trait .items @@ -247,8 +235,19 @@ fn parse_trait(item_trait: ItemTrait, _content: &str) -> Option { } fn parse_impl(item_impl: ItemImpl, _content: &str) -> Option { - let start_line = item_impl.span().start().line; - let end_line = item_impl.span().end().line; + // For impl blocks, use the span of the first item or the impl keyword + let start_line = if let Some(first_item) = item_impl.items.first() { + first_item.span().start().line + } else { + // Fallback: use a reasonable default + 1 + }; + + let end_line = if let Some(last_item) = item_impl.items.last() { + last_item.span().end().line + } else { + start_line + }; let target = type_to_string(&item_impl.self_ty); let methods: Vec = item_impl @@ -293,8 +292,8 @@ fn parse_impl(item_impl: ItemImpl, _content: &str) -> Option { } fn parse_mod(item_mod: ItemMod, _content: &str) -> Option { - let start_line = item_mod.span().start().line; - let end_line = item_mod.span().end().line; + let start_line = item_mod.ident.span().start().line; + let end_line = item_mod.ident.span().end().line; Some(RustDecl { name: item_mod.ident.to_string(), @@ -351,18 +350,3 @@ fn generic_param_to_string(param: &syn::GenericParam) -> String { syn::GenericParam::Const(cnst) => cnst.ident.to_string(), } } - -fn extract_doc_comment(attr: &syn::Attribute) -> Option { - if attr.path().is_ident("doc") { - if let syn::Meta::NameValue(meta) = &attr.meta { - if let syn::Expr::Lit(syn::ExprLit { - lit: syn::Lit::Str(lit_str), - .. - }) = &meta.value - { - return Some(lit_str.value().trim().to_string()); - } - } - } - None -}