@@ -32,9 +32,10 @@ import Control.Applicative
32import Control.Monad.State
32import Control.Monad.State
33import Control.Monad.Error.Class
33import Control.Monad.Error.Class
35+import Data.Monoid ((<>))
35import Data.Function (on)
36import Data.Function (on)
36import Data.Functor.Identity
37import Data.Functor.Identity
37−import Data.List (sort, groupBy, sortBy)
38+import Data.List (groupBy, sortBy)
39import qualified Data.Data as D
40import qualified Data.Data as D
40import qualified Data.Generics as G
41import qualified Data.Generics as G
@@ -52,8 +53,8 @@ import qualified Language.PureScript.Constants as C
52rebracket :: [Module] -> Either ErrorStack [Module]
53rebracket :: [Module] -> Either ErrorStack [Module]
53rebracket ms = do
54rebracket ms = do
54 let fixities = concatMap collectFixities ms
55 let fixities = concatMap collectFixities ms
55− ensureNoDuplicates $ map fst fixities
56+ ensureNoDuplicates $ map (\(i, pos, _) -> (i, pos)) fixities
56− let opTable = customOperatorTable fixities
57+ let opTable = customOperatorTable $ map (\(i, _, f) -> (i, f)) fixities
57 mapM (rebracketModule opTable) ms
58 mapM (rebracketModule opTable) ms
59removeSignedLiterals :: (D.Data d) => d -> d
60removeSignedLiterals :: (D.Data d) => d -> d
@@ -73,20 +74,23 @@ removeParens = G.everywhere (G.mkT go)
73 go (Parens val) = val
74 go (Parens val) = val
74 go val = val
75 go val = val
76−collectFixities :: Module -> [(Qualified Ident, Fixity)]
77+collectFixities :: Module -> [(Qualified Ident, SourcePos, Fixity)]
77collectFixities (Module moduleName ds _) = concatMap collect ds
78collectFixities (Module moduleName ds _) = concatMap collect ds
79− collect :: Declaration -> [(Qualified Ident, Fixity)]
80+ collect :: Declaration -> [(Qualified Ident, SourcePos, Fixity)]
80− collect (PositionedDeclaration _ d) = collect d
81− collect (FixityDeclaration fixity name) = [(Qualified (Just moduleName) (Op name), fixity)]
81+ collect (PositionedDeclaration pos (FixityDeclaration fixity name)) = [(Qualified (Just moduleName) (Op name), pos, fixity)]
82+ collect FixityDeclaration{} = error "Fixity without srcpos info"
82 collect _ = []
83 collect _ = []
84−ensureNoDuplicates :: [Qualified Ident] -> Either ErrorStack ()
85+ensureNoDuplicates :: [(Qualified Ident, SourcePos)] -> Either ErrorStack ()
85−ensureNoDuplicates m = go $ sort m
86+ensureNoDuplicates m = go $ sortBy (compare `on` fst) m
87 go [] = return ()
88 go [] = return ()
88 go [_] = return ()
89 go [_] = return ()
90+ go ((x@(Qualified (Just mn) name), _) : (y, pos) : _) | x == y =
91+ rethrow (strMsg ("Error in module " ++ show mn) <>) $
92+ rethrowWithPosition pos $
89− go (x : y : _) | x == y = throwError $ mkErrorStack ("Redefined fixity for " ++ show x) Nothing
93+ throwError $ mkErrorStack ("Redefined fixity for " ++ show name) Nothing
90 go (_ : rest) = go rest
94 go (_ : rest) = go rest
92customOperatorTable :: [(Qualified Ident, Fixity)] -> [[(Qualified Ident, Value -> Value -> Value, Associativity)]]
96customOperatorTable :: [(Qualified Ident, Fixity)] -> [[(Qualified Ident, Value -> Value -> Value, Associativity)]]