Skip to content

Commit b697cc8

Browse files
MohdMohsin97Keavon
andauthored
Add line numbers to file paths in the website editor structure docs (#3130)
* added the line number to existing path * Update JS parser to use line numbers --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
1 parent 82f7dc7 commit b697cc8

File tree

7 files changed

+51
-14
lines changed

7 files changed

+51
-14
lines changed

editor/src/utility_traits.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ pub trait HierarchicalTree {
4949
fn build_message_tree() -> DebugMessageTree;
5050

5151
fn message_handler_data_str() -> MessageData {
52-
MessageData::new(String::new(), Vec::new(), "")
52+
MessageData::new(String::new(), Vec::new(), "", 0)
5353
}
5454

5555
fn message_handler_str() -> MessageData {
56-
MessageData::new(String::new(), Vec::new(), "")
56+
MessageData::new(String::new(), Vec::new(), "", 0)
5757
}
5858

5959
fn path() -> &'static str {
@@ -64,5 +64,6 @@ pub trait HierarchicalTree {
6464
pub trait ExtractField {
6565
fn field_types() -> Vec<(String, usize)>;
6666
fn path() -> &'static str;
67+
fn line_number() -> usize;
6768
fn print_field_types();
6869
}

editor/src/utility_types.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ pub struct MessageData {
33
name: String,
44
fields: Vec<(String, usize)>,
55
path: &'static str,
6+
line_number: usize,
67
}
78

89
impl MessageData {
9-
pub fn new(name: String, fields: Vec<(String, usize)>, path: &'static str) -> MessageData {
10-
MessageData { name, fields, path }
10+
pub fn new(name: String, fields: Vec<(String, usize)>, path: &'static str, line_number: usize) -> MessageData {
11+
MessageData { name, fields, path, line_number }
1112
}
1213

1314
pub fn name(&self) -> &str {
@@ -21,6 +22,10 @@ impl MessageData {
2122
pub fn path(&self) -> &'static str {
2223
self.path
2324
}
25+
26+
pub fn line_number(&self) -> usize {
27+
self.line_number
28+
}
2429
}
2530

2631
#[derive(Debug)]
@@ -31,6 +36,7 @@ pub struct DebugMessageTree {
3136
message_handler: Option<MessageData>,
3237
message_handler_data: Option<MessageData>,
3338
path: &'static str,
39+
line_number: usize,
3440
}
3541

3642
impl DebugMessageTree {
@@ -42,6 +48,7 @@ impl DebugMessageTree {
4248
message_handler: None,
4349
message_handler_data: None,
4450
path: "",
51+
line_number: 0,
4552
}
4653
}
4754

@@ -53,6 +60,10 @@ impl DebugMessageTree {
5360
self.path = path;
5461
}
5562

63+
pub fn set_line_number(&mut self, line_number: usize) {
64+
self.line_number = line_number
65+
}
66+
5667
pub fn add_variant(&mut self, variant: DebugMessageTree) {
5768
if let Some(variants) = &mut self.variants {
5869
variants.push(variant);
@@ -81,6 +92,10 @@ impl DebugMessageTree {
8192
self.path
8293
}
8394

95+
pub fn line_number(&self) -> usize {
96+
self.line_number
97+
}
98+
8499
pub fn variants(&self) -> Option<&Vec<DebugMessageTree>> {
85100
self.variants.as_ref()
86101
}

proc-macros/src/extract_fields.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ pub fn derive_extract_field_impl(input: TokenStream) -> syn::Result<TokenStream>
99
let generics = &input.generics;
1010
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
1111

12+
let line_number = struct_name.span().start().line;
13+
1214
let fields = match &input.data {
1315
Data::Struct(data) => match &data.fields {
1416
Fields::Named(fields) => &fields.named,
@@ -50,6 +52,11 @@ pub fn derive_extract_field_impl(input: TokenStream) -> syn::Result<TokenStream>
5052
fn path() -> &'static str {
5153
file!()
5254
}
55+
56+
fn line_number() -> usize {
57+
#line_number
58+
}
59+
5360
}
5461
};
5562

proc-macros/src/hierarchical_tree.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ pub fn generate_hierarchical_tree(input: TokenStream) -> syn::Result<TokenStream
77
let input = parse2::<DeriveInput>(input)?;
88
let input_type = &input.ident;
99

10+
let line_number = input_type.span().start().line;
11+
1012
let data = match &input.data {
1113
Data::Enum(data) => data,
1214
_ => 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<TokenStream
101103

102104
message_tree.set_path(file!());
103105

106+
message_tree.set_line_number(#line_number);
107+
104108
message_tree
105109
}
106110
}

proc-macros/src/message_handler_data_attr.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ pub fn message_handler_data_attr_impl(attr: TokenStream, input_item: TokenStream
1616

1717
let input_type = path.segments.last().map(|s| &s.ident).unwrap();
1818

19+
let handler_line_number = input_type.span().start().line;
20+
1921
// Extract the message type from the trait path
2022
let trait_path = match &impl_block.trait_ {
2123
Some((_, path, _)) => path,
@@ -40,14 +42,16 @@ pub fn message_handler_data_attr_impl(attr: TokenStream, input_item: TokenStream
4042
// Get just the base identifier (ToolMessageData) without generics
4143
let type_name = &type_path.path.segments.first().unwrap().ident;
4244

45+
let handler_data_line_number = type_name.span().start().line;
46+
4347
quote! {
4448
#input_item
4549
impl #message_type {
4650
pub fn message_handler_data_str() -> MessageData {
47-
MessageData::new(format!("{}", stringify!(#type_name)), #type_name::field_types(), #type_name::path())
51+
MessageData::new(format!("{}", stringify!(#type_name)), #type_name::field_types(), #type_name::path(), #type_name::line_number())
4852
}
4953
pub fn message_handler_str() -> MessageData {
50-
MessageData::new(format!("{}", stringify!(#input_type)), #input_type::field_types(), #input_type::path())
54+
MessageData::new(format!("{}", stringify!(#input_type)), #input_type::field_types(), #input_type::path(), #input_type::line_number())
5155

5256
}
5357
}
@@ -57,7 +61,7 @@ pub fn message_handler_data_attr_impl(attr: TokenStream, input_item: TokenStream
5761
#input_item
5862
impl #message_type {
5963
pub fn message_handler_str() -> MessageData {
60-
MessageData::new(format!("{}", stringify!(#input_type)), #input_type::field_types(), #input_type::path())
64+
MessageData::new(format!("{}", stringify!(#input_type)), #input_type::field_types(), #input_type::path(), #input_type::line_number())
6165
}
6266
}
6367
},
@@ -67,16 +71,19 @@ pub fn message_handler_data_attr_impl(attr: TokenStream, input_item: TokenStream
6771
syn::Type::Path(type_path) => &type_path.path.segments.first().unwrap().ident,
6872
_ => return Err(syn::Error::new(type_reference.elem.span(), "Expected type path")),
6973
};
74+
75+
let type_line_number = type_ident.span().start().line;
76+
7077
let tr = clean_rust_type_syntax(type_reference.to_token_stream().to_string());
7178
quote! {
7279
#input_item
7380
impl #message_type {
7481
pub fn message_handler_data_str() -> MessageData {
75-
MessageData::new(format!("{}", #tr), #type_ident::field_types(), #type_ident::path())
82+
MessageData::new(format!("{}", #tr), #type_ident::field_types(), #type_ident::path(), #type_ident::line_number())
7683
}
7784

7885
pub fn message_handler_str() -> MessageData {
79-
MessageData::new(format!("{}", stringify!(#input_type)), #input_type::field_types(), #input_type::path())
86+
MessageData::new(format!("{}", stringify!(#input_type)), #input_type::field_types(), #input_type::path(), #input_type::line_number())
8087

8188
}
8289
}

tools/editor-message-tree/src/main.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ fn main() {
66
let result = Message::message_tree();
77
std::fs::create_dir_all("../../website/generated").unwrap();
88
let mut file = std::fs::File::create("../../website/generated/hierarchical_message_system_tree.txt").unwrap();
9-
file.write_all(format!("{} `{}`\n", result.name(), result.path()).as_bytes()).unwrap();
9+
file.write_all(format!("{} `{}#L{}`\n", result.name(), result.path(), result.line_number()).as_bytes()).unwrap();
1010
if let Some(variants) = result.variants() {
1111
for (i, variant) in variants.iter().enumerate() {
1212
let is_last = i == variants.len() - 1;
@@ -28,7 +28,8 @@ fn print_tree_node(tree: &DebugMessageTree, prefix: &str, is_last: bool, file: &
2828
if tree.path().is_empty() {
2929
file.write_all(format!("{}{}{}\n", prefix, branch, tree.name()).as_bytes()).unwrap();
3030
} else {
31-
file.write_all(format!("{}{}{} `{}`\n", prefix, branch, tree.name(), tree.path()).as_bytes()).unwrap();
31+
file.write_all(format!("{}{}{} `{}#L{}`\n", prefix, branch, tree.name(), tree.path(), tree.line_number()).as_bytes())
32+
.unwrap();
3233
}
3334

3435
// Print children if any
@@ -64,7 +65,8 @@ fn print_tree_node(tree: &DebugMessageTree, prefix: &str, is_last: bool, file: &
6465
if data.name().is_empty() && tree.name() != FRONTEND_MESSAGE_STR {
6566
panic!("{}'s MessageHandler is missing #[message_handler_data]", tree.name());
6667
} else if tree.name() != FRONTEND_MESSAGE_STR {
67-
file.write_all(format!("{}{}{} `{}`\n", prefix, branch, data.name(), data.path()).as_bytes()).unwrap();
68+
file.write_all(format!("{}{}{} `{}#L{}`\n", prefix, branch, data.name(), data.path(), data.line_number()).as_bytes())
69+
.unwrap();
6870

6971
for (i, field) in data.fields().iter().enumerate() {
7072
let is_last_field = i == len - 1;
@@ -81,7 +83,8 @@ fn print_tree_node(tree: &DebugMessageTree, prefix: &str, is_last: bool, file: &
8183
if data.path().is_empty() {
8284
file.write_all(format!("{}{}{}\n", prefix, "└── ", data.name()).as_bytes()).unwrap();
8385
} else {
84-
file.write_all(format!("{}{}{} `{}`\n", prefix, "└── ", data.name(), data.path()).as_bytes()).unwrap();
86+
file.write_all(format!("{}{}{} `{}#L{}`\n", prefix, "└── ", data.name(), data.path(), data.line_number()).as_bytes())
87+
.unwrap();
8588
}
8689
for (i, field) in data.fields().iter().enumerate() {
8790
let is_last_field = i == len - 1;

website/.build-scripts/generate-editor-structure.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ function buildHtmlList(nodes: Entry[], currentIndex: number, currentLevel: numbe
5050
const hasDirectChildren = i + 1 < nodes.length && nodes[i + 1].level > node.level;
5151
const hasDeeperChildren = hasDirectChildren && i + 2 < nodes.length && nodes[i + 2].level > nodes[i + 1].level;
5252

53-
const linkHtml = node.link ? `<a href="${node.link}" target="_blank">${path.basename(node.link)}</a>` : "";
53+
const linkHtml = node.link ? `<a href="${node.link}" target="_blank">${path.basename(node.link.split("#L").join(":"))}</a>` : "";
5454
const fieldPieces = node.text.match(/([^:]*):(.*)/);
5555
let escapedText;
5656
if (fieldPieces && fieldPieces.length === 3) {

0 commit comments

Comments
 (0)