on 50a14ca help sign in
elk/src/AST/Module.hs
191 lines 3.8 kB history raw
1module AST.Module
2 ( Interfaces
3 , Types, Aliases, Unions
4 , UnionInfo, CanonicalUnion
5 , SourceModule, ValidModule, CanonicalModule, Optimized
6 , Module(..), Kind(..), Body(..)
7 , Header(..)
8 , Interface(..), toInterface
9 , UserImport, DefaultImport, ImportMethod(..)
10 ) where
12import Data.Binary
13import qualified Data.Map as Map
15import qualified AST.Declaration as Decl
16import qualified AST.Expression.Canonical as Canonical
17import qualified AST.Expression.Optimized as Optimized
18import qualified AST.Module.Name as Name
19import qualified AST.Type as Type
20import qualified AST.Variable as Var
21import qualified Docs.AST as Docs
22import qualified Elm.Package as Package
23import qualified Elm.Compiler.Version as Compiler
24import qualified Reporting.Annotation as A
28-- HELPFUL TYPE ALIASES
31type Interfaces =
32 Map.Map Name.Canonical Interface
35type Types =
36 Map.Map String Type.Canonical
39type Aliases =
40 Map.Map String ([String], Type.Canonical)
43type Unions =
44 Map.Map String (UnionInfo String)
47type UnionInfo v =
48 ( [String], [(v, [Type.Canonical])] )
51type CanonicalUnion =
52 ( Var.Canonical, UnionInfo Var.Canonical )
56-- MODULES
59type SourceModule =
60 Module
61 String
62 [UserImport]
63 (Var.Listing (A.Located Var.Value))
64 [Decl.SourceDecl]
67type ValidModule =
68 Module
69 String
70 ([DefaultImport], [UserImport])
71 (Var.Listing (A.Located Var.Value))
72 [Decl.ValidDecl]
75type CanonicalModule =
76 Module Docs.Centralized [Name.Raw] [Var.Value] (Body Canonical.Expr)
79type Optimized =
80 Module Docs.Centralized [Name.Raw] [Var.Value] (Body [Optimized.Def])
83data Module docs imports exports body =
84 Module
85 { kind :: Kind
86 , name :: Name.Canonical
87 , path :: FilePath
88 , docs :: A.Located (Maybe docs)
89 , exports :: exports
90 , imports :: imports
91 , body :: body
92 }
95data Kind
96 = Normal
97 | Effect
98 | Foreign
101data Body expr =
102 Body
103 { program :: expr
104 , types :: Types
105 , fixities :: [(Decl.Assoc, Int, String)]
106 , aliases :: Aliases
107 , unions :: Unions
108 }
112-- HEADERS
115{-| Basic info needed to identify modules and determine dependencies. -}
116data Header imports =
117 Header
118 { _kind :: Kind
119 , _name :: Name.Raw
120 , _docs :: A.Located (Maybe String)
121 , _exports :: Var.Listing (A.Located Var.Value)
122 , _imports :: imports
123 }
127-- IMPORTs
130type UserImport = A.Located (Name.Raw, ImportMethod)
133type DefaultImport = (Name.Raw, ImportMethod)
136data ImportMethod =
137 ImportMethod
138 { alias :: Maybe String
139 , exposedVars :: !(Var.Listing Var.Value)
140 }
144-- INTERFACES
147{-| Key facts about a module, used when reading info from .elmi files. -}
148data Interface =
149 Interface
150 { iVersion :: Package.Version
151 , iPackage :: Package.Name
152 , iExports :: [Var.Value]
153 , iTypes :: Types
154 , iImports :: [Name.Raw]
155 , iUnions :: Unions
156 , iAliases :: Aliases
157 , iFixities :: [(Decl.Assoc, Int, String)]
158 }
161toInterface :: Package.Name -> Optimized -> Interface
162toInterface pkgName modul =
163 let
164 body' =
165 body modul
166 in
167 Interface
168 { iVersion = Compiler.version
169 , iPackage = pkgName
170 , iExports = exports modul
171 , iTypes = types body'
172 , iImports = imports modul
173 , iUnions = unions body'
174 , iAliases = aliases body'
175 , iFixities = fixities body'
176 }
179instance Binary Interface where
180 get =
181 Interface <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
183 put modul =
184 do put (iVersion modul)
185 put (iPackage modul)
186 put (iExports modul)
187 put (iTypes modul)
188 put (iImports modul)
189 put (iUnions modul)
190 put (iAliases modul)
191 put (iFixities modul)