blob: 93b73818665a8e09fb8f92db929bab52cb2dfe85 [file] [log] [blame]
external-reality8f34d232014-02-22 21:35:47 -05001module Lambda ( freeVariables
2 , lambdaArgs
3 , lambdaBody
4 ) where
5
6import Control.Monad
7import Data.Generics.Aliases
8import Data.Generics.Schemes
9import Data.List
external-realitya56f1152014-03-04 21:57:05 -050010import Data.Char
external-reality8f34d232014-02-22 21:35:47 -050011import Language.Haskell.Exts
12------------------------------------------------------------------------------
13import HDevTools
external-reality8f34d232014-02-22 21:35:47 -050014
15------------------------------------------------------------------------------
external-realitya56f1152014-03-04 21:57:05 -050016freeVariables :: FilePath -> FilePath -> FilePath -> String -> String -> IO String
17freeVariables srcPath pkgConfigPath cabalFilePath buildTargetName code = case parseExp code of
external-reality8f34d232014-02-22 21:35:47 -050018 ParseOk ast -> do
19 names <- dropModuleVariableNames srcPath
20 pkgConfigPath
21 cabalFilePath
22 buildTargetName $ extractFreeVariables ast
23 return . dropCommas $ show names
24 _ -> return "Error parsing freeVars"
25
26------------------------------------------------------------------------------
27lambdaBody :: String -> String
28lambdaBody code = case parseExp code of
29 ParseOk ast -> show . extractLambdaBody $ ast
30 _ -> "[]"
31
32------------------------------------------------------------------------------
33lambdaArgs :: String -> String
34lambdaArgs code = case parseExp code of
35 ParseOk ast -> extractLambdaArgs ast
36 _ -> "[]"
37
38------------------------------------------------------------------------------
39extractLambdaArgs :: Exp -> String
40extractLambdaArgs (Lambda _ ast _) = dropCommas . show $ allNames ast
41extractLambdaArgs _ = "[]"
42
43------------------------------------------------------------------------------
44allVariables :: GenericQ [Exp]
45allVariables = listify isVar
46
47------------------------------------------------------------------------------
48allBindings :: GenericQ [Pat]
49allBindings = listify isBinding
50
51------------------------------------------------------------------------------
52allNames :: GenericQ [String]
53allNames = everything (++) ([] `mkQ` fmap (: []) getStringFromName)
54
55------------------------------------------------------------------------------
56isVar :: Exp -> Bool
57isVar (Var _) = True
58isVar _ = False
59
60------------------------------------------------------------------------------
61isBinding :: Pat -> Bool
62isBinding (PVar _) = True
63isBinding _ = False
64
65------------------------------------------------------------------------------
66getStringFromName :: Name -> String
67getStringFromName (Symbol str) = str
68getStringFromName (Ident str) = str
69
70------------------------------------------------------------------------------
71dropCommas :: String -> String
72dropCommas = filter (/= ',')
73
74------------------------------------------------------------------------------
75extractLambdaBody :: Exp -> String
76extractLambdaBody (Lambda _ _ ast) = prettyPrint ast
77extractLambdaBody _ = "[]"
78
79------------------------------------------------------------------------------
80extractFreeVariables :: GenericQ [String]
81extractFreeVariables ast = allNames (allVariables ast) \\
82 allNames (allBindings ast)
83
84------------------------------------------------------------------------------
85dropModuleVariableNames :: FilePath -> FilePath -> FilePath -> String -> [String] -> IO [String]
86dropModuleVariableNames srcPath pkgConfigPath cabalFilePath buildTargetName =
87 filterM $ (liftM not) . isInModuleScope srcPath
88 pkgConfigPath
89 cabalFilePath
90 buildTargetName