bugfix: don't emit virtual semis inside { or [

This commit is contained in:
Mitchell Rosen 2024-06-21 13:52:58 -04:00
parent 076163feef
commit 0c2e8c5193
2 changed files with 14 additions and 2 deletions

View File

@ -224,7 +224,7 @@ token'' tok p = do
pops p = do
env <- S.get
let l = layout env
if top l == column p && topBlockName l /= Just "(" -- don't emit virtual semis inside parens
if top l == column p && topContainsVirtualSemis l
then pure [Token (Semi True) p p]
else
if column p > top l || topHasClosePair l
@ -234,6 +234,12 @@ token'' tok p = do
then S.put (env {layout = pop l}) >> ((Token Close p p :) <$> pops p)
else error "impossible"
-- don't emit virtual semis in (, {, or [ blocks
topContainsVirtualSemis :: Layout -> Bool
topContainsVirtualSemis = \case
[] -> False
((name, _) : _) -> name /= "(" && name /= "{" && name /= "["
topHasClosePair :: Layout -> Bool
topHasClosePair [] = False
topHasClosePair ((name, _) : _) =

View File

@ -210,7 +210,13 @@ test =
[Textual "test escaped quotes \"in quotes\""],
t "\"\\n \\t \\b \\a\"" [Textual "\n \t \b \a"],
-- Delayed string
t "'\"\"" [Reserved "'", Textual ""]
t "'\"\"" [Reserved "'", Textual ""],
-- https://github.com/unisonweb/unison/issues/4683
-- don't emit virtual semis in ability lists or normal lists
t "{foo\n,bar}" [Open "{", simpleWordyId "foo", Reserved ",", simpleWordyId "bar", Close],
t "{foo\n ,bar}" [Open "{", simpleWordyId "foo", Reserved ",", simpleWordyId "bar", Close],
t "[foo\n,bar]" [Open "[", simpleWordyId "foo", Reserved ",", simpleWordyId "bar", Close],
t "[foo\n ,bar]" [Open "[", simpleWordyId "foo", Reserved ",", simpleWordyId "bar", Close]
]
t :: String -> [Lexeme] -> Test ()