module HsDev.Symbols.HaskellNames (
ToEnvironment(..),
fromSymbol, toSymbol
) where
import Control.Lens (view)
import Data.String
import qualified Data.Map.Strict as M
import qualified Data.Text as T (unpack)
import qualified Language.Haskell.Exts as H
import qualified Language.Haskell.Names as N
import HsDev.Symbols.Types
class ToEnvironment a where
environment :: a -> N.Environment
instance ToEnvironment Module where
environment m = M.singleton (H.ModuleName () (T.unpack $ view sourcedName m)) (map toSymbol $ view moduleExports m)
instance ToEnvironment [Module] where
environment = M.unions . map environment
fromSymbol :: N.Symbol -> Symbol
fromSymbol s = Symbol sid Nothing Nothing info where
sid = SymbolId (fromName_ $ N.symbolName s) mid
mid = case N.symbolModule s of
H.ModuleName _ m -> ModuleId (fromString m) NoLocation
info = case s of
N.Value _ _ -> Function mempty
N.Method _ _ p -> Method mempty (fromName_ p)
N.Selector _ _ p cs -> Selector mempty (fromName_ p) (map fromName_ cs)
N.Constructor _ _ p -> Constructor mempty (fromName_ p)
N.Type _ _ -> Type mempty mempty
N.NewType _ _ -> NewType mempty mempty
N.Data _ _ -> Data mempty mempty
N.Class _ _ -> Class mempty mempty
N.TypeFam _ _ a -> TypeFam mempty mempty (fmap fromName_ a)
N.DataFam _ _ a -> DataFam mempty mempty (fmap fromName_ a)
N.PatternConstructor _ _ p -> PatConstructor mempty (fmap fromName_ p)
N.PatternSelector _ _ p c -> PatSelector mempty (fmap fromName_ p) (fromName_ c)
toSymbol :: Symbol -> N.Symbol
toSymbol s = case view symbolInfo s of
Function _ -> N.Value m n
Method _ p -> N.Method m n (toName_ p)
Selector _ p cs -> N.Selector m n (toName_ p) (map toName_ cs)
Constructor _ p -> N.Constructor m n (toName_ p)
Type _ _ -> N.Type m n
NewType _ _ -> N.NewType m n
Data _ _ -> N.Data m n
Class _ _ -> N.Class m n
TypeFam _ _ a -> N.TypeFam m n (fmap toName_ a)
DataFam _ _ a -> N.DataFam m n (fmap toName_ a)
PatConstructor _ p -> N.PatternConstructor m n (fmap toName_ p)
PatSelector _ p c -> N.PatternSelector m n (fmap toName_ p) (toName_ c)
where
m = toModuleName_ $ view sourcedModuleName s
n = toName_ $ view sourcedName s