on 2d29699 help sign in
elk/src/AST/Module.hs
154 lines 3.7 kB history raw
1module AST.Module
2 ( Interfaces
3 , Types, Aliases, ADTs
4 , AdtInfo, CanonicalAdt
5 , SourceModule, ValidModule, CanonicalModule, Optimized
6 , Module(..), Body(..)
7 , Header(..)
8 , Interface(..), toInterface
9 , UserImport, DefaultImport, ImportMethod(..)
10 ) where
12import Control.Applicative ((<$>),(<*>))
13import Data.Binary
14import qualified Data.Map as Map
16import qualified AST.Declaration as Decl
17import qualified AST.Expression.Canonical as Canonical
18import qualified AST.Expression.Optimized as Optimized
19import qualified AST.Module.Name as Name
20import qualified AST.Type as Type
21import qualified AST.Variable as Var
22import qualified Docs.AST as Docs
23import qualified Elm.Package as Package
24import qualified Elm.Compiler.Version as Compiler
25import qualified Reporting.Annotation as A
28-- HELPFUL TYPE ALIASES
30type Interfaces = Map.Map Name.Canonical Interface
32type Types = Map.Map String Type.Canonical
33type Aliases = Map.Map String ([String], Type.Canonical)
34type ADTs = Map.Map String (AdtInfo String)
36type AdtInfo v = ( [String], [(v, [Type.Canonical])] )
37type CanonicalAdt = (Var.Canonical, AdtInfo Var.Canonical)
40-- MODULES
42type SourceModule =
43 Module
44 String
45 [UserImport]
46 (Var.Listing (A.Located Var.Value))
47 [Decl.SourceDecl]
50type ValidModule =
51 Module
52 String
53 ([DefaultImport], [UserImport])
54 (Var.Listing (A.Located Var.Value))
55 [Decl.ValidDecl]
58type CanonicalModule =
59 Module Docs.Centralized [Name.Raw] [Var.Value] (Body Canonical.Expr)
62type Optimized =
63 [Optimized.Def]
66data Module docs imports exports body = Module
67 { name :: Name.Canonical
68 , path :: FilePath
69 , docs :: A.Located (Maybe docs)
70 , exports :: exports
71 , imports :: imports
72 , body :: body
73 }
76data Body expr = Body
77 { program :: expr
78 , types :: Types
79 , fixities :: [(Decl.Assoc, Int, String)]
80 , aliases :: Aliases
81 , datatypes :: ADTs
82 , ports :: [String]
83 }
86-- HEADERS
88{-| Basic info needed to identify modules and determine dependencies. -}
89data Header imports = Header
90 { _name :: Name.Raw
91 , _docs :: A.Located (Maybe String)
92 , _exports :: Var.Listing (A.Located Var.Value)
93 , _imports :: imports
94 }
97-- IMPORTs
99type UserImport = A.Located (Name.Raw, ImportMethod)
102type DefaultImport = (Name.Raw, ImportMethod)
105data ImportMethod = ImportMethod
106 { alias :: Maybe String
107 , exposedVars :: !(Var.Listing Var.Value)
108 }
111-- INTERFACES
113{-| Key facts about a module, used when reading info from .elmi files. -}
114data Interface = Interface
115 { iVersion :: Package.Version
116 , iPackage :: Package.Name
117 , iExports :: [Var.Value]
118 , iTypes :: Types
119 , iImports :: [Name.Raw]
120 , iAdts :: ADTs
121 , iAliases :: Aliases
122 , iFixities :: [(Decl.Assoc, Int, String)]
123 , iPorts :: [String]
124 }
127toInterface :: Package.Name -> CanonicalModule -> Interface
128toInterface pkgName modul =
129 let body' = body modul in
130 Interface
131 { iVersion = Compiler.version
132 , iPackage = pkgName
133 , iExports = exports modul
134 , iTypes = types body'
135 , iImports = imports modul
136 , iAdts = datatypes body'
137 , iAliases = aliases body'
138 , iFixities = fixities body'
139 , iPorts = ports body'
140 }
143instance Binary Interface where
144 get = Interface <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
145 put modul = do
146 put (iVersion modul)
147 put (iPackage modul)
148 put (iExports modul)
149 put (iTypes modul)
150 put (iImports modul)
151 put (iAdts modul)
152 put (iAliases modul)
153 put (iFixities modul)
154 put (iPorts modul)