Skip to main content

rdf_parsers/jsonld/
parser.rs

1use crate::TokenTrait;
2pub type SyntaxNode = rowan::SyntaxNode<Lang>;
3#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, logos :: Logos)]
4# [logos (subpattern HEX = r#"([0-9]|[A-F]|[a-f])"#)]
5# [logos (subpattern JSON_STRING = r#""(([^\x{22}\x{5C}]|\\\u0022|\\\u005C|\\\u002F|\\b|\\f|\\n|\\r|\\t|\\u(?&HEX)(?&HEX)(?&HEX)(?&HEX)))*""#)]
6# [logos (subpattern JSON_NUMBER = r#"(-)?(0|[1-9]([0-9])*)(\.([0-9])+)?([eE]([+-])?([0-9])+)?"#)]
7#[repr(u16)]
8pub enum SyntaxKind {
9    Eof = 0,
10    #[regex(r"[ \t\n\r]+")]
11    WhiteSpace,
12    #[regex(r"#[^\n]*", allow_greedy = true)]
13    Comment,
14    #[doc = r" producings"]
15    JsonArray,
16    JsonObject,
17    JsonString,
18    JsonValue,
19    JsonldDoc,
20    Member,
21    MemberList,
22    ValueList,
23    #[doc = r" terminals"]
24    #[token(",")]
25    Comma,
26    #[token(":")]
27    Colon,
28    #[token("[")]
29    SqOpen,
30    #[token("]")]
31    SqClose,
32    #[token("false")]
33    FalseLit,
34    #[token("null")]
35    NullLit,
36    #[token("true")]
37    TrueLit,
38    #[token("{")]
39    CurlyOpen,
40    #[token("}")]
41    CurlyClose,
42    #[regex("(?&JSON_NUMBER)")]
43    JsonNumber,
44    #[regex("(?&JSON_STRING)")]
45    StringToken,
46    Error,
47    ROOT,
48}
49impl From<SyntaxKind> for rowan::SyntaxKind {
50    fn from(kind: SyntaxKind) -> Self {
51        Self(kind as u16)
52    }
53}
54impl From<rowan::SyntaxKind> for SyntaxKind {
55    fn from(value: rowan::SyntaxKind) -> Self {
56        assert!(value.0 <= SyntaxKind::ROOT as u16);
57        unsafe { std::mem::transmute::<u16, SyntaxKind>(value.0) }
58    }
59}
60#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
61pub enum Lang {}
62impl rowan::Language for Lang {
63    type Kind = SyntaxKind;
64    fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind {
65        assert!(raw.0 <= SyntaxKind::ROOT as u16);
66        unsafe { std::mem::transmute::<u16, SyntaxKind>(raw.0) }
67    }
68    fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind {
69        kind.into()
70    }
71}
72mod definitions {
73    use super::*;
74    #[derive(Debug, Clone, Copy)]
75    pub struct Rule {
76        pub kind: SyntaxKind,
77        pub state: usize,
78    }
79    impl Rule {
80        pub fn new(kind: SyntaxKind) -> Self {
81            match kind {
82                SyntaxKind::JsonldDoc => Rule {
83                    kind,
84                    state: 1usize,
85                },
86                SyntaxKind::JsonObject => Rule {
87                    kind,
88                    state: 4usize,
89                },
90                SyntaxKind::JsonArray => Rule {
91                    kind,
92                    state: 4usize,
93                },
94                SyntaxKind::MemberList => Rule {
95                    kind,
96                    state: 4usize,
97                },
98                SyntaxKind::Member => Rule {
99                    kind,
100                    state: 3usize,
101                },
102                SyntaxKind::JsonValue => Rule {
103                    kind,
104                    state: 1usize,
105                },
106                SyntaxKind::ValueList => Rule {
107                    kind,
108                    state: 4usize,
109                },
110                SyntaxKind::JsonString => Rule {
111                    kind,
112                    state: 1usize,
113                },
114                SyntaxKind::Comma => Rule { kind, state: 0 },
115                SyntaxKind::Colon => Rule { kind, state: 0 },
116                SyntaxKind::SqOpen => Rule { kind, state: 0 },
117                SyntaxKind::SqClose => Rule { kind, state: 0 },
118                SyntaxKind::FalseLit => Rule { kind, state: 0 },
119                SyntaxKind::NullLit => Rule { kind, state: 0 },
120                SyntaxKind::TrueLit => Rule { kind, state: 0 },
121                SyntaxKind::CurlyOpen => Rule { kind, state: 0 },
122                SyntaxKind::CurlyClose => Rule { kind, state: 0 },
123                SyntaxKind::JsonNumber => Rule { kind, state: 0 },
124                SyntaxKind::StringToken => Rule { kind, state: 0 },
125                _ => panic!("Unknown rule kind {:?}", kind),
126            }
127        }
128    }
129    pub fn first_tokens(kind: SyntaxKind) -> &'static [SyntaxKind] {
130        match kind {
131            SyntaxKind::JsonArray => &[SyntaxKind::SqOpen],
132            SyntaxKind::JsonObject => &[SyntaxKind::CurlyOpen],
133            SyntaxKind::JsonString => &[],
134            SyntaxKind::JsonValue => &[
135                SyntaxKind::CurlyOpen,
136                SyntaxKind::FalseLit,
137                SyntaxKind::NullLit,
138                SyntaxKind::SqOpen,
139                SyntaxKind::TrueLit,
140            ],
141            SyntaxKind::JsonldDoc => &[
142                SyntaxKind::CurlyOpen,
143                SyntaxKind::FalseLit,
144                SyntaxKind::NullLit,
145                SyntaxKind::SqOpen,
146                SyntaxKind::TrueLit,
147            ],
148            SyntaxKind::Member => &[],
149            SyntaxKind::MemberList => &[],
150            SyntaxKind::ValueList => &[
151                SyntaxKind::CurlyOpen,
152                SyntaxKind::FalseLit,
153                SyntaxKind::NullLit,
154                SyntaxKind::SqOpen,
155                SyntaxKind::TrueLit,
156            ],
157            SyntaxKind::Comma => &[SyntaxKind::Comma],
158            SyntaxKind::Colon => &[SyntaxKind::Colon],
159            SyntaxKind::SqOpen => &[SyntaxKind::SqOpen],
160            SyntaxKind::SqClose => &[SyntaxKind::SqClose],
161            SyntaxKind::FalseLit => &[SyntaxKind::FalseLit],
162            SyntaxKind::NullLit => &[SyntaxKind::NullLit],
163            SyntaxKind::TrueLit => &[SyntaxKind::TrueLit],
164            SyntaxKind::CurlyOpen => &[SyntaxKind::CurlyOpen],
165            SyntaxKind::CurlyClose => &[SyntaxKind::CurlyClose],
166            SyntaxKind::JsonNumber => &[SyntaxKind::JsonNumber],
167            SyntaxKind::StringToken => &[SyntaxKind::StringToken],
168            _ => &[],
169        }
170    }
171    #[doc = r" Returns the minimum error cost that `kind` must incur when `tok`"]
172    #[doc = r" is the current token.  0 means the token is reachable (or the rule"]
173    #[doc = r" is nullable); positive means the rule cannot make progress without"]
174    #[doc = r" at least that much error cost."]
175    pub fn min_error_for_token(kind: SyntaxKind, tok: SyntaxKind) -> isize {
176        match kind {
177            SyntaxKind::JsonArray => match tok {
178                SyntaxKind::Colon
179                | SyntaxKind::Comma
180                | SyntaxKind::CurlyClose
181                | SyntaxKind::CurlyOpen
182                | SyntaxKind::FalseLit
183                | SyntaxKind::JsonNumber
184                | SyntaxKind::NullLit
185                | SyntaxKind::SqClose
186                | SyntaxKind::SqOpen
187                | SyntaxKind::StringToken
188                | SyntaxKind::TrueLit => 0,
189                _ => kind.max_error_value(),
190            },
191            SyntaxKind::JsonObject => match tok {
192                SyntaxKind::Colon
193                | SyntaxKind::Comma
194                | SyntaxKind::CurlyClose
195                | SyntaxKind::CurlyOpen
196                | SyntaxKind::FalseLit
197                | SyntaxKind::JsonNumber
198                | SyntaxKind::NullLit
199                | SyntaxKind::SqClose
200                | SyntaxKind::SqOpen
201                | SyntaxKind::StringToken
202                | SyntaxKind::TrueLit => 0,
203                _ => kind.max_error_value(),
204            },
205            SyntaxKind::JsonString => match tok {
206                SyntaxKind::StringToken => 0,
207                _ => kind.max_error_value(),
208            },
209            SyntaxKind::JsonValue => match tok {
210                SyntaxKind::Colon
211                | SyntaxKind::Comma
212                | SyntaxKind::CurlyClose
213                | SyntaxKind::CurlyOpen
214                | SyntaxKind::FalseLit
215                | SyntaxKind::JsonNumber
216                | SyntaxKind::NullLit
217                | SyntaxKind::SqClose
218                | SyntaxKind::SqOpen
219                | SyntaxKind::StringToken
220                | SyntaxKind::TrueLit => 0,
221                _ => kind.max_error_value(),
222            },
223            SyntaxKind::JsonldDoc => match tok {
224                SyntaxKind::Colon
225                | SyntaxKind::Comma
226                | SyntaxKind::CurlyClose
227                | SyntaxKind::CurlyOpen
228                | SyntaxKind::FalseLit
229                | SyntaxKind::JsonNumber
230                | SyntaxKind::NullLit
231                | SyntaxKind::SqClose
232                | SyntaxKind::SqOpen
233                | SyntaxKind::StringToken
234                | SyntaxKind::TrueLit => 0,
235                _ => kind.max_error_value(),
236            },
237            SyntaxKind::Member => match tok {
238                SyntaxKind::Colon
239                | SyntaxKind::Comma
240                | SyntaxKind::CurlyClose
241                | SyntaxKind::CurlyOpen
242                | SyntaxKind::FalseLit
243                | SyntaxKind::JsonNumber
244                | SyntaxKind::NullLit
245                | SyntaxKind::SqClose
246                | SyntaxKind::SqOpen
247                | SyntaxKind::StringToken
248                | SyntaxKind::TrueLit => 0,
249                _ => kind.max_error_value(),
250            },
251            SyntaxKind::MemberList => match tok {
252                SyntaxKind::Colon
253                | SyntaxKind::Comma
254                | SyntaxKind::CurlyClose
255                | SyntaxKind::CurlyOpen
256                | SyntaxKind::FalseLit
257                | SyntaxKind::JsonNumber
258                | SyntaxKind::NullLit
259                | SyntaxKind::SqClose
260                | SyntaxKind::SqOpen
261                | SyntaxKind::StringToken
262                | SyntaxKind::TrueLit => 0,
263                _ => kind.max_error_value(),
264            },
265            SyntaxKind::ValueList => match tok {
266                SyntaxKind::Colon
267                | SyntaxKind::Comma
268                | SyntaxKind::CurlyClose
269                | SyntaxKind::CurlyOpen
270                | SyntaxKind::FalseLit
271                | SyntaxKind::JsonNumber
272                | SyntaxKind::NullLit
273                | SyntaxKind::SqClose
274                | SyntaxKind::SqOpen
275                | SyntaxKind::StringToken
276                | SyntaxKind::TrueLit => 0,
277                _ => kind.max_error_value(),
278            },
279            SyntaxKind::Comma => match tok {
280                SyntaxKind::Comma => 0,
281                _ => kind.max_error_value(),
282            },
283            SyntaxKind::Colon => match tok {
284                SyntaxKind::Colon => 0,
285                _ => kind.max_error_value(),
286            },
287            SyntaxKind::SqOpen => match tok {
288                SyntaxKind::SqOpen => 0,
289                _ => kind.max_error_value(),
290            },
291            SyntaxKind::SqClose => match tok {
292                SyntaxKind::SqClose => 0,
293                _ => kind.max_error_value(),
294            },
295            SyntaxKind::FalseLit => match tok {
296                SyntaxKind::FalseLit => 0,
297                _ => kind.max_error_value(),
298            },
299            SyntaxKind::NullLit => match tok {
300                SyntaxKind::NullLit => 0,
301                _ => kind.max_error_value(),
302            },
303            SyntaxKind::TrueLit => match tok {
304                SyntaxKind::TrueLit => 0,
305                _ => kind.max_error_value(),
306            },
307            SyntaxKind::CurlyOpen => match tok {
308                SyntaxKind::CurlyOpen => 0,
309                _ => kind.max_error_value(),
310            },
311            SyntaxKind::CurlyClose => match tok {
312                SyntaxKind::CurlyClose => 0,
313                _ => kind.max_error_value(),
314            },
315            SyntaxKind::JsonNumber => match tok {
316                SyntaxKind::JsonNumber => 0,
317                _ => kind.max_error_value(),
318            },
319            SyntaxKind::StringToken => match tok {
320                SyntaxKind::StringToken => 0,
321                _ => kind.max_error_value(),
322            },
323            _ => 0,
324        }
325    }
326    #[doc = r" Precomputed dist(q, a): minimum insertion cost to reach a point"]
327    #[doc = r" where terminal `terminal` can be matched, starting from parser"]
328    #[doc = r" state `(kind, state)`.  Returns 0 as the conservative default"]
329    #[doc = r" (admissible — parent context might accept the terminal after a pop)."]
330    pub fn state_dist(kind: SyntaxKind, state: usize, terminal: SyntaxKind) -> isize {
331        match (kind, state, terminal) {
332            (SyntaxKind::JsonArray, 1usize, _) => match terminal {
333                SyntaxKind::SqClose => 0,
334                _ => 4isize,
335            },
336            (SyntaxKind::JsonArray, 2usize, _) => match terminal {
337                SyntaxKind::Colon => 1isize,
338                SyntaxKind::Comma => 1isize,
339                SyntaxKind::CurlyClose => 1isize,
340                _ => 0,
341            },
342            (SyntaxKind::JsonArray, 3usize, _) => match terminal {
343                SyntaxKind::JsonNumber
344                | SyntaxKind::StringToken
345                | SyntaxKind::CurlyOpen
346                | SyntaxKind::FalseLit
347                | SyntaxKind::NullLit
348                | SyntaxKind::SqOpen
349                | SyntaxKind::TrueLit => 0,
350                _ => 1isize,
351            },
352            (SyntaxKind::JsonArray, 4usize, _) => match terminal {
353                SyntaxKind::SqOpen => 0,
354                _ => 4isize,
355            },
356            (SyntaxKind::JsonObject, 1usize, _) => match terminal {
357                SyntaxKind::CurlyClose => 0,
358                _ => 2isize,
359            },
360            (SyntaxKind::JsonObject, 2usize, _) => match terminal {
361                SyntaxKind::StringToken | SyntaxKind::CurlyClose => 0,
362                _ => 1isize,
363            },
364            (SyntaxKind::JsonObject, 3usize, _) => match terminal {
365                SyntaxKind::StringToken => 0,
366                _ => 1isize,
367            },
368            (SyntaxKind::JsonObject, 4usize, _) => match terminal {
369                SyntaxKind::CurlyOpen => 0,
370                _ => 2isize,
371            },
372            (SyntaxKind::JsonString, 1usize, _) => match terminal {
373                SyntaxKind::StringToken => 0,
374                _ => 1isize,
375            },
376            (SyntaxKind::JsonValue, 1usize, _) => match terminal {
377                SyntaxKind::JsonNumber
378                | SyntaxKind::StringToken
379                | SyntaxKind::CurlyOpen
380                | SyntaxKind::FalseLit
381                | SyntaxKind::NullLit
382                | SyntaxKind::SqOpen
383                | SyntaxKind::TrueLit => 0,
384                _ => 1isize,
385            },
386            (SyntaxKind::JsonValue, 2usize, _) => match terminal {
387                SyntaxKind::CurlyOpen => 0,
388                _ => 2isize,
389            },
390            (SyntaxKind::JsonValue, 3usize, _) => match terminal {
391                SyntaxKind::SqOpen => 0,
392                _ => 4isize,
393            },
394            (SyntaxKind::JsonValue, 4usize, _) => match terminal {
395                SyntaxKind::StringToken => 0,
396                _ => 1isize,
397            },
398            (SyntaxKind::JsonValue, 5usize, _) => match terminal {
399                SyntaxKind::JsonNumber => 0,
400                _ => 1isize,
401            },
402            (SyntaxKind::JsonValue, 6usize, _) => match terminal {
403                SyntaxKind::TrueLit => 0,
404                _ => 1isize,
405            },
406            (SyntaxKind::JsonValue, 7usize, _) => match terminal {
407                SyntaxKind::FalseLit => 0,
408                _ => 1isize,
409            },
410            (SyntaxKind::JsonValue, 8usize, _) => match terminal {
411                SyntaxKind::NullLit => 0,
412                _ => 1isize,
413            },
414            (SyntaxKind::JsonldDoc, 1usize, _) => match terminal {
415                SyntaxKind::JsonNumber
416                | SyntaxKind::StringToken
417                | SyntaxKind::CurlyOpen
418                | SyntaxKind::FalseLit
419                | SyntaxKind::NullLit
420                | SyntaxKind::SqOpen
421                | SyntaxKind::TrueLit => 0,
422                _ => 1isize,
423            },
424            (SyntaxKind::Member, 1usize, _) => match terminal {
425                SyntaxKind::JsonNumber
426                | SyntaxKind::StringToken
427                | SyntaxKind::CurlyOpen
428                | SyntaxKind::FalseLit
429                | SyntaxKind::NullLit
430                | SyntaxKind::SqOpen
431                | SyntaxKind::TrueLit => 0,
432                _ => 1isize,
433            },
434            (SyntaxKind::Member, 2usize, _) => match terminal {
435                SyntaxKind::JsonNumber => 3isize,
436                SyntaxKind::StringToken => 3isize,
437                SyntaxKind::Comma => 4isize,
438                SyntaxKind::CurlyClose => 4isize,
439                SyntaxKind::CurlyOpen => 3isize,
440                SyntaxKind::FalseLit => 3isize,
441                SyntaxKind::NullLit => 3isize,
442                SyntaxKind::SqClose => 4isize,
443                SyntaxKind::SqOpen => 3isize,
444                SyntaxKind::TrueLit => 3isize,
445                _ => 0,
446            },
447            (SyntaxKind::Member, 3usize, _) => match terminal {
448                SyntaxKind::StringToken => 0,
449                _ => 1isize,
450            },
451            (SyntaxKind::MemberList, 2usize, _) => match terminal {
452                SyntaxKind::StringToken => 0,
453                _ => 1isize,
454            },
455            (SyntaxKind::MemberList, 3usize, _) => match terminal {
456                SyntaxKind::JsonNumber => 3isize,
457                SyntaxKind::StringToken => 2isize,
458                SyntaxKind::Colon => 3isize,
459                SyntaxKind::CurlyClose => 3isize,
460                SyntaxKind::CurlyOpen => 3isize,
461                SyntaxKind::FalseLit => 3isize,
462                SyntaxKind::NullLit => 3isize,
463                SyntaxKind::SqClose => 3isize,
464                SyntaxKind::SqOpen => 3isize,
465                SyntaxKind::TrueLit => 3isize,
466                _ => 0,
467            },
468            (SyntaxKind::MemberList, 4usize, _) => match terminal {
469                SyntaxKind::StringToken => 0,
470                _ => 1isize,
471            },
472            (SyntaxKind::ValueList, 2usize, _) => match terminal {
473                SyntaxKind::JsonNumber
474                | SyntaxKind::StringToken
475                | SyntaxKind::CurlyOpen
476                | SyntaxKind::FalseLit
477                | SyntaxKind::NullLit
478                | SyntaxKind::SqOpen
479                | SyntaxKind::TrueLit => 0,
480                _ => 1isize,
481            },
482            (SyntaxKind::ValueList, 3usize, _) => match terminal {
483                SyntaxKind::JsonNumber => 2isize,
484                SyntaxKind::StringToken => 2isize,
485                SyntaxKind::Colon => 3isize,
486                SyntaxKind::CurlyClose => 3isize,
487                SyntaxKind::CurlyOpen => 2isize,
488                SyntaxKind::FalseLit => 2isize,
489                SyntaxKind::NullLit => 2isize,
490                SyntaxKind::SqClose => 3isize,
491                SyntaxKind::SqOpen => 2isize,
492                SyntaxKind::TrueLit => 2isize,
493                _ => 0,
494            },
495            (SyntaxKind::ValueList, 4usize, _) => match terminal {
496                SyntaxKind::JsonNumber
497                | SyntaxKind::StringToken
498                | SyntaxKind::CurlyOpen
499                | SyntaxKind::FalseLit
500                | SyntaxKind::NullLit
501                | SyntaxKind::SqOpen
502                | SyntaxKind::TrueLit => 0,
503                _ => 1isize,
504            },
505            _ => 0,
506        }
507    }
508    impl crate::a_star::ParserTrait for Rule {
509        type Kind = SyntaxKind;
510        fn step(
511            &self,
512            element: &crate::a_star::Element<Self>,
513            state: &mut crate::a_star::AStar<Self>,
514        ) {
515            match (self.kind, self.state) {
516                (SyntaxKind::JsonldDoc, 0usize) => {
517                    if let Some(parent) = element.pop() {
518                        state.add_element(parent);
519                    }
520                }
521                (SyntaxKind::JsonldDoc, 1usize) => {
522                    state.add_element_checked(
523                        element
524                            .pop_push(Rule {
525                                kind: self.kind,
526                                state: 0usize,
527                            })
528                            .push(Rule {
529                                kind: SyntaxKind::JsonValue,
530                                state: 1usize,
531                            }),
532                        SyntaxKind::JsonValue,
533                    );
534                }
535                (SyntaxKind::JsonObject, 0usize) => {
536                    if let Some(parent) = element.pop() {
537                        state.add_element(parent);
538                    }
539                }
540                (SyntaxKind::JsonObject, 1usize) => {
541                    let (matched, fb) = state.expect_as_inline(element, SyntaxKind::CurlyClose);
542                    state.add_element(matched.pop_push(Rule {
543                        kind: self.kind,
544                        state: 0usize,
545                    }));
546                    if let Some(fb) = fb {
547                        state.add_element(fb.pop_push(Rule {
548                            kind: self.kind,
549                            state: 0usize,
550                        }));
551                    }
552                }
553                (SyntaxKind::JsonObject, 2usize) => {
554                    state.add_element(element.pop_push(Rule {
555                        kind: self.kind,
556                        state: 1usize,
557                    }));
558                    state.add_element(element.pop_push(Rule {
559                        kind: self.kind,
560                        state: 3usize,
561                    }));
562                }
563                (SyntaxKind::JsonObject, 3usize) => {
564                    state.add_element_checked(
565                        element
566                            .pop_push(Rule {
567                                kind: self.kind,
568                                state: 1usize,
569                            })
570                            .push(Rule {
571                                kind: SyntaxKind::MemberList,
572                                state: 4usize,
573                            }),
574                        SyntaxKind::MemberList,
575                    );
576                }
577                (SyntaxKind::JsonObject, 4usize) => {
578                    let (matched, fb) = state.expect_as_inline(element, SyntaxKind::CurlyOpen);
579                    state.add_element(matched.pop_push(Rule {
580                        kind: self.kind,
581                        state: 2usize,
582                    }));
583                    if let Some(fb) = fb {
584                        state.add_element(fb.pop_push(Rule {
585                            kind: self.kind,
586                            state: 2usize,
587                        }));
588                    }
589                }
590                (SyntaxKind::JsonArray, 0usize) => {
591                    if let Some(parent) = element.pop() {
592                        state.add_element(parent);
593                    }
594                }
595                (SyntaxKind::JsonArray, 1usize) => {
596                    let (matched, fb) = state.expect_as_inline(element, SyntaxKind::SqClose);
597                    state.add_element(matched.pop_push(Rule {
598                        kind: self.kind,
599                        state: 0usize,
600                    }));
601                    if let Some(fb) = fb {
602                        state.add_element(fb.pop_push(Rule {
603                            kind: self.kind,
604                            state: 0usize,
605                        }));
606                    }
607                }
608                (SyntaxKind::JsonArray, 2usize) => {
609                    state.add_element(element.pop_push(Rule {
610                        kind: self.kind,
611                        state: 1usize,
612                    }));
613                    state.add_element(element.pop_push(Rule {
614                        kind: self.kind,
615                        state: 3usize,
616                    }));
617                }
618                (SyntaxKind::JsonArray, 3usize) => {
619                    state.add_element_checked(
620                        element
621                            .pop_push(Rule {
622                                kind: self.kind,
623                                state: 1usize,
624                            })
625                            .push(Rule {
626                                kind: SyntaxKind::ValueList,
627                                state: 4usize,
628                            }),
629                        SyntaxKind::ValueList,
630                    );
631                }
632                (SyntaxKind::JsonArray, 4usize) => {
633                    let (matched, fb) = state.expect_as_inline(element, SyntaxKind::SqOpen);
634                    state.add_element(matched.pop_push(Rule {
635                        kind: self.kind,
636                        state: 2usize,
637                    }));
638                    if let Some(fb) = fb {
639                        state.add_element(fb.pop_push(Rule {
640                            kind: self.kind,
641                            state: 2usize,
642                        }));
643                    }
644                }
645                (SyntaxKind::MemberList, 0usize) => {
646                    if let Some(parent) = element.pop() {
647                        state.add_element(parent);
648                    }
649                }
650                (SyntaxKind::MemberList, 1usize) => {
651                    state.add_element(element.pop_push(Rule {
652                        kind: self.kind,
653                        state: 3usize,
654                    }));
655                    state.add_element(element.pop_push(Rule {
656                        kind: self.kind,
657                        state: 0usize,
658                    }));
659                }
660                (SyntaxKind::MemberList, 2usize) => {
661                    state.add_element_checked(
662                        element
663                            .pop_push(Rule {
664                                kind: self.kind,
665                                state: 1usize,
666                            })
667                            .push(Rule {
668                                kind: SyntaxKind::Member,
669                                state: 3usize,
670                            }),
671                        SyntaxKind::Member,
672                    );
673                }
674                (SyntaxKind::MemberList, 3usize) => {
675                    let (matched, fb) = state.expect_as_inline(element, SyntaxKind::Comma);
676                    state.add_element(matched.pop_push(Rule {
677                        kind: self.kind,
678                        state: 2usize,
679                    }));
680                    if let Some(fb) = fb {
681                        state.add_element(fb.pop_push(Rule {
682                            kind: self.kind,
683                            state: 2usize,
684                        }));
685                    }
686                }
687                (SyntaxKind::MemberList, 4usize) => {
688                    state.add_element(element.pop_push(Rule {
689                        kind: self.kind,
690                        state: 2usize,
691                    }));
692                }
693                (SyntaxKind::Member, 0usize) => {
694                    if let Some(parent) = element.pop() {
695                        state.add_element(parent);
696                    }
697                }
698                (SyntaxKind::Member, 1usize) => {
699                    state.add_element_checked(
700                        element
701                            .pop_push(Rule {
702                                kind: self.kind,
703                                state: 0usize,
704                            })
705                            .push(Rule {
706                                kind: SyntaxKind::JsonValue,
707                                state: 1usize,
708                            }),
709                        SyntaxKind::JsonValue,
710                    );
711                }
712                (SyntaxKind::Member, 2usize) => {
713                    let (matched, fb) = state.expect_as_inline(element, SyntaxKind::Colon);
714                    state.add_element(matched.pop_push(Rule {
715                        kind: self.kind,
716                        state: 1usize,
717                    }));
718                    if let Some(fb) = fb {
719                        state.add_element(fb.pop_push(Rule {
720                            kind: self.kind,
721                            state: 1usize,
722                        }));
723                    }
724                }
725                (SyntaxKind::Member, 3usize) => {
726                    state.add_element_checked(
727                        element
728                            .pop_push(Rule {
729                                kind: self.kind,
730                                state: 2usize,
731                            })
732                            .push(Rule {
733                                kind: SyntaxKind::JsonString,
734                                state: 1usize,
735                            }),
736                        SyntaxKind::JsonString,
737                    );
738                }
739                (SyntaxKind::JsonValue, 0usize) => {
740                    if let Some(parent) = element.pop() {
741                        state.add_element(parent);
742                    }
743                }
744                (SyntaxKind::JsonValue, 1usize) => {
745                    state.add_element(element.pop_push(Rule {
746                        kind: self.kind,
747                        state: 2usize,
748                    }));
749                    state.add_element(element.pop_push(Rule {
750                        kind: self.kind,
751                        state: 3usize,
752                    }));
753                    state.add_element(element.pop_push(Rule {
754                        kind: self.kind,
755                        state: 4usize,
756                    }));
757                    state.add_element_checked(
758                        element.pop_push(Rule {
759                            kind: self.kind,
760                            state: 5usize,
761                        }),
762                        SyntaxKind::JsonNumber,
763                    );
764                    state.add_element_checked(
765                        element.pop_push(Rule {
766                            kind: self.kind,
767                            state: 6usize,
768                        }),
769                        SyntaxKind::TrueLit,
770                    );
771                    state.add_element_checked(
772                        element.pop_push(Rule {
773                            kind: self.kind,
774                            state: 7usize,
775                        }),
776                        SyntaxKind::FalseLit,
777                    );
778                    state.add_element_checked(
779                        element.pop_push(Rule {
780                            kind: self.kind,
781                            state: 8usize,
782                        }),
783                        SyntaxKind::NullLit,
784                    );
785                }
786                (SyntaxKind::JsonValue, 2usize) => {
787                    state.add_element_checked(
788                        element
789                            .pop_push(Rule {
790                                kind: self.kind,
791                                state: 0usize,
792                            })
793                            .push(Rule {
794                                kind: SyntaxKind::JsonObject,
795                                state: 4usize,
796                            }),
797                        SyntaxKind::JsonObject,
798                    );
799                }
800                (SyntaxKind::JsonValue, 3usize) => {
801                    state.add_element_checked(
802                        element
803                            .pop_push(Rule {
804                                kind: self.kind,
805                                state: 0usize,
806                            })
807                            .push(Rule {
808                                kind: SyntaxKind::JsonArray,
809                                state: 4usize,
810                            }),
811                        SyntaxKind::JsonArray,
812                    );
813                }
814                (SyntaxKind::JsonValue, 4usize) => {
815                    state.add_element_checked(
816                        element
817                            .pop_push(Rule {
818                                kind: self.kind,
819                                state: 0usize,
820                            })
821                            .push(Rule {
822                                kind: SyntaxKind::JsonString,
823                                state: 1usize,
824                            }),
825                        SyntaxKind::JsonString,
826                    );
827                }
828                (SyntaxKind::JsonValue, 5usize) => {
829                    let (matched, fb) = state.expect_as_inline(element, SyntaxKind::JsonNumber);
830                    state.add_element(matched.pop_push(Rule {
831                        kind: self.kind,
832                        state: 0usize,
833                    }));
834                    if let Some(fb) = fb {
835                        state.add_element(fb.pop_push(Rule {
836                            kind: self.kind,
837                            state: 0usize,
838                        }));
839                    }
840                }
841                (SyntaxKind::JsonValue, 6usize) => {
842                    let (matched, fb) = state.expect_as_inline(element, SyntaxKind::TrueLit);
843                    state.add_element(matched.pop_push(Rule {
844                        kind: self.kind,
845                        state: 0usize,
846                    }));
847                    if let Some(fb) = fb {
848                        state.add_element(fb.pop_push(Rule {
849                            kind: self.kind,
850                            state: 0usize,
851                        }));
852                    }
853                }
854                (SyntaxKind::JsonValue, 7usize) => {
855                    let (matched, fb) = state.expect_as_inline(element, SyntaxKind::FalseLit);
856                    state.add_element(matched.pop_push(Rule {
857                        kind: self.kind,
858                        state: 0usize,
859                    }));
860                    if let Some(fb) = fb {
861                        state.add_element(fb.pop_push(Rule {
862                            kind: self.kind,
863                            state: 0usize,
864                        }));
865                    }
866                }
867                (SyntaxKind::JsonValue, 8usize) => {
868                    let (matched, fb) = state.expect_as_inline(element, SyntaxKind::NullLit);
869                    state.add_element(matched.pop_push(Rule {
870                        kind: self.kind,
871                        state: 0usize,
872                    }));
873                    if let Some(fb) = fb {
874                        state.add_element(fb.pop_push(Rule {
875                            kind: self.kind,
876                            state: 0usize,
877                        }));
878                    }
879                }
880                (SyntaxKind::ValueList, 0usize) => {
881                    if let Some(parent) = element.pop() {
882                        state.add_element(parent);
883                    }
884                }
885                (SyntaxKind::ValueList, 1usize) => {
886                    state.add_element(element.pop_push(Rule {
887                        kind: self.kind,
888                        state: 3usize,
889                    }));
890                    state.add_element(element.pop_push(Rule {
891                        kind: self.kind,
892                        state: 0usize,
893                    }));
894                }
895                (SyntaxKind::ValueList, 2usize) => {
896                    state.add_element_checked(
897                        element
898                            .pop_push(Rule {
899                                kind: self.kind,
900                                state: 1usize,
901                            })
902                            .push(Rule {
903                                kind: SyntaxKind::JsonValue,
904                                state: 1usize,
905                            }),
906                        SyntaxKind::JsonValue,
907                    );
908                }
909                (SyntaxKind::ValueList, 3usize) => {
910                    let (matched, fb) = state.expect_as_inline(element, SyntaxKind::Comma);
911                    state.add_element(matched.pop_push(Rule {
912                        kind: self.kind,
913                        state: 2usize,
914                    }));
915                    if let Some(fb) = fb {
916                        state.add_element(fb.pop_push(Rule {
917                            kind: self.kind,
918                            state: 2usize,
919                        }));
920                    }
921                }
922                (SyntaxKind::ValueList, 4usize) => {
923                    state.add_element(element.pop_push(Rule {
924                        kind: self.kind,
925                        state: 2usize,
926                    }));
927                }
928                (SyntaxKind::JsonString, 0usize) => {
929                    if let Some(parent) = element.pop() {
930                        state.add_element(parent);
931                    }
932                }
933                (SyntaxKind::JsonString, 1usize) => {
934                    let (matched, fb) = state.expect_as_inline(element, SyntaxKind::StringToken);
935                    state.add_element(matched.pop_push(Rule {
936                        kind: self.kind,
937                        state: 0usize,
938                    }));
939                    if let Some(fb) = fb {
940                        state.add_element(fb.pop_push(Rule {
941                            kind: self.kind,
942                            state: 0usize,
943                        }));
944                    }
945                }
946                (SyntaxKind::Comma, _) => {
947                    let added = state.expect_as(element, SyntaxKind::Comma);
948                    if let Some(parent) = added.pop() {
949                        state.add_element(parent);
950                    }
951                }
952                (SyntaxKind::Colon, _) => {
953                    let added = state.expect_as(element, SyntaxKind::Colon);
954                    if let Some(parent) = added.pop() {
955                        state.add_element(parent);
956                    }
957                }
958                (SyntaxKind::SqOpen, _) => {
959                    let added = state.expect_as(element, SyntaxKind::SqOpen);
960                    if let Some(parent) = added.pop() {
961                        state.add_element(parent);
962                    }
963                }
964                (SyntaxKind::SqClose, _) => {
965                    let added = state.expect_as(element, SyntaxKind::SqClose);
966                    if let Some(parent) = added.pop() {
967                        state.add_element(parent);
968                    }
969                }
970                (SyntaxKind::FalseLit, _) => {
971                    let added = state.expect_as(element, SyntaxKind::FalseLit);
972                    if let Some(parent) = added.pop() {
973                        state.add_element(parent);
974                    }
975                }
976                (SyntaxKind::NullLit, _) => {
977                    let added = state.expect_as(element, SyntaxKind::NullLit);
978                    if let Some(parent) = added.pop() {
979                        state.add_element(parent);
980                    }
981                }
982                (SyntaxKind::TrueLit, _) => {
983                    let added = state.expect_as(element, SyntaxKind::TrueLit);
984                    if let Some(parent) = added.pop() {
985                        state.add_element(parent);
986                    }
987                }
988                (SyntaxKind::CurlyOpen, _) => {
989                    let added = state.expect_as(element, SyntaxKind::CurlyOpen);
990                    if let Some(parent) = added.pop() {
991                        state.add_element(parent);
992                    }
993                }
994                (SyntaxKind::CurlyClose, _) => {
995                    let added = state.expect_as(element, SyntaxKind::CurlyClose);
996                    if let Some(parent) = added.pop() {
997                        state.add_element(parent);
998                    }
999                }
1000                (SyntaxKind::JsonNumber, _) => {
1001                    let added = state.expect_as(element, SyntaxKind::JsonNumber);
1002                    if let Some(parent) = added.pop() {
1003                        state.add_element(parent);
1004                    }
1005                }
1006                (SyntaxKind::StringToken, _) => {
1007                    let added = state.expect_as(element, SyntaxKind::StringToken);
1008                    if let Some(parent) = added.pop() {
1009                        state.add_element(parent);
1010                    }
1011                }
1012                _ => panic!("Aaaah unexpected state {:?}", self),
1013            }
1014        }
1015        fn at(&self) -> usize {
1016            self.state
1017        }
1018        fn element_kind(&self) -> SyntaxKind {
1019            self.kind
1020        }
1021        fn state_dist(&self, terminal: &SyntaxKind) -> isize {
1022            state_dist(self.kind, self.state, *terminal)
1023        }
1024    }
1025}
1026pub use definitions::*;
1027impl TokenTrait for SyntaxKind {
1028    const ERROR: Self = SyntaxKind::Error;
1029    const ROOT: Self = SyntaxKind::ROOT;
1030    fn branch(&self) -> u32 {
1031        *self as u32
1032    }
1033    fn skips(&self) -> bool {
1034        match self {
1035            SyntaxKind::WhiteSpace => true,
1036            SyntaxKind::Error => true,
1037            SyntaxKind::Comment => true,
1038            _ => false,
1039        }
1040    }
1041    fn starting_tokens(&self) -> &'static [SyntaxKind] {
1042        &[]
1043    }
1044    fn min_error_for_token(&self, tok: &SyntaxKind) -> isize {
1045        min_error_for_token(*self, *tok)
1046    }
1047    fn ending_tokens(&self) -> &'static [SyntaxKind] {
1048        &[]
1049    }
1050    fn max_error_value(&self) -> isize {
1051        match self {
1052            SyntaxKind::Comma => 2isize,
1053            SyntaxKind::Colon => 3isize,
1054            SyntaxKind::SqOpen => 4isize,
1055            SyntaxKind::SqClose => 4isize,
1056            SyntaxKind::CurlyOpen => 2isize,
1057            SyntaxKind::CurlyClose => 2isize,
1058            _ => 1isize,
1059        }
1060    }
1061    fn bracket_delta(&self) -> i8 {
1062        match self {
1063            SyntaxKind::CurlyOpen => 1,
1064            SyntaxKind::SqOpen => 1,
1065            SyntaxKind::CurlyClose => -1,
1066            SyntaxKind::SqClose => -1,
1067            _ => 0,
1068        }
1069    }
1070    fn min_completion_cost(&self) -> isize {
1071        match self {
1072            SyntaxKind::JsonArray => 8isize,
1073            SyntaxKind::JsonObject => 4isize,
1074            SyntaxKind::Member => 5isize,
1075            SyntaxKind::MemberList => 5isize,
1076            _ => Self::max_error_value(self),
1077        }
1078    }
1079    fn deletion_cost(&self) -> isize {
1080        match self {
1081            _ => Self::max_error_value(self) * 5,
1082        }
1083    }
1084}
1085pub mod format {
1086    use super::{SyntaxKind, SyntaxNode};
1087    use crate::format::Doc;
1088    use crate::TokenTrait;
1089    use rowan::NodeOrToken;
1090    #[derive(Default)]
1091    struct Hints {
1092        space: bool,
1093        line: bool,
1094        hardline: bool,
1095        blankline: bool,
1096        indent: bool,
1097        dedent: bool,
1098    }
1099    impl Hints {
1100        fn to_docs(&self) -> Vec<Doc> {
1101            let mut v = Vec::new();
1102            if self.indent {
1103                v.push(Doc::nil());
1104            }
1105            if self.dedent {
1106                v.push(Doc::nil());
1107            }
1108            if self.blankline {
1109                v.push(Doc::HardLine);
1110                v.push(Doc::HardLine);
1111            } else if self.hardline {
1112                v.push(Doc::HardLine);
1113            } else if self.line {
1114                v.push(Doc::Line);
1115            } else if self.space {
1116                v.push(Doc::text(" "));
1117            }
1118            v
1119        }
1120    }
1121    fn format_hints(parent: SyntaxKind, token: SyntaxKind) -> (Hints, Hints) {
1122        match (parent, token) {
1123            (_, SyntaxKind::CurlyOpen) => (
1124                Hints {
1125                    space: false,
1126                    line: false,
1127                    hardline: false,
1128                    blankline: false,
1129                    indent: false,
1130                    dedent: false,
1131                },
1132                Hints {
1133                    space: false,
1134                    line: true,
1135                    hardline: false,
1136                    blankline: false,
1137                    indent: true,
1138                    dedent: false,
1139                },
1140            ),
1141            (_, SyntaxKind::CurlyClose) => (
1142                Hints {
1143                    space: false,
1144                    line: true,
1145                    hardline: false,
1146                    blankline: false,
1147                    indent: false,
1148                    dedent: true,
1149                },
1150                Hints {
1151                    space: false,
1152                    line: false,
1153                    hardline: false,
1154                    blankline: false,
1155                    indent: false,
1156                    dedent: false,
1157                },
1158            ),
1159            (_, SyntaxKind::SqOpen) => (
1160                Hints {
1161                    space: false,
1162                    line: false,
1163                    hardline: false,
1164                    blankline: false,
1165                    indent: false,
1166                    dedent: false,
1167                },
1168                Hints {
1169                    space: false,
1170                    line: true,
1171                    hardline: false,
1172                    blankline: false,
1173                    indent: true,
1174                    dedent: false,
1175                },
1176            ),
1177            (_, SyntaxKind::SqClose) => (
1178                Hints {
1179                    space: false,
1180                    line: true,
1181                    hardline: false,
1182                    blankline: false,
1183                    indent: false,
1184                    dedent: true,
1185                },
1186                Hints {
1187                    space: false,
1188                    line: false,
1189                    hardline: false,
1190                    blankline: false,
1191                    indent: false,
1192                    dedent: false,
1193                },
1194            ),
1195            (_, SyntaxKind::Comma) => (
1196                Hints {
1197                    space: false,
1198                    line: false,
1199                    hardline: false,
1200                    blankline: false,
1201                    indent: false,
1202                    dedent: false,
1203                },
1204                Hints {
1205                    space: false,
1206                    line: true,
1207                    hardline: false,
1208                    blankline: false,
1209                    indent: false,
1210                    dedent: false,
1211                },
1212            ),
1213            (_, SyntaxKind::Colon) => (
1214                Hints {
1215                    space: false,
1216                    line: false,
1217                    hardline: false,
1218                    blankline: false,
1219                    indent: false,
1220                    dedent: false,
1221                },
1222                Hints {
1223                    space: true,
1224                    line: false,
1225                    hardline: false,
1226                    blankline: false,
1227                    indent: false,
1228                    dedent: false,
1229                },
1230            ),
1231            _ => (Hints::default(), Hints::default()),
1232        }
1233    }
1234    fn is_group(kind: SyntaxKind) -> bool {
1235        matches!(kind, SyntaxKind::JsonObject | SyntaxKind::JsonArray)
1236    }
1237    pub fn to_doc(node: &SyntaxNode) -> Doc {
1238        let mut parts: Vec<Vec<Doc>> = vec![vec![]];
1239        for child in node.children_with_tokens() {
1240            match child {
1241                NodeOrToken::Token(t) => {
1242                    if t.kind() == SyntaxKind::WhiteSpace {
1243                        continue;
1244                    }
1245                    if t.kind() == SyntaxKind::Comment {
1246                        parts
1247                            .last_mut()
1248                            .unwrap()
1249                            .push(Doc::text(t.text().to_string()));
1250                        continue;
1251                    }
1252                    let (before, after) = format_hints(node.kind(), t.kind());
1253                    if before.dedent && parts.len() > 1 {
1254                        let nested = parts.pop().unwrap_or_default();
1255                        let indent_doc = Doc::nest(2, Doc::concat(nested));
1256                        parts.last_mut().unwrap().push(indent_doc);
1257                    }
1258                    parts.last_mut().unwrap().extend(
1259                        before
1260                            .to_docs()
1261                            .into_iter()
1262                            .filter(|d| !matches!(d, Doc::Nil)),
1263                    );
1264                    parts
1265                        .last_mut()
1266                        .unwrap()
1267                        .push(Doc::text(t.text().to_string()));
1268                    let after_line: Vec<Doc> = after
1269                        .to_docs()
1270                        .into_iter()
1271                        .filter(|d| !matches!(d, Doc::Nil))
1272                        .collect();
1273                    if after.indent {
1274                        parts.push(after_line);
1275                    } else {
1276                        parts.last_mut().unwrap().extend(after_line);
1277                    }
1278                }
1279                NodeOrToken::Node(n) => {
1280                    if n.kind() == SyntaxKind::ERROR {
1281                        parts
1282                            .last_mut()
1283                            .unwrap()
1284                            .push(Doc::text(n.text().to_string()));
1285                        continue;
1286                    }
1287                    let is_terminal_wrapper = {
1288                        let mut it = n.children_with_tokens().filter(|c| match c {
1289                            NodeOrToken::Token(t) => t.kind() != SyntaxKind::WhiteSpace,
1290                            NodeOrToken::Node(_) => true,
1291                        });
1292                        matches!(it.next(), Some(NodeOrToken::Token(_))) && it.next().is_none()
1293                    };
1294                    if is_terminal_wrapper {
1295                        let token_text = n.text().to_string();
1296                        let (before, after) = format_hints(node.kind(), n.kind());
1297                        if before.dedent && parts.len() > 1 {
1298                            let nested = parts.pop().unwrap_or_default();
1299                            let indent_doc = Doc::nest(2, Doc::concat(nested));
1300                            parts.last_mut().unwrap().push(indent_doc);
1301                        }
1302                        parts.last_mut().unwrap().extend(
1303                            before
1304                                .to_docs()
1305                                .into_iter()
1306                                .filter(|d| !matches!(d, Doc::Nil)),
1307                        );
1308                        parts.last_mut().unwrap().push(Doc::text(token_text));
1309                        let after_line: Vec<Doc> = after
1310                            .to_docs()
1311                            .into_iter()
1312                            .filter(|d| !matches!(d, Doc::Nil))
1313                            .collect();
1314                        if after.indent {
1315                            parts.push(after_line);
1316                        } else {
1317                            parts.last_mut().unwrap().extend(after_line);
1318                        }
1319                    } else {
1320                        let (before, after) = format_hints(node.kind(), n.kind());
1321                        if before.dedent && parts.len() > 1 {
1322                            let nested = parts.pop().unwrap_or_default();
1323                            let indent_doc = Doc::nest(2, Doc::concat(nested));
1324                            parts.last_mut().unwrap().push(indent_doc);
1325                        }
1326                        parts.last_mut().unwrap().extend(
1327                            before
1328                                .to_docs()
1329                                .into_iter()
1330                                .filter(|d| !matches!(d, Doc::Nil)),
1331                        );
1332                        let child_doc = to_doc(&n);
1333                        let child_doc = if is_group(n.kind()) {
1334                            Doc::group(child_doc)
1335                        } else {
1336                            child_doc
1337                        };
1338                        parts.last_mut().unwrap().push(child_doc);
1339                        let after_line: Vec<Doc> = after
1340                            .to_docs()
1341                            .into_iter()
1342                            .filter(|d| !matches!(d, Doc::Nil))
1343                            .collect();
1344                        if after.indent {
1345                            parts.push(after_line);
1346                        } else {
1347                            parts.last_mut().unwrap().extend(after_line);
1348                        }
1349                    }
1350                }
1351            }
1352        }
1353        while parts.len() > 1 {
1354            let nested = parts.pop().unwrap();
1355            parts
1356                .last_mut()
1357                .unwrap()
1358                .push(Doc::nest(2, Doc::concat(nested)));
1359        }
1360        Doc::concat(parts.pop().unwrap_or_default())
1361    }
1362    pub fn format(node: &SyntaxNode, width: usize) -> String {
1363        let doc = to_doc(node);
1364        let s = crate::format::render(&doc, width);
1365        let s = s.trim_start_matches('\n').trim_end_matches('\n');
1366        format!("{s}\n")
1367    }
1368}