git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Fix operator precedence issue
commit439ce1aa34dafc1214f4206af2337c75a95aa8ec authorPhil Freeman <paf31@cantab.net> dateSat 11 Jan 2014, 11:13 (13 years ago) parent45b60f3
3 files changed+25−18
libraries/prelude/prelude.purs+1−1 libraries/prelude/tests/Eff.purs+3−3 src/Language/PureScript/Sugar/Operators.hs+21−14
libraries/prelude/prelude.purs+1−1
@@ -22,7 +22,7 @@ module Prelude where
2222 ($) :: forall a b. (a -> b) -> a -> b
2323 ($) f x = f x
2424
25− infixl 1000 $
25+ infixr 1000 $
2626
2727module Maybe where
2828
libraries/prelude/tests/Eff.purs+3−3
@@ -4,10 +4,10 @@ import Prelude
44import Eff
55import Errors
66import Trace
7−
8−test n = catchError (\s -> eff do return 0) $ eff do
7+
8+test n = runPure $ catchError (\s -> eff do return 0) $ eff do
99 case {} of
1010 _ | n > 10 -> eff do
11− trace "n > 10"
11+ --trace "n > 10"
1212 throwError "Error!"
1313 _ -> eff do return n
src/Language/PureScript/Sugar/Operators.hs+21−14
@@ -34,11 +34,14 @@ import qualified Text.Parsec.Pos as P
3434import qualified Text.Parsec.Expr as P
3535
3636rebracket :: [Module] -> Either String [Module]
37−rebracket ms = forM ms $ \(Module name ds) -> do
38− m <- collectFixities (ModuleName name) ds
39− let opTable = customOperatorTable m
40− ds' <- G.everywhereM' (G.mkM (matchOperators (ModuleName name) opTable)) ds
41− return $ Module name $ G.everywhere (G.mkT removeParens) ds'
37+rebracket = go M.empty []
38+ where
39+ go _ rb [] = return . reverse $ rb
40+ go m rb (Module name ds : ms) = do
41+ m' <- M.union m <$> collectFixities m (ModuleName name) ds
42+ let opTable = customOperatorTable m'
43+ ds' <- G.everywhereM' (G.mkM (matchOperators (ModuleName name) opTable)) ds
44+ go m' (Module name (G.everywhere (G.mkT removeParens) ds') : rb) ms
4245
4346removeParens :: Value -> Value
4447removeParens (Parens val) = val
@@ -85,16 +88,20 @@ matchOp moduleName op = do
8588 ident <- parseOp
8689 guard (qualify moduleName ident == qualify moduleName op)
8790
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)
92− go m _ [] = return m
93− go m moduleName (FixityDeclaration fixity name : rest) = do
94− let qual = Qualified (Just moduleName) (Op name)
91+collectFixities :: M.Map (Qualified Ident) Fixity -> ModuleName -> [Declaration] -> Either String (M.Map (Qualified Ident) Fixity)
92+collectFixities m _ [] = return m
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
100+ let qual = Qualified (Just moduleName) name
95101 when (qual `M.member` m) (Left $ "redefined fixity for " ++ show name)
96− go (M.insert qual fixity m) moduleName rest
97− go m moduleName (_:ds) = go m moduleName ds
102+ let m' = M.fromList (map (\(i, fixity) -> (Qualified (Just moduleName) i, fixity)) fs)
103+ collectFixities (M.union m' m) moduleName rest
104+collectFixities m moduleName (_:ds) = collectFixities m moduleName ds
98105
99106globalOp :: String -> Qualified Ident
100107globalOp = Qualified Nothing . Op