on c18189b help sign in
elk/src/AST/Module.hs
153 lines 3.7 kB history raw
1module AST.Module
2 ( Interfaces
3 , Types, Aliases, ADTs
4 , AdtInfo, CanonicalAdt
5 , SourceModule, ValidModule, CanonicalModule, Optimized
6 , Module(..), 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
27-- HELPFUL TYPE ALIASES
29type Interfaces = Map.Map Name.Canonical Interface
31type Types = Map.Map String Type.Canonical
32type Aliases = Map.Map String ([String], Type.Canonical)
33type ADTs = Map.Map String (AdtInfo String)
35type AdtInfo v = ( [String], [(v, [Type.Canonical])] )
36type CanonicalAdt = (Var.Canonical, AdtInfo Var.Canonical)
39-- MODULES
41type SourceModule =
42 Module
43 String
44 [UserImport]
45 (Var.Listing (A.Located Var.Value))
46 [Decl.SourceDecl]
49type ValidModule =
50 Module
51 String
52 ([DefaultImport], [UserImport])
53 (Var.Listing (A.Located Var.Value))
54 [Decl.ValidDecl]
57type CanonicalModule =
58 Module Docs.Centralized [Name.Raw] [Var.Value] (Body Canonical.Expr)
61type Optimized =
62 Module Docs.Centralized [Name.Raw] [Var.Value] (Body [Optimized.Def])
65data Module docs imports exports body = Module
66 { name :: Name.Canonical
67 , path :: FilePath
68 , docs :: A.Located (Maybe docs)
69 , exports :: exports
70 , imports :: imports
71 , body :: body
72 }
75data Body expr = Body
76 { program :: expr
77 , types :: Types
78 , fixities :: [(Decl.Assoc, Int, String)]
79 , aliases :: Aliases
80 , datatypes :: ADTs
81 , ports :: [String]
82 }
85-- HEADERS
87{-| Basic info needed to identify modules and determine dependencies. -}
88data Header imports = Header
89 { _name :: Name.Raw
90 , _docs :: A.Located (Maybe String)
91 , _exports :: Var.Listing (A.Located Var.Value)
92 , _imports :: imports
93 }
96-- IMPORTs
98type UserImport = A.Located (Name.Raw, ImportMethod)
101type DefaultImport = (Name.Raw, ImportMethod)
104data ImportMethod = ImportMethod
105 { alias :: Maybe String
106 , exposedVars :: !(Var.Listing Var.Value)
107 }
110-- INTERFACES
112{-| Key facts about a module, used when reading info from .elmi files. -}
113data Interface = Interface
114 { iVersion :: Package.Version
115 , iPackage :: Package.Name
116 , iExports :: [Var.Value]
117 , iTypes :: Types
118 , iImports :: [Name.Raw]
119 , iAdts :: ADTs
120 , iAliases :: Aliases
121 , iFixities :: [(Decl.Assoc, Int, String)]
122 , iPorts :: [String]
123 }
126toInterface :: Package.Name -> Optimized -> Interface
127toInterface pkgName modul =
128 let body' = body modul in
129 Interface
130 { iVersion = Compiler.version
131 , iPackage = pkgName
132 , iExports = exports modul
133 , iTypes = types body'
134 , iImports = imports modul
135 , iAdts = datatypes body'
136 , iAliases = aliases body'
137 , iFixities = fixities body'
138 , iPorts = ports body'
139 }
142instance Binary Interface where
143 get = Interface <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
144 put modul = do
145 put (iVersion modul)
146 put (iPackage modul)
147 put (iExports modul)
148 put (iTypes modul)
149 put (iImports modul)
150 put (iAdts modul)
151 put (iAliases modul)
152 put (iFixities modul)
153 put (iPorts modul)