mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
69 lines
1.6 KiB
Rust
69 lines
1.6 KiB
Rust
use oxc_diagnostics::Result;
|
|
|
|
use crate::{lexer::Kind, Parser};
|
|
|
|
pub trait NormalList<'a> {
|
|
/// Open element, e.g.. `{` `[` `(`
|
|
fn open(&self) -> Kind;
|
|
|
|
/// Close element, e.g.. `}` `]` `)`
|
|
fn close(&self) -> Kind;
|
|
|
|
fn parse_element(&mut self, p: &mut Parser<'a>) -> Result<()>;
|
|
|
|
/// Main entry point, parse the list
|
|
fn parse(&mut self, p: &mut Parser<'a>) -> Result<()> {
|
|
p.expect(self.open())?;
|
|
while !p.at(self.close()) && !p.at(Kind::Eof) {
|
|
self.parse_element(p)?;
|
|
}
|
|
p.expect(self.close())?;
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
pub trait SeparatedList<'a>: Sized {
|
|
fn new(p: &Parser<'a>) -> Self;
|
|
|
|
fn parse(p: &mut Parser<'a>) -> Result<Self> {
|
|
let mut list = Self::new(p);
|
|
list.parse_list(p)?;
|
|
Ok(list)
|
|
}
|
|
|
|
/// Open element, e.g.. `{` `[` `(`
|
|
fn open(&self) -> Kind;
|
|
|
|
/// Close element, e.g.. `}` `]` `)`
|
|
fn close(&self) -> Kind;
|
|
|
|
/// Separator element, e.g. `,`
|
|
fn separator(&self) -> Kind {
|
|
Kind::Comma
|
|
}
|
|
|
|
fn parse_element(&mut self, p: &mut Parser<'a>) -> Result<()>;
|
|
|
|
/// Main entry point, parse the list
|
|
fn parse_list(&mut self, p: &mut Parser<'a>) -> Result<()> {
|
|
p.expect(self.open())?;
|
|
|
|
let mut first = true;
|
|
|
|
while !p.at(self.close()) && !p.at(Kind::Eof) {
|
|
if first {
|
|
first = false;
|
|
} else {
|
|
p.expect(self.separator())?;
|
|
if p.at(self.close()) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
self.parse_element(p)?;
|
|
}
|
|
|
|
p.expect(self.close())?;
|
|
Ok(())
|
|
}
|
|
}
|