Files
@ 135965141596
Branch filter:
Location: CSY/reowolf/src/protocol/token_writer.rs - annotation
135965141596
3.1 KiB
application/rls-services+xml
Factor out common component shutdown handling
fc85ab427e9c fc85ab427e9c 2693293dc537 fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c 2693293dc537 fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c 2693293dc537 2693293dc537 fc85ab427e9c fc85ab427e9c 2693293dc537 fc85ab427e9c 2693293dc537 fc85ab427e9c 2693293dc537 2693293dc537 2693293dc537 2693293dc537 fc85ab427e9c fc85ab427e9c 2693293dc537 2693293dc537 2693293dc537 2693293dc537 fc85ab427e9c fc85ab427e9c 2693293dc537 fc85ab427e9c 2693293dc537 fc85ab427e9c 2693293dc537 fc85ab427e9c 2693293dc537 fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c 2693293dc537 fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c 2693293dc537 fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c 2693293dc537 2693293dc537 2693293dc537 fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c fc85ab427e9c | #![allow(dead_code)]
use std::fmt::{Write, Error as FmtError};
use std::io::Write as IOWrite;
use crate::protocol::input_source::{InputSource, InputSpan};
use crate::protocol::parser::Module;
use crate::protocol::tokens::{Token, TokenKind, TokenMarker};
pub(crate) struct TokenWriter {
buffer: String,
}
impl TokenWriter {
pub(crate) fn new() -> Self {
return Self{
buffer: String::with_capacity(4096),
}
}
pub(crate) fn write<W: IOWrite>(&mut self, w: &mut W, modules: &[Module]) {
self.buffer.clear();
for module in modules {
self.write_module_tokens(module);
}
w.write_all(self.buffer.as_bytes()).expect("write tokens");
}
fn write_module_tokens(&mut self, module: &Module) {
self.write_dashed_indent(0);
match &module.name {
Some(name) => writeln!(self.buffer, "Module: {}", name.1.as_str()).unwrap(),
None => self.buffer.push_str("Unnamed module\n"),
}
self.write_marker_array(&module.tokens.markers, 1).expect("write markers");
self.write_token_array(&module.source, &module.tokens.tokens, 1).expect("write tokens");
}
fn write_marker_array(&mut self, markers: &[TokenMarker], indent: u32) -> Result<(), FmtError> {
self.write_indent(indent);
writeln!(self.buffer, "Markers: [")?;
let marker_indent = indent + 1;
for marker in markers {
self.write_indent(marker_indent);
writeln!(self.buffer, "{:?}", marker)?;
}
self.write_indent(indent);
writeln!(self.buffer, "]")?;
return Ok(());
}
fn write_token_array(&mut self, source: &InputSource, tokens: &[Token], indent: u32) -> Result<(), FmtError> {
self.write_indent(indent);
writeln!(self.buffer, "Tokens: [")?;
let num_tokens = tokens.len();
let token_indent = indent + 1;
for token_index in 0..num_tokens {
// Skip uninteresting tokens
let token = &tokens[token_index];
if token.kind == TokenKind::SpanEnd {
continue;
}
self.write_indent(token_indent);
write!(self.buffer, "{:?} (index {})", token.kind, token_index)?;
if token.kind.has_span_end() {
let token_start = token.pos;
let token_end = tokens[token_index + 1].pos;
let section = source.section_at_span(InputSpan::from_positions(token_start, token_end));
writeln!(self.buffer, " text: {}", String::from_utf8_lossy(section))?;
} else {
self.buffer.push('\n');
}
}
self.write_indent(indent);
writeln!(self.buffer, "]")?;
return Ok(());
}
fn write_dashed_indent(&mut self, indent: u32) {
for _ in 0..indent * 2 {
self.buffer.push(' ');
}
self.buffer.push('-');
self.buffer.push(' ');
}
fn write_indent(&mut self, indent: u32) {
for _ in 0..(indent + 1)*2 {
self.buffer.push(' ');
}
}
}
|