PageRenderTime 26ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/coredumper/compilepackage.hs

https://github.com/khskrede/mehh
Haskell | 300 lines | 186 code | 75 blank | 39 comment | 0 complexity | 3bd380b48caa3d807b4c5baeaaec17b0 MD5 | raw file
  1. -- GHC API stuff
  2. import GHC
  3. import GHC.Paths ( libdir )
  4. import UniqFM
  5. import Unique
  6. import HscTypes
  7. import CoreSyn
  8. import DynFlags
  9. import Outputable
  10. import Module
  11. -- Cabal stuff
  12. import Distribution.Simple
  13. import qualified Distribution.PackageDescription as PD
  14. import Distribution.PackageDescription.Parse
  15. import Distribution.PackageDescription.Configuration
  16. import Distribution.Verbosity
  17. import Distribution.Simple.Utils
  18. import qualified Distribution.ModuleName as ModName
  19. import qualified Language.Haskell.Extension as LHE
  20. -- JSON
  21. import Text.JSON
  22. import Text.JSON.Pretty
  23. import Text.JSON.Generic
  24. import Text.PrettyPrint.HughesPJ
  25. -- Other
  26. import System.Environment ( getArgs )
  27. -- Input file is cabal file
  28. main = do
  29. (inFile1:_) <- getArgs
  30. -- Parse cabal file
  31. desc <- readPackageDescription normal inFile1
  32. let
  33. -- TODO: Can we flatten like this?
  34. packageDescription = flattenPackageDescription desc
  35. -- Get DynFlags
  36. dflags <- runGhc (Just libdir) $ do
  37. getSessionDynFlags
  38. -- Set GHC Mode
  39. let
  40. dflags2 = dflags{ ghcMode = CompManager }
  41. -- _______________________________________
  42. -- Set package name and version from cabal file
  43. -- to DynFlags
  44. let
  45. -- Get package name and version
  46. pkgid = PD.package packageDescription
  47. pkgname = pkgNameToString $ pkgName pkgid where
  48. pkgNameToString (PackageName a) = a
  49. pkgversion = pkgVersion pkgid
  50. dflags3 = dflags2{thisPackage=stringToPackageId pkgname}
  51. putStrLn ("Compiling package: " ++ pkgname)
  52. putStrLn ""
  53. -- _______________________________________
  54. -- Add extension flags from cabal file to DynFlags
  55. let
  56. -- Get ghc flags from cabal file and convert to
  57. -- ExtensionFlags for use with the GHC API
  58. buildinfo = PD.allBuildInfo packageDescription
  59. extensions = foldl (++) [] (map PD.allExtensions buildinfo)
  60. extflags = extsToExtFlags extensions
  61. dflags4 = foldl xopt_set dflags3 extflags
  62. -- _______________________________________
  63. -- Set dependencies from cabal file to DynFlags
  64. let
  65. -- Get package dependency names
  66. deps = PD.buildDepends packageDescription
  67. depnames = map f deps where
  68. f (Dependency (PackageName n) _) = n
  69. pkgflags = map HidePackage depnames
  70. dflags5 = dflags4--{packageFlags=pkgflags}
  71. -- _______________________________________
  72. -- Set include dir
  73. let
  74. incs = foldl (++) [] (map PD.includeDirs buildinfo)
  75. dflags6 = dflags5{ importPaths=incs }
  76. --libraryPaths=["../../"] }
  77. putStrLn $ show incs
  78. putStrLn ""
  79. putStrLn ""
  80. -- _______________________________________
  81. -- Create list of Haskell module file names to be compiled
  82. let prel = ["./"] ++ (map ((++) "../") depnames)
  83. mods = PD.exposedModules $ getLib $ PD.library $ packageDescription
  84. paths = map ModName.toFilePath mods
  85. fsearch <- mapM (findModuleFile prel ["hs", "lhs", "hsc"]) mods
  86. let files = map getFilePath fsearch
  87. putStrLn $ show $ files --paths
  88. putStrLn ""
  89. putStrLn ""
  90. -- _______________________________________
  91. --
  92. -- Compile all Haskell modules
  93. mapM (compile dflags6) files
  94. getFilePath :: (String, String) -> String
  95. getFilePath (a, b) = a++b
  96. -- _______________________________________________________
  97. --
  98. -- Convert cabal info into GHC API Types
  99. getLib :: Maybe PD.Library -> PD.Library
  100. getLib Nothing = error "NOTHING!"
  101. getLib (Just a) = a
  102. extsToExtFlags :: [Extension] -> [ExtensionFlag]
  103. extsToExtFlags = (map extToExtFlag) . func
  104. where
  105. func :: [Extension] -> [KnownExtension]
  106. func [] = []
  107. func ((EnableExtension a):xs) = a:(func xs)
  108. func ((DisableExtension a):xs) = a:(func xs)
  109. func ((UnknownExtension a):xs) = error a
  110. extToExtFlag :: LHE.KnownExtension -> ExtensionFlag
  111. extToExtFlag LHE.OverlappingInstances = Opt_OverlappingInstances
  112. extToExtFlag LHE.UndecidableInstances = Opt_UndecidableInstances
  113. extToExtFlag LHE.IncoherentInstances = Opt_IncoherentInstances
  114. extToExtFlag LHE.DoRec = Opt_DoRec
  115. extToExtFlag LHE.RecursiveDo = Opt_RecursiveDo
  116. extToExtFlag LHE.ParallelListComp = Opt_ParallelListComp
  117. extToExtFlag LHE.MultiParamTypeClasses = Opt_MultiParamTypeClasses
  118. extToExtFlag LHE.MonomorphismRestriction = Opt_MonomorphismRestriction
  119. extToExtFlag LHE.FunctionalDependencies = Opt_FunctionalDependencies
  120. extToExtFlag LHE.Rank2Types = Opt_Rank2Types
  121. extToExtFlag LHE.RankNTypes = Opt_RankNTypes
  122. extToExtFlag LHE.PolymorphicComponents = Opt_PolymorphicComponents
  123. extToExtFlag LHE.ExistentialQuantification = Opt_ExistentialQuantification
  124. extToExtFlag LHE.ScopedTypeVariables = Opt_ScopedTypeVariables
  125. extToExtFlag LHE.PatternSignatures = Opt_DefaultSignatures -- error "Opt_PatternSignatures"
  126. extToExtFlag LHE.ImplicitParams = Opt_ImplicitParams
  127. extToExtFlag LHE.FlexibleContexts = Opt_FlexibleContexts
  128. extToExtFlag LHE.FlexibleInstances = Opt_FlexibleInstances
  129. extToExtFlag LHE.EmptyDataDecls = Opt_EmptyDataDecls
  130. extToExtFlag LHE.CPP = Opt_Cpp
  131. extToExtFlag LHE.KindSignatures = Opt_KindSignatures
  132. extToExtFlag LHE.BangPatterns = Opt_BangPatterns
  133. extToExtFlag LHE.TypeSynonymInstances = Opt_TypeSynonymInstances
  134. extToExtFlag LHE.TemplateHaskell = Opt_TemplateHaskell
  135. extToExtFlag LHE.ForeignFunctionInterface = Opt_ForeignFunctionInterface
  136. extToExtFlag LHE.Arrows = Opt_Arrows
  137. extToExtFlag LHE.Generics = error "Opt_Generics"
  138. extToExtFlag LHE.ImplicitPrelude = Opt_ImplicitPrelude
  139. extToExtFlag LHE.NamedFieldPuns = error "Opt_NamedFieldPuns"
  140. extToExtFlag LHE.PatternGuards = Opt_PatternGuards
  141. extToExtFlag LHE.GeneralizedNewtypeDeriving = Opt_GeneralizedNewtypeDeriving
  142. extToExtFlag LHE.ExtensibleRecords = error "Opt_ExtensibleRecords"
  143. extToExtFlag LHE.RestrictedTypeSynonyms = error "Opt_RestrictedTypeSynonyms"
  144. extToExtFlag LHE.HereDocuments = error "Opt_HereDocuments"
  145. extToExtFlag LHE.MagicHash = Opt_MagicHash
  146. extToExtFlag LHE.TypeFamilies = Opt_TypeFamilies
  147. extToExtFlag LHE.StandaloneDeriving = Opt_StandaloneDeriving
  148. extToExtFlag LHE.UnicodeSyntax = Opt_UnicodeSyntax
  149. extToExtFlag LHE.UnliftedFFITypes = Opt_UnliftedFFITypes
  150. extToExtFlag LHE.LiberalTypeSynonyms = Opt_LiberalTypeSynonyms
  151. extToExtFlag LHE.TypeOperators = Opt_TypeOperators
  152. extToExtFlag LHE.RecordWildCards = Opt_RecordWildCards
  153. extToExtFlag LHE.RecordPuns = Opt_RecordPuns
  154. extToExtFlag LHE.DisambiguateRecordFields = Opt_DisambiguateRecordFields
  155. extToExtFlag LHE.OverloadedStrings = Opt_OverloadedStrings
  156. extToExtFlag LHE.GADTs = Opt_GADTs
  157. extToExtFlag LHE.MonoPatBinds = Opt_MonoPatBinds
  158. extToExtFlag LHE.RelaxedPolyRec = Opt_RelaxedPolyRec
  159. extToExtFlag LHE.ExtendedDefaultRules = Opt_ExtendedDefaultRules
  160. extToExtFlag LHE.UnboxedTuples = Opt_UnboxedTuples
  161. extToExtFlag LHE.DeriveDataTypeable = Opt_DeriveDataTypeable
  162. extToExtFlag LHE.ConstrainedClassMethods = Opt_ConstrainedClassMethods
  163. extToExtFlag LHE.PackageImports = Opt_PackageImports
  164. extToExtFlag LHE.ImpredicativeTypes = Opt_ImpredicativeTypes
  165. extToExtFlag LHE.NewQualifiedOperators = error "Opt_NewQualifiedOperators"
  166. extToExtFlag LHE.PostfixOperators = Opt_PostfixOperators
  167. extToExtFlag LHE.QuasiQuotes = Opt_QuasiQuotes
  168. extToExtFlag LHE.TransformListComp = Opt_TransformListComp
  169. extToExtFlag LHE.ViewPatterns = Opt_ViewPatterns
  170. extToExtFlag LHE.XmlSyntax = error "Opt_XmlSyntax"
  171. extToExtFlag LHE.RegularPatterns = error "Opt_RegularPatterns"
  172. extToExtFlag LHE.TupleSections = Opt_TupleSections
  173. extToExtFlag LHE.GHCForeignImportPrim = Opt_GHCForeignImportPrim
  174. extToExtFlag LHE.NPlusKPatterns = Opt_NPlusKPatterns
  175. extToExtFlag LHE.DoAndIfThenElse = Opt_DoAndIfThenElse
  176. extToExtFlag LHE.RebindableSyntax = Opt_RebindableSyntax
  177. extToExtFlag LHE.ExplicitForAll = Opt_ExplicitForAll
  178. extToExtFlag LHE.DatatypeContexts = Opt_DatatypeContexts
  179. extToExtFlag LHE.MonoLocalBinds = Opt_MonoLocalBinds
  180. extToExtFlag LHE.DeriveFunctor = Opt_DeriveFunctor
  181. extToExtFlag LHE.DeriveTraversable = Opt_DeriveTraversable
  182. extToExtFlag LHE.DeriveFoldable = Opt_DeriveFoldable
  183. -- _______________________________________________________
  184. --
  185. -- Compile to Core and Generate JSCore for single Haskell file
  186. compile dflags inFile = do
  187. core <- runGhc (Just libdir) $ do
  188. setSessionDynFlags dflags
  189. core <- compileToCoreSimplified inFile
  190. return core
  191. putStrLn $ show $ pp_value $ coreModToJS core
  192. putStrLn "bleh"
  193. coreModToJS :: CoreModule -> JSValue
  194. coreModToJS (CoreModule name types binds) =
  195. JSObject $ toJSObject $
  196. [( "%module", toJSON $ showSDoc $ ppr name )]--,
  197. -- ( "tdefg", typesToJS types),
  198. -- ( "binds", bindsToJS binds)]
  199. typesToJS :: TypeEnv -> JSValue
  200. typesToJS p = JSObject $ toJSObject $ map func $ ufmToList p
  201. where
  202. func :: (Unique, TyThing) -> (String, JSValue)
  203. -- TODO: Generate proper JSON values
  204. func (a, b) = ( showSDoc $ ppr a, toJSON $ showSDoc $ ppr b)
  205. bindsToJS :: CoreProgram -> JSValue
  206. bindsToJS progs = JSObject $ toJSObject $ map f $ progs
  207. where
  208. f :: CoreBind -> (String, JSValue)
  209. f (NonRec b expr) = ("NonRec" , corebindToJS (b, expr))
  210. f (Rec list) = ("Rec", JSArray $ map corebindToJS list)
  211. corebindToJS :: (CoreBndr, (Expr CoreBndr)) -> JSValue
  212. corebindToJS (a, b) = JSObject $ toJSObject $ [(show a, exprToJS b)]
  213. -- BINDERS
  214. -- EXPRESSIONS
  215. exprToJS :: Expr b -> JSValue
  216. exprToJS (Var a) = toJSON a
  217. exprToJS (Lit a) = toJSON "Lit"
  218. exprToJS (App a b) = toJSON "App"
  219. exprToJS (Lam a b) = JSArray [toJSON "Lam", exprToJS b]
  220. exprToJS (Let a b) = toJSON "Let"
  221. exprToJS (Case a b c d) = toJSON "Case"
  222. exprToJS (Cast a b) = toJSON "Cast"
  223. exprToJS (Tick a b) = toJSON "Tick"
  224. exprToJS (Type a) = toJSON "Type"
  225. exprToJS (Coercion a) = toJSON "Coercion"