Skip to content

Commit 329d198

Browse files
committed
unified: Convert TypeCheckContext to a struct
1 parent b345494 commit 329d198

1 file changed

Lines changed: 41 additions & 22 deletions

File tree

shared/yeast/src/dump.rs

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ use std::fmt::Write;
22

33
use 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.
1213
pub 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

Comments
 (0)