git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Fix operator precedence issue
439ce1aPhil Freeman
libraries/prelude/prelude.purs+1−1
@@ -22,7 +22,7 @@ module Prelude where
22 ($) :: forall a b. (a -> b) -> a -> b
22 ($) :: forall a b. (a -> b) -> a -> b
23 ($) f x = f x
23 ($) f x = f x
24
24
25− infixl 1000 $
25+ infixr 1000 $
26
26
27module Maybe where
27module Maybe where
28
28
libraries/prelude/tests/Eff.purs+3−3
@@ -4,10 +4,10 @@ import Prelude
4import Eff
4import Eff
5import Errors
5import Errors
6import Trace
6import Trace
7−
7+
8−test n = catchError (\s -> eff do return 0) $ eff do
8+test n = runPure $ catchError (\s -> eff do return 0) $ eff do
9 case {} of
9 case {} of
10 _ | n > 10 -> eff do
10 _ | n > 10 -> eff do
11− trace "n > 10"
11+ --trace "n > 10"
12 throwError "Error!"
12 throwError "Error!"
13 _ -> eff do return n
13 _ -> eff do return n
src/Language/PureScript/Sugar/Operators.hs+21−14
@@ -34,11 +34,14 @@ import qualified Text.Parsec.Pos as P
34import qualified Text.Parsec.Expr as P
34import qualified Text.Parsec.Expr as P
35
35
36rebracket :: [Module] -> Either String [Module]
36rebracket :: [Module] -> Either String [Module]
37+rebracket = go M.empty []
38+ where
39+ go _ rb [] = return . reverse $ rb
37−rebracket ms = forM ms $ \(Module name ds) -> do
40+ go m rb (Module name ds : ms) = do
38− m <- collectFixities (ModuleName name) ds
41+ m' <- M.union m <$> collectFixities m (ModuleName name) ds
39− let opTable = customOperatorTable m
42+ let opTable = customOperatorTable m'
40− ds' <- G.everywhereM' (G.mkM (matchOperators (ModuleName name) opTable)) ds
43+ ds' <- G.everywhereM' (G.mkM (matchOperators (ModuleName name) opTable)) ds
41− return $ Module name $ G.everywhere (G.mkT removeParens) ds'
44+ go m' (Module name (G.everywhere (G.mkT removeParens) ds') : rb) ms
42
45
43removeParens :: Value -> Value
46removeParens :: Value -> Value
44removeParens (Parens val) = val
47removeParens (Parens val) = val
@@ -85,16 +88,20 @@ matchOp moduleName op = do
85 ident <- parseOp
88 ident <- parseOp
86 guard (qualify moduleName ident == qualify moduleName op)
89 guard (qualify moduleName ident == qualify moduleName op)
87
90
88−collectFixities :: ModuleName -> [Declaration] -> Either String (M.Map (Qualified Ident) Fixity)
89−collectFixities = go M.empty
90− where
91− go :: M.Map (Qualified Ident) Fixity -> ModuleName -> [Declaration] -> Either String (M.Map (Qualified Ident) Fixity)
91+collectFixities :: M.Map (Qualified Ident) Fixity -> ModuleName -> [Declaration] -> Either String (M.Map (Qualified Ident) Fixity)
92− go m _ [] = return m
92+collectFixities m _ [] = return m
93− go m moduleName (FixityDeclaration fixity name : rest) = do
93+collectFixities m moduleName (FixityDeclaration fixity name : rest) = do
94+ let qual = Qualified (Just moduleName) (Op name)
95+ when (qual `M.member` m) (Left $ "redefined fixity for " ++ show name)
96+ collectFixities (M.insert qual fixity m) moduleName rest
97+collectFixities m moduleName (ImportDeclaration importedModule _ : rest) = do
98+ let fs = [ (i, fixity) | (Qualified mn i, fixity) <- M.toList m, mn == Just importedModule ]
99+ forM_ fs $ \(name, _) -> do
94− let qual = Qualified (Just moduleName) (Op name)
100+ let qual = Qualified (Just moduleName) name
95 when (qual `M.member` m) (Left $ "redefined fixity for " ++ show name)
101 when (qual `M.member` m) (Left $ "redefined fixity for " ++ show name)
102+ let m' = M.fromList (map (\(i, fixity) -> (Qualified (Just moduleName) i, fixity)) fs)
96− go (M.insert qual fixity m) moduleName rest
103+ collectFixities (M.union m' m) moduleName rest
97− go m moduleName (_:ds) = go m moduleName ds
104+collectFixities m moduleName (_:ds) = collectFixities m moduleName ds
98
105
99globalOp :: String -> Qualified Ident
106globalOp :: String -> Qualified Ident
100globalOp = Qualified Nothing . Op
107globalOp = Qualified Nothing . Op