on fb08d70 help sign in
elk/src/AST/Module.hs
148 lines 3.5 kB history raw
1module AST.Module
2 ( Interfaces
3 , Types, Aliases, ADTs
4 , AdtInfo, CanonicalAdt
5 , SourceModule, ValidModule, CanonicalModule
6 , Module(..), CanonicalBody(..)
7 , Header(..)
8 , Name, nameToString, nameIsNative
9 , Interface(..), toInterface
10 , UserImport, DefaultImport, ImportMethod(..)
11 ) where
13import Control.Applicative ((<$>),(<*>))
14import Data.Binary
15import qualified Data.List as List
16import qualified Data.Map as Map
18import qualified AST.Declaration as Decl
19import qualified AST.Expression.Canonical as Canonical
20import qualified AST.Type as Type
21import qualified AST.Variable as Var
22import qualified Elm.Compiler.Version as Compiler
23import qualified Reporting.Annotation as A
26-- HELPFUL TYPE ALIASES
28type Interfaces = Map.Map Name Interface
30type Types = Map.Map String Type.Canonical
31type Aliases = Map.Map String ([String], Type.Canonical)
32type ADTs = Map.Map String (AdtInfo String)
34type AdtInfo v = ( [String], [(v, [Type.Canonical])] )
35type CanonicalAdt = (Var.Canonical, AdtInfo Var.Canonical)
38-- MODULES
40type SourceModule =
41 Module [UserImport] (Var.Listing Var.Value) [Decl.SourceDecl]
43type ValidModule =
44 Module
45 ([DefaultImport], [UserImport])
46 (Var.Listing Var.Value)
47 [Decl.ValidDecl]
49type CanonicalModule =
50 Module [Name] [Var.Value] CanonicalBody
53data Module imports exports body = Module
54 { names :: Name
55 , path :: FilePath
56 , exports :: exports
57 , imports :: imports
58 , body :: body
59 }
61data CanonicalBody = CanonicalBody
62 { program :: Canonical.Expr
63 , types :: Types
64 , fixities :: [(Decl.Assoc, Int, String)]
65 , aliases :: Aliases
66 , datatypes :: ADTs
67 , ports :: [String]
68 }
71-- HEADERS
73{-| Basic info needed to identify modules and determine dependencies. -}
74data Header imports = Header
75 { _names :: Name
76 , _exports :: Var.Listing Var.Value
77 , _imports :: imports
78 }
81type Name = [String] -- must be non-empty
84nameToString :: Name -> String
85nameToString =
86 List.intercalate "."
89nameIsNative :: Name -> Bool
90nameIsNative name =
91 case name of
92 "Native" : _ -> True
93 _ -> False
96-- IMPORTs
98type UserImport = A.Located (Name, ImportMethod)
101type DefaultImport = (Name, 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 :: String
115 , iExports :: [Var.Value]
116 , iTypes :: Types
117 , iImports :: [Name]
118 , iAdts :: ADTs
119 , iAliases :: Aliases
120 , iFixities :: [(Decl.Assoc, Int, String)]
121 , iPorts :: [String]
122 }
124toInterface :: CanonicalModule -> Interface
125toInterface modul =
126 let body' = body modul in
127 Interface
128 { iVersion = Compiler.version
129 , iExports = exports modul
130 , iTypes = types body'
131 , iImports = imports modul
132 , iAdts = datatypes body'
133 , iAliases = aliases body'
134 , iFixities = fixities body'
135 , iPorts = ports body'
136 }
138instance Binary Interface where
139 get = Interface <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
140 put modul = do
141 put (iVersion modul)
142 put (iExports modul)
143 put (iTypes modul)
144 put (iImports modul)
145 put (iAdts modul)
146 put (iAliases modul)
147 put (iFixities modul)
148 put (iPorts modul)