@@ -111,7 +111,7 @@ impl CodeGenerationCommand {
111
111
Line ( "// DO NOT EDIT." . to_string( ) ) ,
112
112
Line ( format!( "// source: {}" , requested_file. get_filename( ) ?) ) ,
113
113
BlankLine ,
114
- generate_node( & gen , id, & root_name, None ) ?,
114
+ generate_node( & gen , id, & root_name) ?,
115
115
] ) ;
116
116
117
117
let text = stringify ( & lines) ;
@@ -160,6 +160,11 @@ pub struct GeneratorContext<'a> {
160
160
pub request : schema_capnp:: code_generator_request:: Reader < ' a > ,
161
161
pub node_map : collections:: hash_map:: HashMap < u64 , schema_capnp:: node:: Reader < ' a > > ,
162
162
pub scope_map : collections:: hash_map:: HashMap < u64 , Vec < String > > ,
163
+
164
+ /// Map from node ID to the node ID of its parent scope. This is equal to node.scope_id
165
+ /// for all nodes except for autogenerated interface Param and Result structs;
166
+ /// those have scope_id set to 0. See the comment on paramStructType in schema.capnp.
167
+ pub node_parents : collections:: hash_map:: HashMap < u64 , u64 > ,
163
168
}
164
169
165
170
impl < ' a > GeneratorContext < ' a > {
@@ -180,10 +185,28 @@ impl<'a> GeneratorContext<'a> {
180
185
request : message. get_root ( ) ?,
181
186
node_map : collections:: hash_map:: HashMap :: < u64 , schema_capnp:: node:: Reader < ' a > > :: new ( ) ,
182
187
scope_map : collections:: hash_map:: HashMap :: < u64 , Vec < String > > :: new ( ) ,
188
+ node_parents : collections:: hash_map:: HashMap :: new ( ) ,
183
189
} ;
184
190
185
191
for node in gen. request . get_nodes ( ) ? {
186
192
gen. node_map . insert ( node. get_id ( ) , node) ;
193
+ gen. node_parents . insert ( node. get_id ( ) , node. get_scope_id ( ) ) ;
194
+ }
195
+
196
+ // Fix up "anonymous" method params and results scopes.
197
+ for node in gen. request . get_nodes ( ) ? {
198
+ if let Ok ( schema_capnp:: node:: Interface ( interface_reader) ) = node. which ( ) {
199
+ for method in interface_reader. get_methods ( ) ? {
200
+ let param_struct_type = method. get_param_struct_type ( ) ;
201
+ if gen. node_parents . get ( & param_struct_type) == Some ( & 0 ) {
202
+ gen. node_parents . insert ( param_struct_type, node. get_id ( ) ) ;
203
+ }
204
+ let result_struct_type = method. get_result_struct_type ( ) ;
205
+ if gen. node_parents . get ( & result_struct_type) == Some ( & 0 ) {
206
+ gen. node_parents . insert ( result_struct_type, node. get_id ( ) ) ;
207
+ }
208
+ }
209
+ }
187
210
}
188
211
189
212
for requested_file in gen. request . get_requested_files ( ) ? {
@@ -291,6 +314,7 @@ impl<'a> GeneratorContext<'a> {
291
314
}
292
315
}
293
316
}
317
+
294
318
Ok ( ( ) )
295
319
}
296
320
@@ -1527,9 +1551,6 @@ fn generate_node(
1527
1551
gen : & GeneratorContext ,
1528
1552
node_id : u64 ,
1529
1553
node_name : & str ,
1530
- // Ugh. We need this to deal with the anonymous Params and Results
1531
- // structs that go with RPC methods.
1532
- parent_node_id : Option < u64 > ,
1533
1554
) -> :: capnp:: Result < FormattedText > {
1534
1555
use crate :: schema_capnp:: * ;
1535
1556
@@ -1540,15 +1561,15 @@ fn generate_node(
1540
1561
let nested_nodes = node_reader. get_nested_nodes ( ) ?;
1541
1562
for nested_node in nested_nodes {
1542
1563
let id = nested_node. get_id ( ) ;
1543
- nested_output. push ( generate_node ( gen, id, gen. get_last_name ( id) ?, None ) ?) ;
1564
+ nested_output. push ( generate_node ( gen, id, gen. get_last_name ( id) ?) ?) ;
1544
1565
}
1545
1566
1546
1567
match node_reader. which ( ) ? {
1547
1568
node:: File ( ( ) ) => {
1548
1569
output. push ( Branch ( nested_output) ) ;
1549
1570
}
1550
1571
node:: Struct ( struct_reader) => {
1551
- let params = node_reader. parameters_texts ( gen, parent_node_id ) ;
1572
+ let params = node_reader. parameters_texts ( gen) ;
1552
1573
output. push ( BlankLine ) ;
1553
1574
1554
1575
let is_generic = node_reader. get_is_generic ( ) ;
@@ -1634,7 +1655,7 @@ fn generate_node(
1634
1655
1635
1656
if let Ok ( field:: Group ( group) ) = field. which ( ) {
1636
1657
let id = group. get_type_id ( ) ;
1637
- let text = generate_node ( gen, id, gen. get_last_name ( id) ?, None ) ?;
1658
+ let text = generate_node ( gen, id, gen. get_last_name ( id) ?) ?;
1638
1659
nested_output. push ( text) ;
1639
1660
}
1640
1661
}
@@ -1968,7 +1989,7 @@ fn generate_node(
1968
1989
}
1969
1990
1970
1991
node:: Interface ( interface) => {
1971
- let params = node_reader. parameters_texts ( gen, parent_node_id ) ;
1992
+ let params = node_reader. parameters_texts ( gen) ;
1972
1993
output. push ( BlankLine ) ;
1973
1994
1974
1995
let is_generic = node_reader. get_is_generic ( ) ;
@@ -2002,7 +2023,7 @@ fn generate_node(
2002
2023
let ( param_scopes, params_ty_params) = if param_node. get_scope_id ( ) == 0 {
2003
2024
let mut names = names. clone ( ) ;
2004
2025
let local_name = module_name ( & format ! ( "{name}Params" ) ) ;
2005
- nested_output. push ( generate_node ( gen, param_id, & local_name, Some ( node_id ) ) ?) ;
2026
+ nested_output. push ( generate_node ( gen, param_id, & local_name) ?) ;
2006
2027
names. push ( local_name) ;
2007
2028
( names, params. params . clone ( ) )
2008
2029
} else {
@@ -2025,7 +2046,7 @@ fn generate_node(
2025
2046
let ( result_scopes, results_ty_params) = if result_node. get_scope_id ( ) == 0 {
2026
2047
let mut names = names. clone ( ) ;
2027
2048
let local_name = module_name ( & format ! ( "{name}Results" ) ) ;
2028
- nested_output. push ( generate_node ( gen, result_id, & local_name, Some ( node_id ) ) ?) ;
2049
+ nested_output. push ( generate_node ( gen, result_id, & local_name) ?) ;
2029
2050
names. push ( local_name) ;
2030
2051
( names, params. params . clone ( ) )
2031
2052
} else {
0 commit comments