on 0137452 help sign in
elk/src/AST/Module.hs
183 lines 3.7 kB history raw
1module AST.Module
2 ( Interfaces
3 , Types, Aliases, Unions
4 , UnionInfo, CanonicalUnion
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 Unions =
44 Map.Map String (UnionInfo String)
47type UnionInfo v =
48 ( [String], [(v, [Type.Canonical])] )
51type CanonicalUnion =
52 ( Var.Canonical, UnionInfo 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 , unions :: Unions
101 }
105-- HEADERS
108{-| Basic info needed to identify modules and determine dependencies. -}
109data Header imports =
110 Header
111 { _name :: Name.Raw
112 , _docs :: A.Located (Maybe String)
113 , _exports :: Var.Listing (A.Located Var.Value)
114 , _imports :: imports
115 }
119-- IMPORTs
122type UserImport = A.Located (Name.Raw, ImportMethod)
125type DefaultImport = (Name.Raw, ImportMethod)
128data ImportMethod =
129 ImportMethod
130 { alias :: Maybe String
131 , exposedVars :: !(Var.Listing Var.Value)
132 }
136-- INTERFACES
139{-| Key facts about a module, used when reading info from .elmi files. -}
140data Interface =
141 Interface
142 { iVersion :: Package.Version
143 , iPackage :: Package.Name
144 , iExports :: [Var.Value]
145 , iTypes :: Types
146 , iImports :: [Name.Raw]
147 , iUnions :: Unions
148 , iAliases :: Aliases
149 , iFixities :: [(Decl.Assoc, Int, String)]
150 }
153toInterface :: Package.Name -> Optimized -> Interface
154toInterface pkgName modul =
155 let
156 body' =
157 body modul
158 in
159 Interface
160 { iVersion = Compiler.version
161 , iPackage = pkgName
162 , iExports = exports modul
163 , iTypes = types body'
164 , iImports = imports modul
165 , iUnions = unions body'
166 , iAliases = aliases body'
167 , iFixities = fixities body'
168 }
171instance Binary Interface where
172 get =
173 Interface <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
175 put modul =
176 do put (iVersion modul)
177 put (iPackage modul)
178 put (iExports modul)
179 put (iTypes modul)
180 put (iImports modul)
181 put (iUnions modul)
182 put (iAliases modul)
183 put (iFixities modul)