on 451e8f9 help sign in
elk/src/AST/Module.hs
226 lines 4.5 kB history raw
1module AST.Module
2 ( Header(..), Module(..)
4 , Source, SourceInfo(..), SourceTag(..), SourceSettings, emptySettings
5 , Valid, ValidInfo(..), ValidEffects(..)
6 , Canonical, Optimized, Info(..)
8 , UserImport, DefaultImport, ImportMethod(..)
10 , Types
11 , Aliases
12 , Unions, UnionInfo, CanonicalUnion
14 , Interfaces, Interface(..), toInterface
15 )
16 where
18import Data.Binary
19import qualified Data.Map as Map
21import qualified AST.Declaration as Decl
22import qualified AST.Expression.Canonical as Canonical
23import qualified AST.Expression.Optimized as Optimized
24import qualified AST.Module.Name as Name
25import qualified AST.Type as Type
26import qualified AST.Variable as Var
27import qualified Docs.AST as Docs
28import qualified Elm.Package as Package
29import qualified Elm.Compiler.Version as Compiler
30import qualified Reporting.Annotation as A
31import qualified Reporting.Region as R
35-- HEADERS FOR PARSING
38{-| Basic info needed to identify modules and determine dependencies. -}
39data Header imports =
40 Header
41 { _tag :: SourceTag
42 , _name :: Name.Raw
43 , _exports :: Var.Listing (A.Located Var.Value)
44 , _settings :: SourceSettings
45 , _docs :: A.Located (Maybe String)
46 , _imports :: imports
47 }
51-- MODULES
54data Module phase =
55 Module
56 { name :: Name.Canonical
57 , path :: FilePath
58 , info :: phase
59 }
62type Source =
63 Module SourceInfo
66data SourceInfo =
67 Source
68 { srcTag :: SourceTag
69 , srcSettings :: SourceSettings
70 , srcDocs :: A.Located (Maybe String)
71 , srcExports :: Var.Listing (A.Located Var.Value)
72 , srcImports :: [UserImport]
73 , srcDecls :: [Decl.Source]
74 }
77data SourceTag
78 = SrcNormal
79 | SrcEffect
80 | SrcForeign
83type SourceSettings =
84 A.Located [(A.Located String, A.Located String)]
87emptySettings :: SourceSettings
88emptySettings =
89 A.A (error "region of empty settings should not be needed") []
92type Valid =
93 Module ValidInfo
96data ValidInfo =
97 Valid
98 { validDocs :: A.Located (Maybe String)
99 , validExports :: Var.Listing (A.Located Var.Value)
100 , validImports :: ([DefaultImport], [UserImport])
101 , validDecls :: [Decl.Valid]
102 , validEffects :: ValidEffects
103 }
106data ValidEffects
107 = ValidNormal
108 | ValidEffect (Maybe (A.Located String)) (Maybe (A.Located String))
109 | ValidForeign
112type Canonical =
113 Module (Info Canonical.Expr)
116type Optimized =
117 Module (Info [Optimized.Def])
121-- IMPORTS
124type UserImport = A.Located (Name.Raw, ImportMethod)
127type DefaultImport = (Name.Raw, ImportMethod)
130data ImportMethod =
131 ImportMethod
132 { alias :: Maybe String
133 , exposedVars :: !(Var.Listing Var.Value)
134 }
138-- LATE PHASE MODULE INFORMATION
141data Info expr =
142 Info
143 { docs :: A.Located (Maybe Docs.Centralized)
144 , exports :: [Var.Value]
145 , imports :: [Name.Raw]
146 , program :: expr
147 , types :: Types
148 , fixities :: [(Decl.Assoc, Int, String)]
149 , aliases :: Aliases
150 , unions :: Unions
151 }
154type Types =
155 Map.Map String Type.Canonical
158type Aliases =
159 Map.Map String ([String], Type.Canonical)
162type Unions =
163 Map.Map String (UnionInfo String)
166type UnionInfo v =
167 ( [String], [(v, [Type.Canonical])] )
170type CanonicalUnion =
171 ( Var.Canonical, UnionInfo Var.Canonical )
175-- INTERFACES
178type Interfaces =
179 Map.Map Name.Canonical Interface
182{-| Key facts about a module, used when reading info from .elmi files. -}
183data Interface =
184 Interface
185 { iVersion :: Package.Version
186 , iPackage :: Package.Name
187 , iExports :: [Var.Value]
188 , iImports :: [Name.Raw]
189 , iTypes :: Types
190 , iUnions :: Unions
191 , iAliases :: Aliases
192 , iFixities :: [(Decl.Assoc, Int, String)]
193 }
196toInterface :: Package.Name -> Optimized -> Interface
197toInterface pkgName modul =
198 let
199 myInfo =
200 info modul
201 in
202 Interface
203 { iVersion = Compiler.version
204 , iPackage = pkgName
205 , iExports = exports myInfo
206 , iImports = imports myInfo
207 , iTypes = types myInfo
208 , iUnions = unions myInfo
209 , iAliases = aliases myInfo
210 , iFixities = fixities myInfo
211 }
214instance Binary Interface where
215 get =
216 Interface <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
218 put modul =
219 do put (iVersion modul)
220 put (iPackage modul)
221 put (iExports modul)
222 put (iImports modul)
223 put (iTypes modul)
224 put (iUnions modul)
225 put (iAliases modul)
226 put (iFixities modul)