@@ -2,11 +2,12 @@ use std::fmt::Write;
22
33use crate :: { schema:: Schema , Ast , Id , Node , NodeContent , CHILD_FIELD } ;
44
5- type TypeCheckContext < ' a > = (
6- & ' a Schema ,
7- Option < & ' a [ crate :: schema:: NodeType ] > ,
8- Option < ( & ' a str , & ' a str ) > ,
9- ) ;
5+ #[ derive( Clone , Copy ) ]
6+ struct TypeCheckContext < ' a > {
7+ schema : & ' a Schema ,
8+ expected : Option < & ' a [ crate :: schema:: NodeType ] > ,
9+ parent_field : Option < ( & ' a str , & ' a str ) > ,
10+ }
1011
1112/// Options for controlling AST dump output.
1213pub struct DumpOptions {
@@ -76,7 +77,11 @@ pub fn dump_ast_with_type_errors_and_options(
7677 source,
7778 options,
7879 0 ,
79- Some ( ( schema, None , None ) ) ,
80+ Some ( TypeCheckContext {
81+ schema,
82+ expected : None ,
83+ parent_field : None ,
84+ } ) ,
8085 & mut out,
8186 ) ;
8287 out
@@ -221,8 +226,10 @@ fn dump_node(
221226 }
222227 }
223228
224- if let Some ( ( schema, expected, parent_field) ) = type_check {
225- if let Some ( err) = type_error_for_node ( schema, node, expected, parent_field) {
229+ if let Some ( context) = type_check {
230+ if let Some ( err) =
231+ type_error_for_node ( context. schema , node, context. expected , context. parent_field )
232+ {
226233 write ! ( out, " <-- ERROR: {err}" ) . unwrap ( ) ;
227234 }
228235 }
@@ -244,10 +251,11 @@ fn dump_node(
244251 . copied ( )
245252 . filter ( |& f| f != CHILD_FIELD )
246253 . collect ( ) ;
247- match type_check. and_then ( |( schema, _, _) | {
248- schema
254+ match type_check. and_then ( |context| {
255+ context
256+ . schema
249257 . field_order ( node. kind_name ( ) )
250- . map ( |order| ( schema, order) )
258+ . map ( |order| ( context . schema , order) )
251259 } ) {
252260 Some ( ( schema, order) ) => {
253261 let mut result: Vec < u16 > = order
@@ -269,11 +277,15 @@ fn dump_node(
269277 for field_id in named_field_ids {
270278 let children = & node. fields [ & field_id] ;
271279 let field_name = ast. field_name_for_id ( field_id) . unwrap_or ( "?" ) ;
272- let child_type_check = type_check. map ( |( schema , _ , _ ) | {
273- let expected =
274- expected_for_field ( schema , node . kind_name ( ) , field_name ) . or ( Some ( EMPTY_NODE_TYPES ) ) ;
280+ let child_type_check = type_check. map ( |context | {
281+ let expected = expected_for_field ( context . schema , node . kind_name ( ) , field_name )
282+ . or ( Some ( EMPTY_NODE_TYPES ) ) ;
275283 let parent_field = Some ( ( node. kind_name ( ) , field_name) ) ;
276- ( schema, expected, parent_field)
284+ TypeCheckContext {
285+ schema : context. schema ,
286+ expected,
287+ parent_field,
288+ }
277289 } ) ;
278290
279291 if children. len ( ) == 1 {
@@ -312,8 +324,8 @@ fn dump_node(
312324 }
313325
314326 // Check for required fields that are absent
315- if let Some ( ( schema , _ , _ ) ) = type_check {
316- for ( _field_id, field_name) in schema. required_fields_for_kind ( node. kind_name ( ) ) {
327+ if let Some ( context ) = type_check {
328+ for ( _field_id, field_name) in context . schema . required_fields_for_kind ( node. kind_name ( ) ) {
317329 let present = match field_name {
318330 Some ( n) => ast
319331 . field_id_for_name ( n)
@@ -329,13 +341,18 @@ fn dump_node(
329341
330342 // Unnamed children — skip unnamed tokens (keywords, punctuation)
331343 if let Some ( children) = node. fields . get ( & CHILD_FIELD ) {
332- let child_type_check = type_check. map ( |( schema, _, _) | {
333- let expected = schema
344+ let child_type_check = type_check. map ( |context| {
345+ let expected = context
346+ . schema
334347 . field_types ( node. kind_name ( ) , CHILD_FIELD )
335348 . map ( |v| v. as_slice ( ) )
336349 . or ( Some ( EMPTY_NODE_TYPES ) ) ;
337350 let parent_field = Some ( ( node. kind_name ( ) , "children" ) ) ;
338- ( schema, expected, parent_field)
351+ TypeCheckContext {
352+ schema : context. schema ,
353+ expected,
354+ parent_field,
355+ }
339356 } ) ;
340357 for & child_id in children {
341358 if let Some ( child) = ast. get_node ( child_id) {
@@ -392,8 +409,10 @@ fn dump_node_inline(
392409 }
393410 }
394411
395- if let Some ( ( schema, expected, parent_field) ) = type_check {
396- if let Some ( err) = type_error_for_node ( schema, node, expected, parent_field) {
412+ if let Some ( context) = type_check {
413+ if let Some ( err) =
414+ type_error_for_node ( context. schema , node, context. expected , context. parent_field )
415+ {
397416 write ! ( out, " <-- ERROR: {err}" ) . unwrap ( ) ;
398417 }
399418 }
0 commit comments