on 5b5230c help sign in
elk/src/AST/Module.hs
222 lines 4.4 kB history raw
1module AST.Module
2 ( Header(..), Module(..)
4 , Source, SourceInfo(..), SourceTag(..), SourceSettings, emptySettings
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.Effects as Effects
23import qualified AST.Expression.Canonical as Canonical
24import qualified AST.Expression.Optimized as Optimized
25import qualified AST.Module.Name as Name
26import qualified AST.Type as Type
27import qualified AST.Variable as Var
28import qualified Docs.AST as Docs
29import qualified Elm.Package as Package
30import qualified Elm.Compiler.Version as Compiler
31import qualified Reporting.Annotation as A
32import qualified Reporting.Region as R
36-- HEADERS FOR PARSING
39{-| Basic info needed to identify modules and determine dependencies. -}
40data Header imports =
41 Header
42 { _tag :: SourceTag
43 , _name :: Name.Raw
44 , _exports :: Var.Listing (A.Located Var.Value)
45 , _settings :: SourceSettings
46 , _docs :: A.Located (Maybe String)
47 , _imports :: imports
48 }
52-- MODULES
55data Module phase =
56 Module
57 { name :: Name.Canonical
58 , path :: FilePath
59 , info :: phase
60 }
63type Source =
64 Module SourceInfo
67data SourceInfo =
68 Source
69 { srcTag :: SourceTag
70 , srcSettings :: SourceSettings
71 , srcDocs :: A.Located (Maybe String)
72 , srcExports :: Var.Listing (A.Located Var.Value)
73 , srcImports :: [UserImport]
74 , srcDecls :: [Decl.Source]
75 }
78data SourceTag
79 = Normal
80 | Effect R.Region
81 | Port R.Region
84type SourceSettings =
85 A.Located [(A.Located String, A.Located String)]
88emptySettings :: SourceSettings
89emptySettings =
90 A.A (error "region of empty settings should not be needed") []
93type Valid =
94 Module ValidInfo
97data ValidInfo =
98 Valid
99 { validDocs :: A.Located (Maybe String)
100 , validExports :: Var.Listing (A.Located Var.Value)
101 , validImports :: ([DefaultImport], [UserImport])
102 , validDecls :: Decl.Valid
103 , validEffects :: Effects.Raw
104 }
107type Canonical =
108 Module (Info Canonical.Expr)
111type Optimized =
112 Module (Info [Optimized.Def])
116-- IMPORTS
119type UserImport = A.Located (Name.Raw, ImportMethod)
122type DefaultImport = (Name.Raw, ImportMethod)
125data ImportMethod =
126 ImportMethod
127 { alias :: Maybe String
128 , exposedVars :: !(Var.Listing Var.Value)
129 }
133-- LATE PHASE MODULE INFORMATION
136data Info program =
137 Info
138 { docs :: A.Located (Maybe Docs.Centralized)
139 , exports :: [Var.Value]
140 , imports :: [Name.Raw]
141 , program :: program
142 , types :: Types
143 , fixities :: [Decl.Infix]
144 , aliases :: Aliases
145 , unions :: Unions
146 , effects :: Effects.Canonical
147 }
150type Types =
151 Map.Map String Type.Canonical
154type Aliases =
155 Map.Map String ([String], Type.Canonical)
158type Unions =
159 Map.Map String (UnionInfo String)
162type UnionInfo v =
163 ( [String], [(v, [Type.Canonical])] )
166type CanonicalUnion =
167 ( Var.Canonical, UnionInfo Var.Canonical )
171-- INTERFACES
174type Interfaces =
175 Map.Map Name.Canonical Interface
178{-| Key facts about a module, used when reading info from .elmi files. -}
179data Interface =
180 Interface
181 { iVersion :: Package.Version
182 , iPackage :: Package.Name
183 , iExports :: [Var.Value]
184 , iImports :: [Name.Raw]
185 , iTypes :: Types
186 , iUnions :: Unions
187 , iAliases :: Aliases
188 , iFixities :: [Decl.Infix]
189 }
192toInterface :: Package.Name -> Optimized -> Interface
193toInterface pkgName modul =
194 let
195 myInfo =
196 info modul
197 in
198 Interface
199 { iVersion = Compiler.version
200 , iPackage = pkgName
201 , iExports = exports myInfo
202 , iImports = imports myInfo
203 , iTypes = types myInfo
204 , iUnions = unions myInfo
205 , iAliases = aliases myInfo
206 , iFixities = fixities myInfo
207 }
210instance Binary Interface where
211 get =
212 Interface <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
214 put modul =
215 do put (iVersion modul)
216 put (iPackage modul)
217 put (iExports modul)
218 put (iImports modul)
219 put (iTypes modul)
220 put (iUnions modul)
221 put (iAliases modul)
222 put (iFixities modul)