123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- //! pretty printer for rsx!
- use std::fmt::{Result, Write};
- use proc_macro2::Span;
- use crate::{collect_macros::byte_offset, Writer};
- impl Writer<'_> {
- pub fn write_raw_expr(&mut self, placement: Span) -> Result {
- /*
- We want to normalize the expr to the appropriate indent level.
- */
- let start = placement.start();
- let end = placement.end();
- // if the expr is on one line, just write it directly
- if start.line == end.line {
- // split counting utf8 chars
- let start = byte_offset(self.raw_src, start);
- let end = byte_offset(self.raw_src, end);
- let row = self.raw_src[start..end].trim();
- write!(self.out, "{row}")?;
- 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.out, "{}", &first_line[start.column - 1..].trim_start())?;
- let prev_block_indent_level = self.out.indent.count_indents(first_line);
- for (id, line) in self.src[start.line..end.line].iter().enumerate() {
- writeln!(self.out)?;
- // check if this is the last line
- let line = {
- if id == (end.line - start.line) - 1 {
- &line[..end.column]
- } else {
- line
- }
- };
- // trim the leading whitespace
- let previous_indent = self.out.indent.count_indents(line);
- let offset = previous_indent.saturating_sub(prev_block_indent_level);
- let required_indent = self.out.indent_level + offset;
- self.out.write_tabs(required_indent)?;
- let line = line.trim_start();
- write!(self.out, "{line}")?;
- }
- Ok(())
- }
- }
|