on bbb6583 help sign in
elk/src/AST/Module.hs
225 lines 4.4 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
34-- HEADERS FOR PARSING
37{-| Basic info needed to identify modules and determine dependencies. -}
38data Header imports =
39 Header
40 { _tag :: SourceTag
41 , _name :: Name.Raw
42 , _exports :: Var.Listing (A.Located Var.Value)
43 , _settings :: SourceSettings
44 , _docs :: A.Located (Maybe String)
45 , _imports :: imports
46 }
50-- MODULES
53data Module phase =
54 Module
55 { name :: Name.Canonical
56 , path :: FilePath
57 , info :: phase
58 }
61type Source =
62 Module SourceInfo
65data SourceInfo =
66 Source
67 { srcTag :: SourceTag
68 , srcSettings :: SourceSettings
69 , srcDocs :: A.Located (Maybe String)
70 , srcExports :: Var.Listing (A.Located Var.Value)
71 , srcImports :: [UserImport]
72 , srcDecls :: [Decl.Source]
73 }
76data SourceTag
77 = SrcNormal
78 | SrcEffect
79 | SrcForeign
82type SourceSettings =
83 A.Located [(A.Located String, A.Located String)]
86emptySettings :: SourceSettings
87emptySettings =
88 A.A (error "region of empty settings should not be needed") []
91type Valid =
92 Module ValidInfo
95data ValidInfo =
96 Valid
97 { validDocs :: A.Located (Maybe String)
98 , validExports :: Var.Listing (A.Located Var.Value)
99 , validImports :: ([DefaultImport], [UserImport])
100 , validDecls :: [Decl.Valid]
101 , validEffects :: ValidEffects
102 }
105data ValidEffects
106 = ValidNormal
107 | ValidEffect (Maybe (A.Located String)) (Maybe (A.Located String))
108 | ValidForeign
111type Canonical =
112 Module (Info Canonical.Expr)
115type Optimized =
116 Module (Info [Optimized.Def])
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-- LATE PHASE MODULE INFORMATION
140data Info expr =
141 Info
142 { docs :: A.Located (Maybe Docs.Centralized)
143 , exports :: [Var.Value]
144 , imports :: [Name.Raw]
145 , program :: expr
146 , types :: Types
147 , fixities :: [(Decl.Assoc, Int, String)]
148 , aliases :: Aliases
149 , unions :: Unions
150 }
153type Types =
154 Map.Map String Type.Canonical
157type Aliases =
158 Map.Map String ([String], Type.Canonical)
161type Unions =
162 Map.Map String (UnionInfo String)
165type UnionInfo v =
166 ( [String], [(v, [Type.Canonical])] )
169type CanonicalUnion =
170 ( Var.Canonical, UnionInfo Var.Canonical )
174-- INTERFACES
177type Interfaces =
178 Map.Map Name.Canonical Interface
181{-| Key facts about a module, used when reading info from .elmi files. -}
182data Interface =
183 Interface
184 { iVersion :: Package.Version
185 , iPackage :: Package.Name
186 , iExports :: [Var.Value]
187 , iImports :: [Name.Raw]
188 , iTypes :: Types
189 , iUnions :: Unions
190 , iAliases :: Aliases
191 , iFixities :: [(Decl.Assoc, Int, String)]
192 }
195toInterface :: Package.Name -> Optimized -> Interface
196toInterface pkgName modul =
197 let
198 myInfo =
199 info modul
200 in
201 Interface
202 { iVersion = Compiler.version
203 , iPackage = pkgName
204 , iExports = exports myInfo
205 , iImports = imports myInfo
206 , iTypes = types myInfo
207 , iUnions = unions myInfo
208 , iAliases = aliases myInfo
209 , iFixities = fixities myInfo
210 }
213instance Binary Interface where
214 get =
215 Interface <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
217 put modul =
218 do put (iVersion modul)
219 put (iPackage modul)
220 put (iExports modul)
221 put (iImports modul)
222 put (iTypes modul)
223 put (iUnions modul)
224 put (iAliases modul)
225 put (iFixities modul)