on 8d8afda help sign in
elk/src/AST/Module.hs
208 lines 4.0 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 , 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 :: Tag
42 , _name :: Name.Raw
43 , _docs :: A.Located (Maybe String)
44 , _exports :: Var.Listing (A.Located Var.Value)
45 , _imports :: imports
46 }
50-- MODULES
53data Module phase =
54 Module
55 { tag :: Tag
56 , name :: Name.Canonical
57 , path :: FilePath
58 , info :: phase
59 }
62data Tag
63 = Normal
64 | Effect (Maybe (A.Located String)) (Maybe (A.Located String))
65 | Foreign R.Region
68type Source =
69 Module SourceInfo
72data SourceInfo =
73 Source
74 { srcDocs :: A.Located (Maybe String)
75 , srcExports :: Var.Listing (A.Located Var.Value)
76 , srcImports :: [UserImport]
77 , srcDecls :: [Decl.Source]
78 }
81type Valid =
82 Module ValidInfo
85data ValidInfo =
86 Valid
87 { validDocs :: A.Located (Maybe String)
88 , validExports :: Var.Listing (A.Located Var.Value)
89 , validImports :: ([DefaultImport], [UserImport])
90 , validDecls :: [Decl.Valid]
91 }
94type Canonical =
95 Module (Info Canonical.Expr)
98type Optimized =
99 Module (Info [Optimized.Def])
103-- IMPORTS
106type UserImport = A.Located (Name.Raw, ImportMethod)
109type DefaultImport = (Name.Raw, ImportMethod)
112data ImportMethod =
113 ImportMethod
114 { alias :: Maybe String
115 , exposedVars :: !(Var.Listing Var.Value)
116 }
120-- LATE PHASE MODULE INFORMATION
123data Info expr =
124 Info
125 { docs :: A.Located (Maybe Docs.Centralized)
126 , exports :: [Var.Value]
127 , imports :: [Name.Raw]
128 , program :: expr
129 , types :: Types
130 , fixities :: [(Decl.Assoc, Int, String)]
131 , aliases :: Aliases
132 , unions :: Unions
133 }
136type Types =
137 Map.Map String Type.Canonical
140type Aliases =
141 Map.Map String ([String], Type.Canonical)
144type Unions =
145 Map.Map String (UnionInfo String)
148type UnionInfo v =
149 ( [String], [(v, [Type.Canonical])] )
152type CanonicalUnion =
153 ( Var.Canonical, UnionInfo Var.Canonical )
157-- INTERFACES
160type Interfaces =
161 Map.Map Name.Canonical Interface
164{-| Key facts about a module, used when reading info from .elmi files. -}
165data Interface =
166 Interface
167 { iVersion :: Package.Version
168 , iPackage :: Package.Name
169 , iExports :: [Var.Value]
170 , iImports :: [Name.Raw]
171 , iTypes :: Types
172 , iUnions :: Unions
173 , iAliases :: Aliases
174 , iFixities :: [(Decl.Assoc, Int, String)]
175 }
178toInterface :: Package.Name -> Optimized -> Interface
179toInterface pkgName modul =
180 let
181 myInfo =
182 info modul
183 in
184 Interface
185 { iVersion = Compiler.version
186 , iPackage = pkgName
187 , iExports = exports myInfo
188 , iImports = imports myInfo
189 , iTypes = types myInfo
190 , iUnions = unions myInfo
191 , iAliases = aliases myInfo
192 , iFixities = fixities myInfo
193 }
196instance Binary Interface where
197 get =
198 Interface <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
200 put modul =
201 do put (iVersion modul)
202 put (iPackage modul)
203 put (iExports modul)
204 put (iImports modul)
205 put (iTypes modul)
206 put (iUnions modul)
207 put (iAliases modul)
208 put (iFixities modul)