diff --git a/Cargo.lock b/Cargo.lock index a32bc17f..a026a4d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -821,7 +821,6 @@ name = "wasm-hbfmt" version = "0.1.0" dependencies = [ "hblang", - "log", ] [[package]] diff --git a/depell/src/index.css b/depell/src/index.css index e787b96b..80bcc1e5 100644 --- a/depell/src/index.css +++ b/depell/src/index.css @@ -45,6 +45,8 @@ div.preview { display: flex; gap: var(--small-gap); } + + margin: var(--small-gap) 0px; } form { @@ -63,16 +65,22 @@ form { } -pre, textarea { outline: none; border: none; background: var(--secondary); padding: var(--small-gap); padding-top: calc(var(--small-gap) * 1.5); - margin: var(--small-gap) 0px; font-family: var(--monospace); resize: none; +} + +pre { + background: var(--secondary); + padding: var(--small-gap); + padding-top: calc(var(--small-gap) * 1.5); + margin: 0px; + font-family: var(--monospace); tab-size: 4; } diff --git a/depell/src/main.rs b/depell/src/main.rs index 3bba97d8..b26adef7 100644 --- a/depell/src/main.rs +++ b/depell/src/main.rs @@ -131,8 +131,6 @@ impl Page for Post { required maxlength=MAX_POSTNAME_LENGTH> - !{include_str!("post-page.html")} } diff --git a/depell/wasm-hbfmt/Cargo.toml b/depell/wasm-hbfmt/Cargo.toml index 475cc3f7..558e7b05 100644 --- a/depell/wasm-hbfmt/Cargo.toml +++ b/depell/wasm-hbfmt/Cargo.toml @@ -7,5 +7,4 @@ edition = "2021" crate-type = ["cdylib"] [dependencies] -hblang = { version = "0.1.0", path = "../../hblang", default-features = false } -log = { version = "0.4.22", features = ["max_level_off"] } +hblang = { version = "0.1.0", path = "../../hblang", default-features = false, features = ["no_log"] } diff --git a/hblang/Cargo.toml b/hblang/Cargo.toml index 3b18338e..c3773d21 100644 --- a/hblang/Cargo.toml +++ b/hblang/Cargo.toml @@ -22,3 +22,4 @@ optional = true default = ["std", "opts"] std = [] opts = ["regalloc2"] +no_log = ["log/max_level_off"] diff --git a/hblang/src/fmt.rs b/hblang/src/fmt.rs index 446de98a..e29dc142 100644 --- a/hblang/src/fmt.rs +++ b/hblang/src/fmt.rs @@ -73,6 +73,7 @@ pub struct Formatter<'a> { depth: usize, } +// we exclusively use `write_str` to reduce bloat impl<'a> Formatter<'a> { pub fn new(source: &'a str) -> Self { Self { source, depth: 0 } @@ -106,11 +107,12 @@ impl<'a> Formatter<'a> { let mut first = true; for expr in list { if !core::mem::take(&mut first) { - write!(f, "{sep} ")?; + f.write_str(sep)?; + f.write_str(" ")?; } first = !fmt(self, expr, f)?; } - return write!(f, "{end}"); + return f.write_str(end); } writeln!(f)?; @@ -118,24 +120,24 @@ impl<'a> Formatter<'a> { let res = (|| { for (i, stmt) in list.iter().enumerate() { for _ in 0..self.depth { - write!(f, "\t")?; + f.write_str("\t")?; } let add_sep = fmt(self, stmt, f)?; if add_sep { - write!(f, "{sep}")?; + f.write_str(sep)?; } if let Some(expr) = list.get(i + 1) && let Some(rest) = self.source.get(expr.posi() as usize..) { if insert_needed_semicolon(rest) { - write!(f, ";")?; + f.write_str(";")?; } if preserve_newlines(&self.source[..expr.posi() as usize]) > 1 { - writeln!(f)?; + f.write_str("\n")?; } } if add_sep { - writeln!(f)?; + f.write_str("\n")?; } } Ok(()) @@ -143,9 +145,9 @@ impl<'a> Formatter<'a> { self.depth -= 1; for _ in 0..self.depth { - write!(f, "\t")?; + f.write_str("\t")?; } - write!(f, "{end}")?; + f.write_str(end)?; res } @@ -156,9 +158,9 @@ impl<'a> Formatter<'a> { cond: impl FnOnce(&Expr) -> bool, ) -> fmt::Result { if cond(expr) { - write!(f, "(")?; + f.write_str("(")?; self.fmt(expr, f)?; - write!(f, ")") + f.write_str(")") } else { self.fmt(expr, f) } @@ -181,33 +183,40 @@ impl<'a> Formatter<'a> { match *expr { Expr::Ct { value, .. } => { - write!(f, "$: ")?; + f.write_str("$: ")?; self.fmt(value, f) } - Expr::String { literal, .. } => write!(f, "{literal}"), - Expr::Comment { literal, .. } => write!(f, "{literal}"), + Expr::String { literal, .. } => f.write_str(literal), + Expr::Comment { literal, .. } => f.write_str(literal), Expr::Mod { path, .. } => write!(f, "@use(\"{path}\")"), Expr::Field { target, name: field, .. } => { self.fmt_paren(target, f, postfix)?; - write!(f, ".{field}") + f.write_str(".")?; + f.write_str(field) } Expr::Directive { name, args, .. } => { - write!(f, "@{name}(")?; + f.write_str("@")?; + f.write_str(name)?; + f.write_str("(")?; self.fmt_list(f, false, ")", ",", args, Self::fmt) } Expr::Struct { fields, trailing_comma, packed, .. } => { if packed { - write!(f, "packed ")?; + f.write_str("packed ")?; } write!(f, "struct {{")?; self.fmt_list_low(f, trailing_comma, "}", ",", fields, |s, field, f| { match field { CommentOr::Or(StructField { name, ty, .. }) => { - write!(f, "{name}: ")?; + f.write_str(name)?; + f.write_str(": ")?; s.fmt(ty, f)? } - CommentOr::Comment { literal, .. } => writeln!(f, "{literal}")?, + CommentOr::Comment { literal, .. } => { + f.write_str(literal)?; + f.write_str("\n")?; + } } Ok(field.or().is_some()) }) @@ -216,7 +225,7 @@ impl<'a> Formatter<'a> { if let Some(ty) = ty { self.fmt_paren(ty, f, unary)?; } - write!(f, ".{{")?; + f.write_str(".{")?; self.fmt_list( f, trailing_comma, @@ -224,12 +233,12 @@ impl<'a> Formatter<'a> { ",", fields, |s: &mut Self, CtorField { name, value, .. }: &_, f| { - if matches!(value, Expr::Ident { name: n, .. } if name == n) { - write!(f, "{name}") - } else { - write!(f, "{name}: ")?; - s.fmt(value, f) + f.write_str(name)?; + if !matches!(value, Expr::Ident { name: n, .. } if name == n) { + f.write_str(": ")?; + s.fmt(value, f)?; } + Ok(()) }, ) } @@ -237,74 +246,78 @@ impl<'a> Formatter<'a> { if let Some(ty) = ty { self.fmt_paren(ty, f, unary)?; } - write!(f, ".(")?; + f.write_str(".(")?; self.fmt_list(f, trailing_comma, ")", ",", fields, Self::fmt) } Expr::Slice { item, size, .. } => { - write!(f, "[")?; + f.write_str("[")?; self.fmt(item, f)?; if let Some(size) = size { - write!(f, "; ")?; + f.write_str("; ")?; self.fmt(size, f)?; } - write!(f, "]") + f.write_str("]") } Expr::Index { base, index } => { self.fmt(base, f)?; - write!(f, "[")?; + f.write_str("[")?; self.fmt(index, f)?; - write!(f, "]") + f.write_str("]") } Expr::UnOp { op, val, .. } => { - write!(f, "{op}")?; + f.write_str(op.name())?; self.fmt_paren(val, f, unary) } - Expr::Break { .. } => write!(f, "break"), - Expr::Continue { .. } => write!(f, "continue"), + Expr::Break { .. } => f.write_str("break"), + Expr::Continue { .. } => f.write_str("continue"), Expr::If { cond, then, else_, .. } => { - write!(f, "if ")?; + f.write_str("if ")?; self.fmt(cond, f)?; - write!(f, " ")?; + f.write_str(" ")?; self.fmt_paren(then, f, consecutive)?; if let Some(e) = else_ { - write!(f, " else ")?; + f.write_str(" else ")?; self.fmt(e, f)?; } Ok(()) } Expr::Loop { body, .. } => { - write!(f, "loop ")?; + f.write_str("loop ")?; self.fmt(body, f) } Expr::Closure { ret, body, args, .. } => { - write!(f, "fn(")?; + f.write_str("fn(")?; self.fmt_list(f, false, "", ",", args, |s, arg, f| { if arg.is_ct { - write!(f, "$")?; + f.write_str("$")?; } - write!(f, "{}: ", arg.name)?; + f.write_str(arg.name)?; + f.write_str(": ")?; s.fmt(&arg.ty, f) })?; - write!(f, "): ")?; + f.write_str("): ")?; self.fmt(ret, f)?; - write!(f, " ")?; + f.write_str(" ")?; self.fmt_paren(body, f, consecutive)?; Ok(()) } Expr::Call { func, args, trailing_comma } => { self.fmt_paren(func, f, postfix)?; - write!(f, "(")?; + f.write_str("(")?; self.fmt_list(f, trailing_comma, ")", ",", args, Self::fmt) } Expr::Return { val: Some(val), .. } => { - write!(f, "return ")?; + f.write_str("return ")?; self.fmt(val, f) } - Expr::Return { val: None, .. } => write!(f, "return"), - Expr::Ident { name, is_ct: true, .. } => write!(f, "${name}"), - Expr::Ident { name, is_ct: false, .. } => write!(f, "{name}"), + Expr::Return { val: None, .. } => f.write_str("return"), + Expr::Ident { name, is_ct: true, .. } => { + f.write_str("$")?; + f.write_str(name) + } + Expr::Ident { name, is_ct: false, .. } => f.write_str(name), Expr::Block { stmts, .. } => { - write!(f, "{{")?; + f.write_str("{")?; self.fmt_list(f, true, "}", "", stmts, Self::fmt) } Expr::Number { value, radix, .. } => { @@ -327,24 +340,26 @@ impl<'a> Formatter<'a> { unreachable!() } + f.write_str(match radix { + Radix::Decimal => "", + Radix::Hex => "0x", + Radix::Octal => "0o", + Radix::Binary => "0b", + })?; let mut buf = [0u8; 64]; - let value = display_radix(radix, value as u64, &mut buf); - match radix { - Radix::Decimal => write!(f, "{value}"), - Radix::Hex => write!(f, "0x{value}"), - Radix::Octal => write!(f, "0o{value}"), - Radix::Binary => write!(f, "0b{value}"), - } + f.write_str(display_radix(radix, value as u64, &mut buf)) } - Expr::Bool { value, .. } => write!(f, "{value}"), - Expr::Idk { .. } => write!(f, "idk"), + Expr::Bool { value, .. } => f.write_str(if value { "true" } else { "false" }), + Expr::Idk { .. } => f.write_str("idk"), Expr::BinOp { left, op: TokenKind::Assign, right: &Expr::BinOp { left: lleft, op, right }, } if left.pos() == lleft.pos() => { self.fmt(left, f)?; - write!(f, " {op}= ")?; + f.write_str(" ")?; + f.write_str(op.name())?; + f.write_str("= ")?; self.fmt(right, f) } Expr::BinOp { right, op, left } => { @@ -362,16 +377,21 @@ impl<'a> Formatter<'a> { let exact_bound = lexer::Lexer::new(&prev[estimate_bound..]).last().start; prev = &prev[..exact_bound as usize + estimate_bound]; if preserve_newlines(prev) > 0 { - writeln!(f)?; + f.write_str("\n")?; for _ in 0..self.depth + 1 { - write!(f, "\t")?; + f.write_str("\t")?; } - write!(f, "{op} ")?; + f.write_str(op.name())?; + f.write_str(" ")?; } else { - write!(f, " {op} ")?; + f.write_str(" ")?; + f.write_str(op.name())?; + f.write_str(" ")?; } } else { - write!(f, " {op} ")?; + f.write_str(" ")?; + f.write_str(op.name())?; + f.write_str(" ")?; } self.fmt_paren(right, f, pec_miss) }