127 lines
4.0 KiB
Rust
127 lines
4.0 KiB
Rust
//! pretty printer for rsx!
|
|
use std::fmt::{Result, Write};
|
|
|
|
use crate::Buffer;
|
|
|
|
impl Buffer {
|
|
pub fn write_raw_expr(&mut self, exp: &syn::Expr) -> Result {
|
|
/*
|
|
We want to normalize the expr to the appropriate indent level.
|
|
*/
|
|
|
|
// in a perfect world, just fire up the rust pretty printer
|
|
// pretty_print_rust_code_as_if_it_were_rustfmt()
|
|
|
|
use syn::spanned::Spanned;
|
|
let placement = exp.span();
|
|
let start = placement.start();
|
|
let end = placement.end();
|
|
// let num_spaces_desired = (self.indent * 4) as isize;
|
|
|
|
// print comments
|
|
// let mut queued_comments = vec![];
|
|
// let mut offset = 2;
|
|
// loop {
|
|
// let line = &self.src[start.line - offset];
|
|
// if line.trim_start().starts_with("//") {
|
|
// queued_comments.push(line);
|
|
// } else {
|
|
// break;
|
|
// }
|
|
|
|
// offset += 1;
|
|
// }
|
|
// let had_comments = !queued_comments.is_empty();
|
|
// for comment in queued_comments.into_iter().rev() {
|
|
// writeln!(self.buf, "{}", comment)?;
|
|
// }
|
|
|
|
// if the expr is on one line, just write it directly
|
|
if start.line == end.line {
|
|
write!(
|
|
self.buf,
|
|
"{}",
|
|
&self.src[start.line - 1][start.column - 1..end.column].trim()
|
|
)?;
|
|
return Ok(());
|
|
}
|
|
|
|
// If the expr is multiline, we want to collect all of its lines together and write them out properly
|
|
// This involves unshifting the first line if it's aligned
|
|
let first_line = &self.src[start.line - 1];
|
|
write!(
|
|
self.buf,
|
|
"{}",
|
|
&first_line[start.column - 1..first_line.len()].trim()
|
|
)?;
|
|
|
|
let first_prefix = &self.src[start.line - 1][..start.column];
|
|
let offset = match first_prefix.trim() {
|
|
"" => 0,
|
|
_ => first_prefix
|
|
.chars()
|
|
.rev()
|
|
.take_while(|c| c.is_whitespace())
|
|
.count() as isize,
|
|
};
|
|
|
|
for (id, line) in self.src[start.line..end.line].iter().enumerate() {
|
|
writeln!(self.buf)?;
|
|
// trim the leading whitespace
|
|
let line = match id {
|
|
x if x == (end.line - start.line) - 1 => &line[..end.column],
|
|
_ => line,
|
|
};
|
|
|
|
if offset < 0 {
|
|
for _ in 0..-offset {
|
|
write!(self.buf, " ")?;
|
|
}
|
|
|
|
write!(self.buf, "{}", line)?;
|
|
} else {
|
|
let offset = offset as usize;
|
|
let right = &line[offset..];
|
|
write!(self.buf, "{}", right)?;
|
|
}
|
|
}
|
|
|
|
// let first = &self.src[start.line - 1];
|
|
// let num_spaces_real = first.chars().take_while(|c| c.is_whitespace()).count() as isize;
|
|
// let offset = num_spaces_real - num_spaces_desired;
|
|
|
|
// for (row, line) in self.src[start.line - 1..end.line].iter().enumerate() {
|
|
// let line = match row {
|
|
// 0 => &line[start.column - 1..],
|
|
// a if a == (end.line - start.line) => &line[..end.column - 1],
|
|
// _ => line,
|
|
// };
|
|
|
|
// writeln!(self.buf)?;
|
|
// // trim the leading whitespace
|
|
// if offset < 0 {
|
|
// for _ in 0..-offset {
|
|
// write!(self.buf, " ")?;
|
|
// }
|
|
|
|
// write!(self.buf, "{}", line)?;
|
|
// } else {
|
|
// let offset = offset as usize;
|
|
// let right = &line[offset..];
|
|
// write!(self.buf, "{}", right)?;
|
|
// }
|
|
// }
|
|
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
// :(
|
|
// fn pretty_print_rust_code_as_if_it_were_rustfmt(code: &str) -> String {
|
|
// let formatted = prettyplease::unparse_expr(exp);
|
|
// for line in formatted.lines() {
|
|
// write!(self.buf, "{}", line)?;
|
|
// self.new_line()?;
|
|
// }
|
|
// }
|