blob: 3bf9f67081900806bcb28e5a349835cb28db31db [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
external-reality7d1190e2014-03-04 23:14:16 -050035 ParseOk ast -> show $ prettyLambdaArgs ast
external-reality8f34d232014-02-22 21:35:47 -050036 _ -> "[]"
external-realitya950a5f2014-03-04 22:15:27 -050037 where
38 prettyLambdaArgs = trim
39 . takeWhile (/= '-')
40 . dropWhile (== '\\')
41 . prettyPrint
external-reality8f34d232014-02-22 21:35:47 -050042
43------------------------------------------------------------------------------
external-reality8f34d232014-02-22 21:35:47 -050044allVariables :: 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
external-realitya950a5f2014-03-04 22:15:27 -050091
92
93------------------------------------------------------------------------------
94
95trim :: [Char] -> [Char]
96trim xs = dropSpaceTail "" $ dropWhile isSpace xs
97
98dropSpaceTail :: [Char] -> [Char] -> [Char]
99dropSpaceTail _ "" = ""
100dropSpaceTail maybeStuff (x:xs)
101 | isSpace x = dropSpaceTail (x:maybeStuff) xs
102 | null maybeStuff = x : dropSpaceTail "" xs
103 | otherwise = reverse maybeStuff ++ x : dropSpaceTail "" xs
104