on 455dcb2 help sign in
elk/src/AST/Module.hs
219 lines 4.2 kB history raw
1module AST.Module
2 ( Header(..), Module(..), Tag(..)
4 , Source, SourceInfo(..)
5 , Valid, ValidInfo(..)
6 , Canonical, Optimized, Info(..)
8 , UserImport, DefaultImport, ImportMethod(..)
10 , Effects(..)
11 , Types
12 , Aliases
13 , Unions, UnionInfo, CanonicalUnion
15 , Interfaces, Interface(..), toInterface
16 )
17 where
19import Data.Binary
20import qualified Data.Map as Map
22import qualified AST.Declaration as Decl
23import qualified AST.Expression.Canonical as Canonical
24import qualified AST.Expression.Optimized as Optimized
25import qualified AST.Expression.Valid as Valid
26import qualified AST.Module.Name as Name
27import qualified AST.Type as Type
28import qualified AST.Variable as Var
29import qualified Docs.AST as Docs
30import qualified Elm.Package as Package
31import qualified Elm.Compiler.Version as Compiler
32import qualified Reporting.Annotation as A
36-- HEADERS FOR PARSING
39{-| Basic info needed to identify modules and determine dependencies. -}
40data Header imports =
41 Header
42 { _tag :: Tag
43 , _name :: Name.Raw
44 , _docs :: A.Located (Maybe String)
45 , _exports :: Var.Listing (A.Located Var.Value)
46 , _imports :: imports
47 }
51-- MODULES
54data Module phase =
55 Module
56 { tag :: Tag
57 , name :: Name.Canonical
58 , path :: FilePath
59 , info :: phase
60 }
63data Tag
64 = None
65 | Effect
66 | Foreign
69type Source =
70 Module SourceInfo
73data SourceInfo =
74 Source
75 { srcDocs :: A.Located (Maybe String)
76 , srcExports :: Var.Listing (A.Located Var.Value)
77 , srcImports :: [UserImport]
78 , srcDecls :: [Decl.Source]
79 }
82type Valid =
83 Module ValidInfo
86data ValidInfo =
87 Valid
88 { validDocs :: A.Located (Maybe String)
89 , validExports :: Var.Listing (A.Located Var.Value)
90 , validImports :: ([DefaultImport], [UserImport])
91 , validDecls :: [Decl.Valid]
92 , validCmds :: [A.Commented Valid.Effect]
93 , validSubs :: [A.Commented Valid.Effect]
94 }
97type Canonical =
98 Module (Info Canonical.Expr)
101type Optimized =
102 Module (Info [Optimized.Def])
106-- IMPORTS
109type UserImport = A.Located (Name.Raw, ImportMethod)
112type DefaultImport = (Name.Raw, ImportMethod)
115data ImportMethod =
116 ImportMethod
117 { alias :: Maybe String
118 , exposedVars :: !(Var.Listing Var.Value)
119 }
123-- LATE PHASE MODULE INFORMATION
126data Info expr =
127 Info
128 { docs :: Docs.Centralized
129 , exports :: [Var.Value]
130 , imports :: [Name.Raw]
131 , program :: expr
132 , types :: Types
133 , fixities :: [(Decl.Assoc, Int, String)]
134 , aliases :: Aliases
135 , unions :: Unions
136 , effects :: Effects
137 }
140type Types =
141 Map.Map String Type.Canonical
144type Aliases =
145 Map.Map String ([String], Type.Canonical)
148type Unions =
149 Map.Map String (UnionInfo String)
152type UnionInfo v =
153 ( [String], [(v, [Type.Canonical])] )
156type CanonicalUnion =
157 ( Var.Canonical, UnionInfo Var.Canonical )
160data Effects =
161 Effects
162 { cmds :: [String]
163 , subs :: [String]
164 }
168-- INTERFACES
171type Interfaces =
172 Map.Map Name.Canonical Interface
175{-| Key facts about a module, used when reading info from .elmi files. -}
176data Interface =
177 Interface
178 { iVersion :: Package.Version
179 , iPackage :: Package.Name
180 , iExports :: [Var.Value]
181 , iImports :: [Name.Raw]
182 , iTypes :: Types
183 , iUnions :: Unions
184 , iAliases :: Aliases
185 , iFixities :: [(Decl.Assoc, Int, String)]
186 }
189toInterface :: Package.Name -> Optimized -> Interface
190toInterface pkgName modul =
191 let
192 myInfo =
193 info modul
194 in
195 Interface
196 { iVersion = Compiler.version
197 , iPackage = pkgName
198 , iExports = exports myInfo
199 , iImports = imports myInfo
200 , iTypes = types myInfo
201 , iUnions = unions myInfo
202 , iAliases = aliases myInfo
203 , iFixities = fixities myInfo
204 }
207instance Binary Interface where
208 get =
209 Interface <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
211 put modul =
212 do put (iVersion modul)
213 put (iPackage modul)
214 put (iExports modul)
215 put (iImports modul)
216 put (iTypes modul)
217 put (iUnions modul)
218 put (iAliases modul)
219 put (iFixities modul)