use crate::syntax::ast::node::Node;
use boa_interner::{Interner, Sym, ToInternedString};
#[cfg(feature = "deser")]
use serde::{Deserialize, Serialize};
#[cfg_attr(feature = "deser", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq)]
pub struct DoWhileLoop {
body: Box<Node>,
cond: Box<Node>,
label: Option<Sym>,
}
impl DoWhileLoop {
pub fn body(&self) -> &Node {
&self.body
}
pub fn cond(&self) -> &Node {
&self.cond
}
pub fn label(&self) -> Option<Sym> {
self.label
}
pub fn set_label(&mut self, label: Sym) {
self.label = Some(label);
}
pub fn new<B, C>(body: B, condition: C) -> Self
where
B: Into<Node>,
C: Into<Node>,
{
Self {
body: Box::new(body.into()),
cond: Box::new(condition.into()),
label: None,
}
}
pub(in crate::syntax::ast::node) fn to_indented_string(
&self,
interner: &Interner,
indentation: usize,
) -> String {
let mut buf = if let Some(label) = self.label {
format!("{}: ", interner.resolve_expect(label))
} else {
String::new()
};
buf.push_str(&format!(
"do {} while ({})",
self.body().to_indented_string(interner, indentation),
self.cond().to_interned_string(interner)
));
buf
}
}
impl ToInternedString for DoWhileLoop {
fn to_interned_string(&self, interner: &Interner) -> String {
self.to_indented_string(interner, 0)
}
}
impl From<DoWhileLoop> for Node {
fn from(do_while: DoWhileLoop) -> Self {
Self::DoWhileLoop(do_while)
}
}