Merge pull request #70 from DaveMcEwan/traitDebug

Implement the std::fmt::Debug trait.
This commit is contained in:
dalance 2022-11-09 16:11:21 +09:00 committed by GitHub
commit f6fd124601
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -114,6 +114,63 @@ impl fmt::Display for SyntaxTree {
} }
} }
impl fmt::Debug for SyntaxTree {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
enum WS {
NotWhitespace,
Newline,
Space,
Comment,
CompilerDirective,
}
let mut ws: WS = WS::NotWhitespace;
let mut depth = 0;
let mut ret = String::from("");
for node in self.into_iter().event() {
match node {
NodeEvent::Enter(RefNode::Locate(locate)) => {
let (pre, t, post) = match ws {
WS::Newline => ("<<<<<", "NewlineToken", ">>>>>"),
WS::Space => ("<<<<<", "SpaceToken", ">>>>>"),
WS::Comment => ("<<<<<", "CommentToken", ">>>>>"),
_ => ("", "Token", ""),
};
ret.push_str(&format!(
"{}{} @line:{}: {}{}{}\n",
" ".repeat(depth),
t,
locate.line,
pre,
self.get_str(locate).unwrap(),
post,
));
depth += 1;
}
NodeEvent::Enter(x) => {
match x {
RefNode::WhiteSpace(WhiteSpace::Newline(_)) => { ws = WS::Newline; }
RefNode::WhiteSpace(WhiteSpace::Space(_)) => { ws = WS::Space; }
RefNode::WhiteSpace(WhiteSpace::Comment(_)) => { ws = WS::Comment; }
RefNode::WhiteSpace(WhiteSpace::CompilerDirective(_)) => { ws = WS::CompilerDirective; }
_ => {}
}
ret.push_str(&format!("{}{}\n", " ".repeat(depth), x));
depth += 1;
}
NodeEvent::Leave(x) => {
match x {
RefNode::WhiteSpace(_) => {}
_ => { ws = WS::NotWhitespace; }
}
depth -= 1;
}
}
}
write!(f, "{}", ret)
}
}
impl<'a> IntoIterator for &'a SyntaxTree { impl<'a> IntoIterator for &'a SyntaxTree {
type Item = RefNode<'a>; type Item = RefNode<'a>;
type IntoIter = Iter<'a>; type IntoIter = Iter<'a>;