@@ -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