Skip to content

Conversation

@timsueberkrueb
Copy link
Contributor

@timsueberkrueb timsueberkrueb commented Nov 5, 2025

Currently, it is very hard to write tests for core. There are two main reasons for this:

  1. The core parser is currently very rudimentary and it is not easy to write core programs. This would be addressed by a new core frontend (WIP: New core frontend #1152).
  2. The core pretty-printer is currently unable to produce code that can be re-parsed with the core parser. I would like to address this with this PR.

While a new core frontend would subsume both of these problems, it is a lot more effort than adding a re-parsable mode to the current core pretty-printer. This would allow us to compile source programs to core and pretty-print them to use them as golden output in core tests.

In particular, when developing the new normalizer (#1127), I would like to track its behavior in unit tests, but they are currently very time-consuming to write due to the fact I cannot just use pretty-printed core for comparison.

//def toDoc(n: Name): Doc = n.toString

def toDoc(s: symbols.Symbol): Doc = s.show
def toDoc(s: symbols.Symbol): Doc = s.name.name ++ "$" ++ s.id.toString
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$ is a valid character in identifiers, so we need to find another symbol. How about #?

Copy link
Contributor

@jiribenes jiribenes Nov 7, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TIL, I thought we didn't allow it in source exactly for this reason. Does anybody actually use it anywhere [in source]?

lazy val externBodyTemplate: P[Template[Expr]] =
(
(multilineString | stringLiteral) ~
rep((`++` ~> expr) ~ (`++` ~> (multilineString | stringLiteral)))
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I chose the syntax "string" ++ (<expr> ++ "string")* for extern body template strings because it is easy to parse. Open to to other suggestions!

| failure("Expected an identifier")
)
| failure("Expected an identifier")
)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Undo some of these spurious white space changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants