@@ -32,9 +32,10 @@ import Control.Applicative
3232import Control.Monad.State
3333import Control.Monad.Error.Class
3434
35+import Data.Monoid ((<>))
3536import Data.Function (on)
3637import Data.Functor.Identity
37−import Data.List (sort, groupBy, sortBy)
38+import Data.List (groupBy, sortBy)
3839
3940import qualified Data.Data as D
4041import qualified Data.Generics as G
@@ -52,8 +53,8 @@ import qualified Language.PureScript.Constants as C
5253rebracket :: [Module] -> Either ErrorStack [Module]
5354rebracket ms = do
5455 let fixities = concatMap collectFixities ms
55− ensureNoDuplicates $ map fst fixities
56− let opTable = customOperatorTable fixities
56+ ensureNoDuplicates $ map (\(i, pos, _) -> (i, pos)) fixities
57+ let opTable = customOperatorTable $ map (\(i, _, f) -> (i, f)) fixities
5758 mapM (rebracketModule opTable) ms
5859
5960removeSignedLiterals :: (D.Data d) => d -> d
@@ -73,20 +74,23 @@ removeParens = G.everywhere (G.mkT go)
7374 go (Parens val) = val
7475 go val = val
7576
76−collectFixities :: Module -> [(Qualified Ident, Fixity)]
77+collectFixities :: Module -> [(Qualified Ident, SourcePos, Fixity)]
7778collectFixities (Module moduleName ds _) = concatMap collect ds
7879 where
79− collect :: Declaration -> [(Qualified Ident, Fixity)]
80− collect (PositionedDeclaration _ d) = collect d
81− collect (FixityDeclaration fixity name) = [(Qualified (Just moduleName) (Op name), fixity)]
80+ collect :: Declaration -> [(Qualified Ident, SourcePos, Fixity)]
81+ collect (PositionedDeclaration pos (FixityDeclaration fixity name)) = [(Qualified (Just moduleName) (Op name), pos, fixity)]
82+ collect FixityDeclaration{} = error "Fixity without srcpos info"
8283 collect _ = []
8384
84−ensureNoDuplicates :: [Qualified Ident] -> Either ErrorStack ()
85−ensureNoDuplicates m = go $ sort m
85+ensureNoDuplicates :: [(Qualified Ident, SourcePos)] -> Either ErrorStack ()
86+ensureNoDuplicates m = go $ sortBy (compare `on` fst) m
8687 where
8788 go [] = return ()
8889 go [_] = return ()
89− go (x : y : _) | x == y = throwError $ mkErrorStack ("Redefined fixity for " ++ show x) Nothing
90+ go ((x@(Qualified (Just mn) name), _) : (y, pos) : _) | x == y =
91+ rethrow (strMsg ("Error in module " ++ show mn) <>) $
92+ rethrowWithPosition pos $
93+ throwError $ mkErrorStack ("Redefined fixity for " ++ show name) Nothing
9094 go (_ : rest) = go rest
9195
9296customOperatorTable :: [(Qualified Ident, Fixity)] -> [[(Qualified Ident, Value -> Value -> Value, Associativity)]]