@@ -1,13 +1,8 @@
1−-----------------------------------------------------------------------------
1+{-# LANGUAGE Rank2Types #-}
2−--
2+{-# LANGUAGE FlexibleContexts #-}
3−-- Module : Language.PureScript.Sugar.Operators
3+{-# LANGUAGE ScopedTypeVariables #-}
4−-- Copyright : (c) 2013-15 Phil Freeman, (c) 2014-15 Gary Burgess
4+{-# LANGUAGE RecordWildCards #-}
5−-- License : MIT (http://opensource.org/licenses/MIT)
5+
7−-- Maintainer : Phil Freeman <paf31@cantab.net>
8−-- Stability : experimental
12-- This module implements the desugaring pass which reapplies binary operators based
7-- This module implements the desugaring pass which reapplies binary operators based
13-- on their fixity data and removes explicit parentheses.
8-- on their fixity data and removes explicit parentheses.
@@ -15,13 +10,6 @@
15-- The value parser ignores fixity data when parsing binary operator applications, so
10-- The value parser ignores fixity data when parsing binary operator applications, so
16-- it is necessary to reorder them here.
11-- it is necessary to reorder them here.
18−-----------------------------------------------------------------------------
20−{-# LANGUAGE Rank2Types #-}
21−{-# LANGUAGE FlexibleContexts #-}
22−{-# LANGUAGE ScopedTypeVariables #-}
23−{-# LANGUAGE RecordWildCards #-}
25module Language.PureScript.Sugar.Operators (
13module Language.PureScript.Sugar.Operators (
26 rebracket,
14 rebracket,
27 removeSignedLiterals,
15 removeSignedLiterals,
@@ -44,6 +32,8 @@ import Control.Monad.Supply.Class
44import Data.Function (on)
32import Data.Function (on)
45import Data.Functor.Identity
33import Data.Functor.Identity
46import Data.List (groupBy, sortBy)
34import Data.List (groupBy, sortBy)
35+import Data.Maybe (mapMaybe, fromMaybe)
36+import qualified Data.Map as M
48import qualified Text.Parsec as P
38import qualified Text.Parsec as P
49import qualified Text.Parsec.Pos as P
39import qualified Text.Parsec.Pos as P
@@ -57,9 +47,24 @@ import qualified Language.PureScript.Constants as C
57rebracket :: (Applicative m, MonadError MultipleErrors m) => [ExternsFile] -> [Module] -> m [Module]
47rebracket :: (Applicative m, MonadError MultipleErrors m) => [ExternsFile] -> [Module] -> m [Module]
58rebracket externs ms = do
48rebracket externs ms = do
59 let fixities = concatMap externsFixities externs ++ concatMap collectFixities ms
49 let fixities = concatMap externsFixities externs ++ concatMap collectFixities ms
60− ensureNoDuplicates $ map (\(i, pos, _) -> (i, pos)) fixities
50+ ensureNoDuplicates $ map (\(i, pos, _, _) -> (i, pos)) fixities
61− let opTable = customOperatorTable $ map (\(i, _, f) -> (i, f)) fixities
51+ let opTable = customOperatorTable $ map (\(i, _, f, _) -> (i, f)) fixities
62− traverse (rebracketModule opTable) ms
52+ ms' <- traverse (rebracketModule opTable) ms
53+ let aliased = M.fromList (mapMaybe makeLookupEntry fixities)
54+ return $ renameAliasedOperators aliased `map` ms'
58+ makeLookupEntry :: (Qualified Ident, SourceSpan, Fixity, Maybe Ident) -> Maybe (Qualified Ident, Qualified Ident)
59+ makeLookupEntry (qname@(Qualified qual _), _, _, Just alias) = Just (qname, Qualified qual alias)
60+ makeLookupEntry _ = Nothing
62+ renameAliasedOperators :: M.Map (Qualified Ident) (Qualified Ident) -> Module -> Module
63+ renameAliasedOperators aliased (Module ss coms mn ds exts) = Module ss coms mn (map f' ds) exts
65+ (f', _, _) = everywhereOnValues id go id
66+ go (Var name) = Var $ fromMaybe name (name `M.lookup` aliased)
64removeSignedLiterals :: Module -> Module
69removeSignedLiterals :: Module -> Module
65removeSignedLiterals (Module ss coms mn ds exts) = Module ss coms mn (map f' ds) exts
70removeSignedLiterals (Module ss coms mn ds exts) = Module ss coms mn (map f' ds) exts
@@ -82,17 +87,18 @@ removeParens =
82 go (Parens val) = val
87 go (Parens val) = val
83 go val = val
88 go val = val
85−externsFixities :: ExternsFile -> [(Qualified Ident, SourceSpan, Fixity)]
90+externsFixities :: ExternsFile -> [(Qualified Ident, SourceSpan, Fixity, Maybe Ident)]
86externsFixities ExternsFile{..} =
91externsFixities ExternsFile{..} =
87− [ (Qualified (Just efModuleName) (Op op), internalModuleSourceSpan "", Fixity assoc prec)
92+ [ (Qualified (Just efModuleName) (Op op), internalModuleSourceSpan "", Fixity assoc prec, alias)
88− | ExternsFixity assoc prec op <- efFixities
93+ | ExternsFixity assoc prec op alias <- efFixities
91−collectFixities :: Module -> [(Qualified Ident, SourceSpan, Fixity)]
96+collectFixities :: Module -> [(Qualified Ident, SourceSpan, Fixity, Maybe Ident)]
92collectFixities (Module _ _ moduleName ds _) = concatMap collect ds
97collectFixities (Module _ _ moduleName ds _) = concatMap collect ds
94− collect :: Declaration -> [(Qualified Ident, SourceSpan, Fixity)]
99+ collect :: Declaration -> [(Qualified Ident, SourceSpan, Fixity, Maybe Ident)]
95− collect (PositionedDeclaration pos _ (FixityDeclaration fixity name)) = [(Qualified (Just moduleName) (Op name), pos, fixity)]
100+ collect (PositionedDeclaration pos _ (FixityDeclaration fixity name alias)) =
101+ [(Qualified (Just moduleName) (Op name), pos, fixity, alias)]
96 collect FixityDeclaration{} = internalError "Fixity without srcpos info"
102 collect FixityDeclaration{} = internalError "Fixity without srcpos info"
97 collect _ = []
103 collect _ = []