[prism] Model inline conditionals as breakables #778
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Currently for mod conditionals (like
return if foo), we transform those to multiple lines (if foo \n return \n end) if they're multiline/too long. The current implementation does this in a wildly inefficient manner: cloning the ~entire parser state, rendering the whole thing as a string, and then checking if the string is multiline. It does all this every time a mod conditional comes up, so it currently takes up a pretty decent chunk of profiling, not to mention it's kinda a hack.This PR makes conditionals work like any other breakable. It stashes the tokens for the predicate and the body of the conditional, then uses those to render into either an inline or block form depending on the line length. This should more accurate and efficient (with much less cloning/allocating) than rendering every single time.