2Module : IRTS.JavaScript.LangTransforms
3Description : The JavaScript LDecl Transformations.
6Maintainer : The Idris Community.
8{-# LANGUAGE DeriveDataTypeable, OverloadedStrings, StandaloneDeriving #-}
10module IRTS.JavaScript.LangTransforms( removeDeadCode
16import Data.Map.Strict (Map)
17import qualified Data.Map.Strict as Map
20import qualified Data.Set as Set
21import Idris.Core.CaseTree
26import Data.Generics.Uniplate.Data
28deriving instance Typeable FDesc
29deriving instance Data FDesc
30deriving instance Typeable LVar
31deriving instance Data LVar
32deriving instance Typeable PrimFn
33deriving instance Data PrimFn
34deriving instance Typeable CaseType
35deriving instance Data CaseType
36deriving instance Typeable LExp
37deriving instance Data LExp
38deriving instance Typeable LDecl
39deriving instance Data LDecl
40deriving instance Typeable LOpt
41deriving instance Data LOpt
44restrictKeys :: Ord k => Map k a -> Set k -> Map k a
45restrictKeys m s = Map.filterWithKey (\k _ -> k `Set.member` s) m
47extractGlobs :: Map Name LDecl -> LDecl -> [Name]
48extractGlobs defs (LConstructor _ _ _) = []
49extractGlobs defs (LFun _ _ _ e) =
51 f (LLazyApp x _) = Just x
53 in [x | Just x <- map f $ universe e, Map.member x defs]
55usedFunctions :: Map Name LDecl -> Set Name -> [Name] -> [Name]
56usedFunctions _ _ [] = []
57usedFunctions alldefs done names =
58 let decls = catMaybes $ map (\x -> Map.lookup x alldefs) names
59 used_names = (nub $ concat $ map (extractGlobs alldefs) decls) \\ names
60 new_names = filter (\x -> not $ Set.member x done) used_names
61 in used_names ++ usedFunctions alldefs (Set.union done $ Set.fromList new_names) new_names
64usedDecls :: Map Name LDecl -> [Name] -> Map Name LDecl
66 let used = reverse $ start ++ usedFunctions dcls (Set.fromList start) start
67 in restrictKeys dcls (Set.fromList used)
69getUsedConstructors :: Map Name LDecl -> Set Name
70getUsedConstructors x = Set.fromList [ n | LCon _ _ n _ <- universeBi x]
72removeUnusedBranches :: Set Name -> Map Name LDecl -> Map Name LDecl
73removeUnusedBranches used x =
77 f ((LConCase x n y z):r) =
78 if Set.member n used then ((LConCase x n y z):r)
82removeDeadCode :: Map Name LDecl -> [Name] -> Map Name LDecl
83removeDeadCode dcls start =
84 let used = usedDecls dcls start
85 remCons = removeUnusedBranches (getUsedConstructors used) used
86 in if Map.keys remCons == Map.keys dcls then remCons
87 else removeDeadCode remCons start
90globlToCon :: Map Name LDecl -> Map Name LDecl
94 f :: Map Name LDecl -> LExp -> LExp
96 case Map.lookup n y of
97 Just (LConstructor _ conId arity) -> LCon Nothing conId n []
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list