diff --git a/source/library/Language/Haskell/Brittany/Internal/Components/OpTree.hs b/source/library/Language/Haskell/Brittany/Internal/Components/OpTree.hs index c3f18ad..e6dfb68 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Components/OpTree.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Components/OpTree.hs @@ -193,143 +193,143 @@ remSuperfluousParens outerFixity = \case hardcodedFixity :: Bool -> String -> Maybe Fixity hardcodedFixity allowUnqualify = \case - "." -> Just $ Fixity NoSourceText 9 InfixR - "!!" -> Just $ Fixity NoSourceText 9 InfixL - "**" -> Just $ Fixity NoSourceText 8 InfixR - "^" -> Just $ Fixity NoSourceText 8 InfixR - "^^" -> Just $ Fixity NoSourceText 8 InfixR - "*" -> Just $ Fixity NoSourceText 7 InfixL - "/" -> Just $ Fixity NoSourceText 7 InfixL - "`quot`" -> Just $ Fixity NoSourceText 7 InfixL - "`rem`" -> Just $ Fixity NoSourceText 7 InfixL - "`div`" -> Just $ Fixity NoSourceText 7 InfixL - "`mod`" -> Just $ Fixity NoSourceText 7 InfixL - "+" -> Just $ Fixity NoSourceText 6 InfixL - "-" -> Just $ Fixity NoSourceText 6 InfixL - ":" -> Just $ Fixity NoSourceText 5 InfixR - "==" -> Just $ Fixity NoSourceText 4 InfixN - "/=" -> Just $ Fixity NoSourceText 4 InfixN - "<" -> Just $ Fixity NoSourceText 4 InfixN - "<=" -> Just $ Fixity NoSourceText 4 InfixN - ">" -> Just $ Fixity NoSourceText 4 InfixN - ">=" -> Just $ Fixity NoSourceText 4 InfixN - "&&" -> Just $ Fixity NoSourceText 3 InfixR - "||" -> Just $ Fixity NoSourceText 2 InfixR - ">>=" -> Just $ Fixity NoSourceText 1 InfixL - ">>" -> Just $ Fixity NoSourceText 1 InfixL - "=<<" -> Just $ Fixity NoSourceText 1 InfixR - "$" -> Just $ Fixity NoSourceText 0 InfixR - "`seq`" -> Just $ Fixity NoSourceText 0 InfixR - "$!" -> Just $ Fixity NoSourceText 0 InfixR - "!" -> Just $ Fixity NoSourceText 9 InfixL - "//" -> Just $ Fixity NoSourceText 9 InfixL - "<>" -> Just $ Fixity NoSourceText 6 InfixR - "<+>" -> Just $ Fixity NoSourceText 5 InfixR - "<$" -> Just $ Fixity NoSourceText 4 InfixL - "$>" -> Just $ Fixity NoSourceText 4 InfixL - "<$>" -> Just $ Fixity NoSourceText 4 InfixL - "<&>" -> Just $ Fixity NoSourceText 1 InfixL - "&" -> Just $ Fixity NoSourceText 1 InfixL - "<*>" -> Just $ Fixity NoSourceText 4 InfixL - "<**>" -> Just $ Fixity NoSourceText 4 InfixL - "*>" -> Just $ Fixity NoSourceText 4 InfixL - "<*" -> Just $ Fixity NoSourceText 4 InfixL - "`elem`" -> Just $ Fixity NoSourceText 4 InfixN - "`notElem`" -> Just $ Fixity NoSourceText 4 InfixN - "++" -> Just $ Fixity NoSourceText 5 InfixR - "%" -> Just $ Fixity NoSourceText 7 InfixL - "<|>" -> Just $ Fixity NoSourceText 3 InfixL - ".&." -> Just $ Fixity NoSourceText 7 InfixL - ".|." -> Just $ Fixity NoSourceText 5 InfixL - "`xor`" -> Just $ Fixity NoSourceText 6 InfixL - "`shift`" -> Just $ Fixity NoSourceText 8 InfixL - "`rotate`" -> Just $ Fixity NoSourceText 8 InfixL - "`shiftL`" -> Just $ Fixity NoSourceText 8 InfixL - "`shiftR`" -> Just $ Fixity NoSourceText 8 InfixL - "`rotateL`" -> Just $ Fixity NoSourceText 8 InfixL - "`rotateR`" -> Just $ Fixity NoSourceText 8 InfixL - "+#" -> Just $ Fixity NoSourceText 6 InfixL - ".^." -> Just $ Fixity NoSourceText 6 InfixL - ".>>." -> Just $ Fixity NoSourceText 8 InfixL - ".<<." -> Just $ Fixity NoSourceText 8 InfixL - "!>>." -> Just $ Fixity NoSourceText 8 InfixL - "!<<." -> Just $ Fixity NoSourceText 8 InfixL - ">=>" -> Just $ Fixity NoSourceText 1 InfixR - "<=<" -> Just $ Fixity NoSourceText 1 InfixR - "&&&" -> Just $ Fixity NoSourceText 3 InfixR - "<$!>" -> fixity InfixL 4 + "." -> Just $ Fixity NoSourceText 9 InfixR + "!!" -> Just $ Fixity NoSourceText 9 InfixL + "**" -> Just $ Fixity NoSourceText 8 InfixR + "^" -> Just $ Fixity NoSourceText 8 InfixR + "^^" -> Just $ Fixity NoSourceText 8 InfixR + "*" -> Just $ Fixity NoSourceText 7 InfixL + "/" -> Just $ Fixity NoSourceText 7 InfixL + "`quot`" -> Just $ Fixity NoSourceText 7 InfixL + "`rem`" -> Just $ Fixity NoSourceText 7 InfixL + "`div`" -> Just $ Fixity NoSourceText 7 InfixL + "`mod`" -> Just $ Fixity NoSourceText 7 InfixL + "+" -> Just $ Fixity NoSourceText 6 InfixL + "-" -> Just $ Fixity NoSourceText 6 InfixL + ":" -> Just $ Fixity NoSourceText 5 InfixR + "==" -> Just $ Fixity NoSourceText 4 InfixN + "/=" -> Just $ Fixity NoSourceText 4 InfixN + "<" -> Just $ Fixity NoSourceText 4 InfixN + "<=" -> Just $ Fixity NoSourceText 4 InfixN + ">" -> Just $ Fixity NoSourceText 4 InfixN + ">=" -> Just $ Fixity NoSourceText 4 InfixN + "&&" -> Just $ Fixity NoSourceText 3 InfixR + "||" -> Just $ Fixity NoSourceText 2 InfixR + ">>=" -> Just $ Fixity NoSourceText 1 InfixL + ">>" -> Just $ Fixity NoSourceText 1 InfixL + "=<<" -> Just $ Fixity NoSourceText 1 InfixR + "$" -> Just $ Fixity NoSourceText 0 InfixR + "`seq`" -> Just $ Fixity NoSourceText 0 InfixR + "$!" -> Just $ Fixity NoSourceText 0 InfixR + "!" -> Just $ Fixity NoSourceText 9 InfixL + "//" -> Just $ Fixity NoSourceText 9 InfixL + "<>" -> Just $ Fixity NoSourceText 6 InfixR + "<+>" -> Just $ Fixity NoSourceText 5 InfixR + "<$" -> Just $ Fixity NoSourceText 4 InfixL + "$>" -> Just $ Fixity NoSourceText 4 InfixL + "<$>" -> Just $ Fixity NoSourceText 4 InfixL + "<&>" -> Just $ Fixity NoSourceText 1 InfixL + "&" -> Just $ Fixity NoSourceText 1 InfixL + "<*>" -> Just $ Fixity NoSourceText 4 InfixL + "<**>" -> Just $ Fixity NoSourceText 4 InfixL + "*>" -> Just $ Fixity NoSourceText 4 InfixL + "<*" -> Just $ Fixity NoSourceText 4 InfixL + "`elem`" -> Just $ Fixity NoSourceText 4 InfixN + "`notElem`" -> Just $ Fixity NoSourceText 4 InfixN + "++" -> Just $ Fixity NoSourceText 5 InfixR + "%" -> Just $ Fixity NoSourceText 7 InfixL + "<|>" -> Just $ Fixity NoSourceText 3 InfixL + ".&." -> Just $ Fixity NoSourceText 7 InfixL + ".|." -> Just $ Fixity NoSourceText 5 InfixL + "`xor`" -> Just $ Fixity NoSourceText 6 InfixL + "`shift`" -> Just $ Fixity NoSourceText 8 InfixL + "`rotate`" -> Just $ Fixity NoSourceText 8 InfixL + "`shiftL`" -> Just $ Fixity NoSourceText 8 InfixL + "`shiftR`" -> Just $ Fixity NoSourceText 8 InfixL + "`rotateL`" -> Just $ Fixity NoSourceText 8 InfixL + "`rotateR`" -> Just $ Fixity NoSourceText 8 InfixL + "+#" -> Just $ Fixity NoSourceText 6 InfixL + ".^." -> Just $ Fixity NoSourceText 6 InfixL + ".>>." -> Just $ Fixity NoSourceText 8 InfixL + ".<<." -> Just $ Fixity NoSourceText 8 InfixL + "!>>." -> Just $ Fixity NoSourceText 8 InfixL + "!<<." -> Just $ Fixity NoSourceText 8 InfixL + ">=>" -> Just $ Fixity NoSourceText 1 InfixR + "<=<" -> Just $ Fixity NoSourceText 1 InfixR + "&&&" -> Just $ Fixity NoSourceText 3 InfixR + "<$!>" -> fixity InfixL 4 - "~" -> fixity InfixN 4 - "~~" -> fixity InfixN 4 - ":~:" -> Just $ Fixity NoSourceText 4 InfixN - ":~~:" -> Just $ Fixity NoSourceText 4 InfixN - ":+:" -> fixity InfixR 5 - ":*:" -> fixity InfixR 6 - ":.:" -> fixity InfixR 7 - ":|" -> fixity InfixR 5 + "~" -> fixity InfixN 4 + "~~" -> fixity InfixN 4 + ":~:" -> Just $ Fixity NoSourceText 4 InfixN + ":~~:" -> Just $ Fixity NoSourceText 4 InfixN + ":+:" -> fixity InfixR 5 + ":*:" -> fixity InfixR 6 + ":.:" -> fixity InfixR 7 + ":|" -> fixity InfixR 5 -- non-base from random sources. - "<|" -> Just $ Fixity NoSourceText 5 InfixR - "|>" -> Just $ Fixity NoSourceText 5 InfixL - "><" -> Just $ Fixity NoSourceText 5 InfixR - "$+$" -> Just $ Fixity NoSourceText 5 InfixL - "\\\\" -> Just $ Fixity NoSourceText 5 InfixN - ".>" -> Just $ Fixity NoSourceText 9 InfixL - ":?" -> Just $ Fixity NoSourceText 7 InfixN - ":-" -> Just $ Fixity NoSourceText 9 InfixR - ".:" -> Just $ Fixity NoSourceText 9 InfixR - "$!!" -> fixity InfixR 0 - "<$!!>" -> fixity InfixL 4 + "<|" -> Just $ Fixity NoSourceText 5 InfixR + "|>" -> Just $ Fixity NoSourceText 5 InfixL + "><" -> Just $ Fixity NoSourceText 5 InfixR + "$+$" -> Just $ Fixity NoSourceText 5 InfixL + "\\\\" -> Just $ Fixity NoSourceText 5 InfixN + ".>" -> Just $ Fixity NoSourceText 9 InfixL + ":?" -> Just $ Fixity NoSourceText 7 InfixN + ":-" -> Just $ Fixity NoSourceText 9 InfixR + ".:" -> Just $ Fixity NoSourceText 9 InfixR + "$!!" -> fixity InfixR 0 + "<$!!>" -> fixity InfixL 4 -- lens, not complete! - "<|" -> fixity InfixR 5 - "|>" -> fixity InfixL 5 - "%~" -> fixity InfixR 4 - ".~" -> fixity InfixR 4 - "?~" -> fixity InfixR 4 - "<.~" -> fixity InfixR 4 - " fixity InfixR 4 - "+~" -> fixity InfixR 4 - "*~" -> fixity InfixR 4 - "-~" -> fixity InfixR 4 - "//~" -> fixity InfixR 4 - "^~" -> fixity InfixR 4 - "^^~" -> fixity InfixR 4 - "**~" -> fixity InfixR 4 - "||~" -> fixity InfixR 4 - "&&~" -> fixity InfixR 4 - ".=" -> fixity InfixN 4 - "%=" -> fixity InfixN 4 - "?=" -> fixity InfixN 4 - "+=" -> fixity InfixN 4 - "-=" -> fixity InfixN 4 - "*=" -> fixity InfixN 4 - "//=" -> fixity InfixN 4 - "^=" -> fixity InfixN 4 - "^^=" -> fixity InfixN 4 - "**=" -> fixity InfixN 4 - "&&=" -> fixity InfixN 4 - "||=" -> fixity InfixN 4 - "<~" -> fixity InfixR 2 - "<.=" -> fixity InfixN 4 - " fixity InfixN 4 - "<>~" -> fixity InfixR 4 - "<>=" -> fixity InfixN 4 - "^.." -> fixity InfixL 8 - "^?" -> fixity InfixL 8 - "^?!" -> fixity InfixL 8 - "^@.." -> fixity InfixL 8 - "^@?" -> fixity InfixL 8 - "^@?!" -> fixity InfixL 8 - "^." -> fixity InfixL 8 - "^@." -> fixity InfixL 8 - "<." -> fixity InfixR 9 - ".>" -> fixity InfixR 9 - "<.>" -> fixity InfixR 9 - "@@~" -> fixity InfixR 4 - "@@=" -> fixity InfixR 4 - "&~" -> fixity InfixL 1 - "??" -> fixity InfixL 1 + "<|" -> fixity InfixR 5 + "|>" -> fixity InfixL 5 + "%~" -> fixity InfixR 4 + ".~" -> fixity InfixR 4 + "?~" -> fixity InfixR 4 + "<.~" -> fixity InfixR 4 + " fixity InfixR 4 + "+~" -> fixity InfixR 4 + "*~" -> fixity InfixR 4 + "-~" -> fixity InfixR 4 + "//~" -> fixity InfixR 4 + "^~" -> fixity InfixR 4 + "^^~" -> fixity InfixR 4 + "**~" -> fixity InfixR 4 + "||~" -> fixity InfixR 4 + "&&~" -> fixity InfixR 4 + ".=" -> fixity InfixN 4 + "%=" -> fixity InfixN 4 + "?=" -> fixity InfixN 4 + "+=" -> fixity InfixN 4 + "-=" -> fixity InfixN 4 + "*=" -> fixity InfixN 4 + "//=" -> fixity InfixN 4 + "^=" -> fixity InfixN 4 + "^^=" -> fixity InfixN 4 + "**=" -> fixity InfixN 4 + "&&=" -> fixity InfixN 4 + "||=" -> fixity InfixN 4 + "<~" -> fixity InfixR 2 + "<.=" -> fixity InfixN 4 + " fixity InfixN 4 + "<>~" -> fixity InfixR 4 + "<>=" -> fixity InfixN 4 + "^.." -> fixity InfixL 8 + "^?" -> fixity InfixL 8 + "^?!" -> fixity InfixL 8 + "^@.." -> fixity InfixL 8 + "^@?" -> fixity InfixL 8 + "^@?!" -> fixity InfixL 8 + "^." -> fixity InfixL 8 + "^@." -> fixity InfixL 8 + "<." -> fixity InfixR 9 + ".>" -> fixity InfixR 9 + "<.>" -> fixity InfixR 9 + "@@~" -> fixity InfixR 4 + "@@=" -> fixity InfixR 4 + "&~" -> fixity InfixL 1 + "??" -> fixity InfixL 1 -- certain other operators @@ -343,50 +343,62 @@ hardcodedFixity allowUnqualify = \case -- ".*?" -> fixity _ _ -- ".+." -> fixity _ _ -- ".-." -> fixity _ _ - ".&." -> fixity InfixR 1 - ".&&." -> fixity InfixR 1 - ".||." -> fixity InfixR 1 - "==>" -> fixity InfixR 0 - "=/=" -> fixity InfixN 4 - "===" -> fixity InfixN 4 - ".:!" -> fixity InfixL 9 - ".:?" -> fixity InfixL 9 + ".&." -> fixity InfixR 1 + ".&&." -> fixity InfixR 1 + ".||." -> fixity InfixR 1 + "==>" -> fixity InfixR 0 + "=/=" -> fixity InfixN 4 + "===" -> fixity InfixN 4 + ".:!" -> fixity InfixL 9 + ".:?" -> fixity InfixL 9 -- ".:>" -> fixity _ _ -- ".:>?" -> fixity _ _ - "<.>" -> fixity InfixR 7 - "" -> fixity InfixR 5 - "" -> fixity InfixL 9 + "<.>" -> fixity InfixR 7 + "" -> fixity InfixR 5 + "" -> fixity InfixL 9 -- "~" -> fixity _ _ - "===" -> fixity InfixN 4 - "!?" -> fixity InfixL 9 - "%==" -> fixity InfixN 3 - ".*" -> fixity InfixR 8 - ".**" -> fixity InfixR 8 - ".***" -> fixity InfixR 8 - ":?-" -> fixity InfixN 1 - "::-" -> fixity InfixN 0 - "&!" -> fixity InfixL 1 - + "===" -> fixity InfixN 4 + "!?" -> fixity InfixL 9 + "%==" -> fixity InfixN 3 + ".*" -> fixity InfixR 8 + ".**" -> fixity InfixR 8 + ".***" -> fixity InfixR 8 + ":?-" -> fixity InfixN 1 + "::-" -> fixity InfixN 0 + "&!" -> fixity InfixL 1 + -- quickcheck (-state-machine) - ":&&" -> fixity InfixL 9 - ":||" -> fixity InfixL 9 - ":&&:" -> fixity InfixL 9 - ":=>" -> fixity InfixL 9 - ":==" -> fixity InfixL 9 - ":/=" -> fixity InfixL 9 - ":<" -> fixity InfixL 9 - ":<=" -> fixity InfixL 9 - ":>" -> fixity InfixL 9 - ":>=" -> fixity InfixL 9 - ":->" -> fixity InfixL 9 + ":&&" -> fixity InfixL 9 + ":||" -> fixity InfixL 9 + ":&&:" -> fixity InfixL 9 + ":=>" -> fixity InfixL 9 + ":==" -> fixity InfixL 9 + ":/=" -> fixity InfixL 9 + ":<" -> fixity InfixL 9 + ":<=" -> fixity InfixL 9 + ":>" -> fixity InfixL 9 + ":>=" -> fixity InfixL 9 + ":->" -> fixity InfixL 9 + ".==" -> fixity InfixN 5 + "./" -> fixity InfixN 5 + ".<" -> fixity InfixN 5 + ".<=" -> fixity InfixN 5 + ".>" -> fixity InfixN 5 + ".>=" -> fixity InfixN 5 + "`member`" -> fixity InfixN 8 + "`notMember`" -> fixity InfixN 8 + ".//" -> fixity InfixL 4 + ".&&" -> fixity InfixR 3 + ".||" -> fixity InfixR 2 + ".=>" -> fixity InfixR 1 -- servant - ":>" -> fixity InfixR 4 - ":<|>" -> fixity InfixR 3 - ":-" -> fixity InfixL 0 + ":>" -> fixity InfixR 4 + ":<|>" -> fixity InfixR 3 + ":-" -> fixity InfixL 0 -- postgresql-simple - ":." -> fixity InfixR 3 -- this has wildly different fixities in different libraries + ":." -> fixity InfixR 3 -- this has wildly different fixities in different libraries -- ? -- ":-:" -> fixity _ _ @@ -399,7 +411,7 @@ hardcodedFixity allowUnqualify = \case -- ":>:" -> fixity _ _ -- ":>=:" -> fixity _ _ - str -> case (Safe.headMay str, Safe.lastMay str) of + str -> case (Safe.headMay str, Safe.lastMay str) of (Just '\'', _) -> hardcodedFixity False (drop 1 str) (Just '`', Just '`') -> Just $ Fixity NoSourceText 9 InfixL (Just c, _) | Data.Char.isAlpha c && allowUnqualify -> hardcodedFixity False