mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 06:44:46 +00:00
93 lines
2.1 KiB
Rust
93 lines
2.1 KiB
Rust
#![warn(clippy::dbg_macro)]
|
|
// See github.com/rtfeldman/roc/issues/800 for discussion of the large_enum_variant check.
|
|
#![allow(clippy::large_enum_variant)]
|
|
pub mod annotation;
|
|
pub mod collection;
|
|
pub mod def;
|
|
pub mod expr;
|
|
pub mod module;
|
|
pub mod pattern;
|
|
pub mod spaces;
|
|
|
|
use bumpalo::{collections::String, Bump};
|
|
|
|
pub struct Buf<'a> {
|
|
text: String<'a>,
|
|
spaces_to_flush: usize,
|
|
beginning_of_line: bool,
|
|
}
|
|
|
|
impl<'a> Buf<'a> {
|
|
pub fn new_in(arena: &'a Bump) -> Buf<'a> {
|
|
Buf {
|
|
text: String::new_in(arena),
|
|
spaces_to_flush: 0,
|
|
beginning_of_line: true,
|
|
}
|
|
}
|
|
|
|
pub fn as_str(&'a self) -> &'a str {
|
|
self.text.as_str()
|
|
}
|
|
|
|
pub fn into_bump_str(self) -> &'a str {
|
|
self.text.into_bump_str()
|
|
}
|
|
|
|
pub fn indent(&mut self, indent: u16) {
|
|
if self.beginning_of_line {
|
|
for _ in 0..indent {
|
|
self.text.push(' ');
|
|
}
|
|
}
|
|
self.beginning_of_line = false;
|
|
}
|
|
|
|
pub fn push(&mut self, ch: char) {
|
|
debug_assert!(!self.beginning_of_line);
|
|
debug_assert!(ch != '\n' && ch != ' ');
|
|
|
|
self.flush_spaces();
|
|
|
|
self.text.push(ch);
|
|
}
|
|
|
|
pub fn push_str_allow_spaces(&mut self, s: &str) {
|
|
debug_assert!(!self.beginning_of_line);
|
|
debug_assert!(!s.contains('\n'));
|
|
|
|
self.flush_spaces();
|
|
|
|
self.text.push_str(s);
|
|
}
|
|
|
|
pub fn push_str(&mut self, s: &str) {
|
|
debug_assert!(!self.beginning_of_line);
|
|
debug_assert!(!s.contains('\n') && !s.ends_with(' '));
|
|
|
|
if !s.is_empty() {
|
|
self.flush_spaces();
|
|
}
|
|
|
|
self.text.push_str(s);
|
|
}
|
|
|
|
pub fn spaces(&mut self, count: usize) {
|
|
self.spaces_to_flush += count;
|
|
}
|
|
|
|
pub fn newline(&mut self) {
|
|
self.spaces_to_flush = 0;
|
|
self.text.push('\n');
|
|
self.beginning_of_line = true;
|
|
}
|
|
|
|
fn flush_spaces(&mut self) {
|
|
if self.spaces_to_flush > 0 {
|
|
for _ in 0..self.spaces_to_flush {
|
|
self.text.push(' ');
|
|
}
|
|
self.spaces_to_flush = 0;
|
|
}
|
|
}
|
|
}
|