stmt.rs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. use super::algorithm::Printer;
  2. use syn::{Expr, Stmt};
  3. impl Printer {
  4. pub fn stmt(&mut self, stmt: &Stmt) {
  5. match stmt {
  6. Stmt::Local(local) => {
  7. self.outer_attrs(&local.attrs);
  8. self.ibox(0);
  9. self.word("let ");
  10. self.pat(&local.pat);
  11. if let Some((_eq, init)) = &local.init {
  12. self.word(" = ");
  13. self.neverbreak();
  14. self.expr(init);
  15. }
  16. self.word(";");
  17. self.end();
  18. self.hardbreak();
  19. }
  20. Stmt::Item(item) => self.item(item),
  21. Stmt::Expr(expr) => {
  22. if break_after(expr) {
  23. self.ibox(0);
  24. self.expr_beginning_of_line(expr, true);
  25. if add_semi(expr) {
  26. self.word(";");
  27. }
  28. self.end();
  29. self.hardbreak();
  30. } else {
  31. self.expr_beginning_of_line(expr, true);
  32. }
  33. }
  34. Stmt::Semi(expr, _semi) => {
  35. if let Expr::Verbatim(tokens) = expr {
  36. if tokens.is_empty() {
  37. return;
  38. }
  39. }
  40. self.ibox(0);
  41. self.expr_beginning_of_line(expr, true);
  42. if !remove_semi(expr) {
  43. self.word(";");
  44. }
  45. self.end();
  46. self.hardbreak();
  47. }
  48. }
  49. }
  50. }
  51. pub fn add_semi(expr: &Expr) -> bool {
  52. match expr {
  53. Expr::Assign(_)
  54. | Expr::AssignOp(_)
  55. | Expr::Break(_)
  56. | Expr::Continue(_)
  57. | Expr::Return(_)
  58. | Expr::Yield(_) => true,
  59. Expr::Group(group) => add_semi(&group.expr),
  60. _ => false,
  61. }
  62. }
  63. pub fn break_after(expr: &Expr) -> bool {
  64. if let Expr::Group(group) = expr {
  65. if let Expr::Verbatim(verbatim) = group.expr.as_ref() {
  66. return !verbatim.is_empty();
  67. }
  68. }
  69. true
  70. }
  71. fn remove_semi(expr: &Expr) -> bool {
  72. match expr {
  73. Expr::ForLoop(_) | Expr::While(_) => true,
  74. Expr::Group(group) => remove_semi(&group.expr),
  75. Expr::If(expr) => match &expr.else_branch {
  76. Some((_else_token, else_branch)) => remove_semi(else_branch),
  77. None => true,
  78. },
  79. _ => false,
  80. }
  81. }