1
0

expr.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. //! pretty printer for rsx!
  2. use std::fmt::{Result, Write};
  3. use proc_macro2::Span;
  4. use crate::{collect_macros::byte_offset, Writer};
  5. impl Writer<'_> {
  6. pub fn write_raw_expr(&mut self, placement: Span) -> Result {
  7. /*
  8. We want to normalize the expr to the appropriate indent level.
  9. */
  10. let start = placement.start();
  11. let end = placement.end();
  12. // if the expr is on one line, just write it directly
  13. if start.line == end.line {
  14. // split counting utf8 chars
  15. let start = byte_offset(self.raw_src, start);
  16. let end = byte_offset(self.raw_src, end);
  17. let row = self.raw_src[start..end].trim();
  18. write!(self.out, "{row}")?;
  19. return Ok(());
  20. }
  21. // If the expr is multiline, we want to collect all of its lines together and write them out properly
  22. // This involves unshifting the first line if it's aligned
  23. let first_line = &self.src[start.line - 1];
  24. write!(self.out, "{}", &first_line[start.column - 1..].trim_start())?;
  25. let prev_block_indent_level = self.out.indent.count_indents(first_line);
  26. for (id, line) in self.src[start.line..end.line].iter().enumerate() {
  27. writeln!(self.out)?;
  28. // check if this is the last line
  29. let line = {
  30. if id == (end.line - start.line) - 1 {
  31. &line[..end.column]
  32. } else {
  33. line
  34. }
  35. };
  36. // trim the leading whitespace
  37. let previous_indent = self.out.indent.count_indents(line);
  38. let offset = previous_indent.saturating_sub(prev_block_indent_level);
  39. let required_indent = self.out.indent_level + offset;
  40. self.out.write_tabs(required_indent)?;
  41. let line = line.trim_start();
  42. write!(self.out, "{line}")?;
  43. }
  44. Ok(())
  45. }
  46. }