@@ -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
36rebracket :: [Module] -> Either String [Module]
36rebracket :: [Module] -> Either String [Module]
37+rebracket = go M.empty []
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
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)
88−collectFixities :: ModuleName -> [Declaration] -> Either String (M.Map (Qualified Ident) Fixity)
89−collectFixities = go M.empty
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
99globalOp :: String -> Qualified Ident
106globalOp :: String -> Qualified Ident
100globalOp = Qualified Nothing . Op
107globalOp = Qualified Nothing . Op