on 1305883 help sign in
elk/src/AST/Module.hs
187 lines 3.8 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 Data.Binary
13import qualified Data.Map as Map
15import qualified AST.Declaration as Decl
16import qualified AST.Expression.Canonical as Canonical
17import qualified AST.Expression.Optimized as Optimized
18import qualified AST.Module.Name as Name
19import qualified AST.Type as Type
20import qualified AST.Variable as Var
21import qualified Docs.AST as Docs
22import qualified Elm.Package as Package
23import qualified Elm.Compiler.Version as Compiler
24import qualified Reporting.Annotation as A
28-- HELPFUL TYPE ALIASES
31type Interfaces =
32 Map.Map Name.Canonical Interface
35type Types =
36 Map.Map String Type.Canonical
39type Aliases =
40 Map.Map String ([String], Type.Canonical)
43type ADTs =
44 Map.Map String (AdtInfo String)
47type AdtInfo v =
48 ( [String], [(v, [Type.Canonical])] )
51type CanonicalAdt =
52 ( Var.Canonical, AdtInfo Var.Canonical )
56-- MODULES
59type SourceModule =
60 Module
61 String
62 [UserImport]
63 (Var.Listing (A.Located Var.Value))
64 [Decl.SourceDecl]
67type ValidModule =
68 Module
69 String
70 ([DefaultImport], [UserImport])
71 (Var.Listing (A.Located Var.Value))
72 [Decl.ValidDecl]
75type CanonicalModule =
76 Module Docs.Centralized [Name.Raw] [Var.Value] (Body Canonical.Expr)
79type Optimized =
80 Module Docs.Centralized [Name.Raw] [Var.Value] (Body [Optimized.Def])
83data Module docs imports exports body =
84 Module
85 { name :: Name.Canonical
86 , path :: FilePath
87 , docs :: A.Located (Maybe docs)
88 , exports :: exports
89 , imports :: imports
90 , body :: body
91 }
94data Body expr =
95 Body
96 { program :: expr
97 , types :: Types
98 , fixities :: [(Decl.Assoc, Int, String)]
99 , aliases :: Aliases
100 , datatypes :: ADTs
101 , ports :: [String]
102 }
106-- HEADERS
109{-| Basic info needed to identify modules and determine dependencies. -}
110data Header imports =
111 Header
112 { _name :: Name.Raw
113 , _docs :: A.Located (Maybe String)
114 , _exports :: Var.Listing (A.Located Var.Value)
115 , _imports :: imports
116 }
120-- IMPORTs
123type UserImport = A.Located (Name.Raw, ImportMethod)
126type DefaultImport = (Name.Raw, ImportMethod)
129data ImportMethod =
130 ImportMethod
131 { alias :: Maybe String
132 , exposedVars :: !(Var.Listing Var.Value)
133 }
137-- INTERFACES
140{-| Key facts about a module, used when reading info from .elmi files. -}
141data Interface =
142 Interface
143 { iVersion :: Package.Version
144 , iPackage :: Package.Name
145 , iExports :: [Var.Value]
146 , iTypes :: Types
147 , iImports :: [Name.Raw]
148 , iAdts :: ADTs
149 , iAliases :: Aliases
150 , iFixities :: [(Decl.Assoc, Int, String)]
151 , iPorts :: [String]
152 }
155toInterface :: Package.Name -> Optimized -> Interface
156toInterface pkgName modul =
157 let
158 body' =
159 body modul
160 in
161 Interface
162 { iVersion = Compiler.version
163 , iPackage = pkgName
164 , iExports = exports modul
165 , iTypes = types body'
166 , iImports = imports modul
167 , iAdts = datatypes body'
168 , iAliases = aliases body'
169 , iFixities = fixities body'
170 , iPorts = ports body'
171 }
174instance Binary Interface where
175 get =
176 Interface <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
178 put modul =
179 do put (iVersion modul)
180 put (iPackage modul)
181 put (iExports modul)
182 put (iTypes modul)
183 put (iImports modul)
184 put (iAdts modul)
185 put (iAliases modul)
186 put (iFixities modul)
187 put (iPorts modul)