From 9e154a800a50d5f87164854fc8785171f1eb8b9a Mon Sep 17 00:00:00 2001 From: Mohd Mohsin Date: Tue, 2 Sep 2025 16:20:39 +0530 Subject: [PATCH] added the line number to existing path --- editor/src/messages/message.rs | 11 +++++++---- editor/src/utility_traits.rs | 5 +++-- editor/src/utility_types.rs | 19 +++++++++++++++++-- proc-macros/src/extract_fields.rs | 7 +++++++ proc-macros/src/hierarchical_tree.rs | 4 ++++ proc-macros/src/message_handler_data_attr.rs | 17 ++++++++++++----- 6 files changed, 50 insertions(+), 13 deletions(-) diff --git a/editor/src/messages/message.rs b/editor/src/messages/message.rs index b23d530e29..29adce66b3 100644 --- a/editor/src/messages/message.rs +++ b/editor/src/messages/message.rs @@ -58,7 +58,7 @@ mod test { fn generate_message_tree() { let result = Message::build_message_tree(); let mut file = std::fs::File::create("../hierarchical_message_system_tree.txt").unwrap(); - file.write_all(format!("{} `{}`\n", result.name(), result.path()).as_bytes()).unwrap(); + file.write_all(format!("{} `{}#L{}`\n", result.name(), result.path(), result.line_number()).as_bytes()).unwrap(); if let Some(variants) = result.variants() { for (i, variant) in variants.iter().enumerate() { let is_last = i == variants.len() - 1; @@ -80,7 +80,8 @@ mod test { if tree.path().is_empty() { file.write_all(format!("{}{}{}\n", prefix, branch, tree.name()).as_bytes()).unwrap(); } else { - file.write_all(format!("{}{}{} `{}`\n", prefix, branch, tree.name(), tree.path()).as_bytes()).unwrap(); + file.write_all(format!("{}{}{} `{}#L{}`\n", prefix, branch, tree.name(), tree.path(), tree.line_number()).as_bytes()) + .unwrap(); } // Print children if any @@ -116,7 +117,8 @@ mod test { if data.name().is_empty() && tree.name() != FRONTEND_MESSAGE_STR { panic!("{}'s MessageHandler is missing #[message_handler_data]", tree.name()); } else if tree.name() != FRONTEND_MESSAGE_STR { - file.write_all(format!("{}{}{} `{}`\n", prefix, branch, data.name(), data.path()).as_bytes()).unwrap(); + file.write_all(format!("{}{}{} `{}#L{}`\n", prefix, branch, data.name(), data.path(), data.line_number()).as_bytes()) + .unwrap(); for (i, field) in data.fields().iter().enumerate() { let is_last_field = i == len - 1; @@ -133,7 +135,8 @@ mod test { if data.path().is_empty() { file.write_all(format!("{}{}{}\n", prefix, "└── ", data.name()).as_bytes()).unwrap(); } else { - file.write_all(format!("{}{}{} `{}`\n", prefix, "└── ", data.name(), data.path()).as_bytes()).unwrap(); + file.write_all(format!("{}{}{} `{}#L{}`\n", prefix, "└── ", data.name(), data.path(), data.line_number()).as_bytes()) + .unwrap(); } for (i, field) in data.fields().iter().enumerate() { let is_last_field = i == len - 1; diff --git a/editor/src/utility_traits.rs b/editor/src/utility_traits.rs index 386d6fda65..951874c26b 100644 --- a/editor/src/utility_traits.rs +++ b/editor/src/utility_traits.rs @@ -49,11 +49,11 @@ pub trait HierarchicalTree { fn build_message_tree() -> DebugMessageTree; fn message_handler_data_str() -> MessageData { - MessageData::new(String::new(), Vec::new(), "") + MessageData::new(String::new(), Vec::new(), "", 0) } fn message_handler_str() -> MessageData { - MessageData::new(String::new(), Vec::new(), "") + MessageData::new(String::new(), Vec::new(), "", 0) } fn path() -> &'static str { @@ -64,5 +64,6 @@ pub trait HierarchicalTree { pub trait ExtractField { fn field_types() -> Vec<(String, usize)>; fn path() -> &'static str; + fn line_number() -> usize; fn print_field_types(); } diff --git a/editor/src/utility_types.rs b/editor/src/utility_types.rs index c27ce5c12b..c80271f5cb 100644 --- a/editor/src/utility_types.rs +++ b/editor/src/utility_types.rs @@ -3,11 +3,12 @@ pub struct MessageData { name: String, fields: Vec<(String, usize)>, path: &'static str, + line_number: usize, } impl MessageData { - pub fn new(name: String, fields: Vec<(String, usize)>, path: &'static str) -> MessageData { - MessageData { name, fields, path } + pub fn new(name: String, fields: Vec<(String, usize)>, path: &'static str, line_number: usize) -> MessageData { + MessageData { name, fields, path, line_number } } pub fn name(&self) -> &str { @@ -21,6 +22,10 @@ impl MessageData { pub fn path(&self) -> &'static str { self.path } + + pub fn line_number(&self) -> usize { + self.line_number + } } #[derive(Debug)] @@ -31,6 +36,7 @@ pub struct DebugMessageTree { message_handler: Option, message_handler_data: Option, path: &'static str, + line_number: usize, } impl DebugMessageTree { @@ -42,6 +48,7 @@ impl DebugMessageTree { message_handler: None, message_handler_data: None, path: "", + line_number: 0, } } @@ -53,6 +60,10 @@ impl DebugMessageTree { self.path = path; } + pub fn set_line_number(&mut self, line_number: usize) { + self.line_number = line_number + } + pub fn add_variant(&mut self, variant: DebugMessageTree) { if let Some(variants) = &mut self.variants { variants.push(variant); @@ -81,6 +92,10 @@ impl DebugMessageTree { self.path } + pub fn line_number(&self) -> usize { + self.line_number + } + pub fn variants(&self) -> Option<&Vec> { self.variants.as_ref() } diff --git a/proc-macros/src/extract_fields.rs b/proc-macros/src/extract_fields.rs index 949ff3f50d..d085387f20 100644 --- a/proc-macros/src/extract_fields.rs +++ b/proc-macros/src/extract_fields.rs @@ -9,6 +9,8 @@ pub fn derive_extract_field_impl(input: TokenStream) -> syn::Result let generics = &input.generics; let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); + let line_number = struct_name.span().start().line; + let fields = match &input.data { Data::Struct(data) => match &data.fields { Fields::Named(fields) => &fields.named, @@ -50,6 +52,11 @@ pub fn derive_extract_field_impl(input: TokenStream) -> syn::Result fn path() -> &'static str { file!() } + + fn line_number() -> usize { + #line_number + } + } }; diff --git a/proc-macros/src/hierarchical_tree.rs b/proc-macros/src/hierarchical_tree.rs index a37f8e4140..1cddc6e5cf 100644 --- a/proc-macros/src/hierarchical_tree.rs +++ b/proc-macros/src/hierarchical_tree.rs @@ -7,6 +7,8 @@ pub fn generate_hierarchical_tree(input: TokenStream) -> syn::Result(input)?; let input_type = &input.ident; + let line_number = input_type.span().start().line; + let data = match &input.data { Data::Enum(data) => data, _ => return Err(syn::Error::new(Span::call_site(), "Tried to derive HierarchicalTree for non-enum")), @@ -101,6 +103,8 @@ pub fn generate_hierarchical_tree(input: TokenStream) -> syn::Result path, @@ -40,14 +42,16 @@ pub fn message_handler_data_attr_impl(attr: TokenStream, input_item: TokenStream // Get just the base identifier (ToolMessageData) without generics let type_name = &type_path.path.segments.first().unwrap().ident; + let handler_data_line_number = type_name.span().start().line; + quote! { #input_item impl #message_type { pub fn message_handler_data_str() -> MessageData { - MessageData::new(format!("{}", stringify!(#type_name)), #type_name::field_types(), #type_name::path()) + MessageData::new(format!("{}", stringify!(#type_name)), #type_name::field_types(), #type_name::path(), #type_name::line_number()) } pub fn message_handler_str() -> MessageData { - MessageData::new(format!("{}", stringify!(#input_type)), #input_type::field_types(), #input_type::path()) + MessageData::new(format!("{}", stringify!(#input_type)), #input_type::field_types(), #input_type::path(), #input_type::line_number()) } } @@ -57,7 +61,7 @@ pub fn message_handler_data_attr_impl(attr: TokenStream, input_item: TokenStream #input_item impl #message_type { pub fn message_handler_str() -> MessageData { - MessageData::new(format!("{}", stringify!(#input_type)), #input_type::field_types(), #input_type::path()) + MessageData::new(format!("{}", stringify!(#input_type)), #input_type::field_types(), #input_type::path(), #input_type::line_number()) } } }, @@ -67,16 +71,19 @@ pub fn message_handler_data_attr_impl(attr: TokenStream, input_item: TokenStream syn::Type::Path(type_path) => &type_path.path.segments.first().unwrap().ident, _ => return Err(syn::Error::new(type_reference.elem.span(), "Expected type path")), }; + + let type_line_number = type_ident.span().start().line; + let tr = clean_rust_type_syntax(type_reference.to_token_stream().to_string()); quote! { #input_item impl #message_type { pub fn message_handler_data_str() -> MessageData { - MessageData::new(format!("{}", #tr), #type_ident::field_types(), #type_ident::path()) + MessageData::new(format!("{}", #tr), #type_ident::field_types(), #type_ident::path(), #type_ident::line_number()) } pub fn message_handler_str() -> MessageData { - MessageData::new(format!("{}", stringify!(#input_type)), #input_type::field_types(), #input_type::path()) + MessageData::new(format!("{}", stringify!(#input_type)), #input_type::field_types(), #input_type::path(), #input_type::line_number()) } }