on fe1e5d2 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
33import qualified Reporting.Region as R
37-- HEADERS FOR PARSING
40{-| Basic info needed to identify modules and determine dependencies. -}
41data Header imports =
42 Header
43 { _tag :: Tag
44 , _name :: Name.Raw
45 , _docs :: A.Located (Maybe String)
46 , _exports :: Var.Listing (A.Located Var.Value)
47 , _imports :: imports
48 }
52-- MODULES
55data Module phase =
56 Module
57 { tag :: Tag
58 , name :: Name.Canonical
59 , path :: FilePath
60 , info :: phase
61 }
64data Tag
65 = None
66 | Effect R.Region
67 | Foreign R.Region
70type Source =
71 Module SourceInfo
74data SourceInfo =
75 Source
76 { srcDocs :: A.Located (Maybe String)
77 , srcExports :: Var.Listing (A.Located Var.Value)
78 , srcImports :: [UserImport]
79 , srcDecls :: [Decl.Source]
80 }
83type Valid =
84 Module ValidInfo
87data ValidInfo =
88 Valid
89 { validDocs :: A.Located (Maybe String)
90 , validExports :: Var.Listing (A.Located Var.Value)
91 , validImports :: ([DefaultImport], [UserImport])
92 , validDecls :: [Decl.Valid]
93 , validEffects :: Valid.Effects
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 :: A.Located (Maybe 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)