diff --git a/compiler/noirc_frontend/src/hir/comptime/display.rs b/compiler/noirc_frontend/src/hir/comptime/display.rs index c0283d9701b..33390b110c2 100644 --- a/compiler/noirc_frontend/src/hir/comptime/display.rs +++ b/compiler/noirc_frontend/src/hir/comptime/display.rs @@ -86,6 +86,9 @@ pub(super) fn tokens_to_string(tokens: &[LocatedToken], interner: &NodeInterner) struct TokenPrettyPrinter<'interner> { interner: &'interner NodeInterner, indent: usize, + /// Determines whether the last outputted byte was alphanumeric. + /// This is used to add a space after the last token and before another token + /// that starts with an alphanumeric byte. last_was_alphanumeric: bool, last_was_right_brace: bool, last_was_semicolon: bool, @@ -169,30 +172,33 @@ impl<'interner> TokenPrettyPrinter<'interner> { } match token { - Token::QuotedType(id) => write!(f, "{}", self.interner.get_quoted_type(*id)), + Token::QuotedType(id) => { + let value = Value::Type(self.interner.get_quoted_type(*id).clone()); + self.print_value(&value, last_was_alphanumeric, f) + } Token::InternedExpr(id) => { let value = Value::expression(ExpressionKind::Interned(*id)); - self.print_value(&value, f) + self.print_value(&value, last_was_alphanumeric, f) } Token::InternedStatement(id) => { let value = Value::statement(StatementKind::Interned(*id)); - self.print_value(&value, f) + self.print_value(&value, last_was_alphanumeric, f) } Token::InternedLValue(id) => { let value = Value::lvalue(LValue::Interned(*id, Location::dummy())); - self.print_value(&value, f) + self.print_value(&value, last_was_alphanumeric, f) } Token::InternedUnresolvedTypeData(id) => { let value = Value::UnresolvedType(UnresolvedTypeData::Interned(*id)); - self.print_value(&value, f) + self.print_value(&value, last_was_alphanumeric, f) } Token::InternedPattern(id) => { let value = Value::pattern(Pattern::Interned(*id, Location::dummy())); - self.print_value(&value, f) + self.print_value(&value, last_was_alphanumeric, f) } Token::UnquoteMarker(id) => { let value = Value::TypedExpr(TypedExpr::ExprId(*id)); - self.print_value(&value, f) + self.print_value(&value, last_was_alphanumeric, f) } Token::Keyword(..) | Token::Ident(..) @@ -291,8 +297,21 @@ impl<'interner> TokenPrettyPrinter<'interner> { } } - fn print_value(&mut self, value: &Value, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn print_value( + &mut self, + value: &Value, + last_was_alphanumeric: bool, + f: &mut std::fmt::Formatter<'_>, + ) -> std::fmt::Result { let string = value.display(self.interner).to_string(); + if string.is_empty() { + return Ok(()); + } + + if last_was_alphanumeric && string.bytes().next().unwrap().is_ascii_alphanumeric() { + write!(f, " ")?; + } + for (index, line) in string.lines().enumerate() { if index > 0 { writeln!(f)?; @@ -301,7 +320,7 @@ impl<'interner> TokenPrettyPrinter<'interner> { line.fmt(f)?; } - self.last_was_alphanumeric = string.bytes().all(|byte| byte.is_ascii_alphanumeric()); + self.last_was_alphanumeric = string.bytes().last().unwrap().is_ascii_alphanumeric(); self.last_was_right_brace = string.ends_with('}'); self.last_was_semicolon = string.ends_with(';');