@@ -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 )]]
0 commit comments