@@ -1,31 +1,197 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2+{-# LANGUAGE OverloadedStrings #-}
2module Elm.Kernel
3module Elm.Kernel
3− ( Kernel.Data(..)
4+ ( Kernel(..)
10−import Data.Text (Text)
10+import qualified Data.ByteString as B
11+import qualified Data.Map as Map
12+import Data.Monoid ((<>))
13+import qualified Data.Text as Text
14+import Data.Word (Word8)
12−import qualified AST.Kernel as Kernel (Data(..), Content(..))
17+import qualified AST.Optimized as Opt
18+import qualified AST.Source as Src
19+import qualified AST.Module.Name as ModuleName
13−import qualified Elm.Compiler.Internals as I
20+import qualified Elm.Name as N
14−import qualified Parse.Helpers as Parse (run)
21+import Parse.Primitives (Parser, run)
15−import qualified Parse.Kernel as Kernel (parser)
22+import qualified Parse.Primitives.Kernel as K
23+import qualified Parse.Primitives.Symbol as Symbol
24+import qualified Parse.Module as Module
16import qualified Reporting.Annotation as A
25import qualified Reporting.Annotation as A
17−import qualified Reporting.Error as Error
26+import qualified Reporting.Error as E
21−-- PARSE KERNEL
33+data Kernel =
35+ { _imports :: [(N.Name, N.Name)]
36+ , _chunks :: [Opt.KChunk]
24−parse :: Text -> Either I.Error Kernel.Content
40+parse :: B.ByteString -> Either E.Error Kernel
25parse sourceCode =
41parse sourceCode =
26− case Parse.run Kernel.parser sourceCode of
42+ case run parser sourceCode of
27− Right content ->
43+ Right kernel ->
28− Right content
44+ Right kernel
30 Left err ->
46 Left err ->
31− Left (I.Error (A.map Error.Syntax err))
47+ Left (E.Syntax err)
54+parser :: Parser Kernel
56+ do Symbol.jsMultiCommentOpen
58+ srcImports <- Module.chompImports []
59+ Symbol.jsMultiCommentClose
60+ let imports = Map.unions (map destructImport srcImports)
61+ chunks <- parserHelp imports Map.empty Map.empty []
62+ return $ Kernel (Map.elems imports) chunks
65+parserHelp :: Imports -> Enums -> Fields -> [Opt.KChunk] -> Parser [Opt.KChunk]
66+parserHelp imports enums fields chunks =
67+ do (javascript, maybeTag) <- K.chunk
70+ return (Opt.JS javascript : chunks)
75+ parserHelp imports enums fields $
76+ Opt.Prod : Opt.JS javascript : chunks
79+ parserHelp imports enums fields $
80+ Opt.Debug : Opt.JS javascript : chunks
83+ case Map.lookup var imports of
85+ error ("Bad kernel symbol: " ++ Text.unpack var)
88+ parserHelp imports enums fields $
89+ Opt.Var home name : Opt.JS javascript : chunks
92+ let (enum, newEnums) = lookupEnum n var enums in
93+ parserHelp imports newEnums fields $
94+ Opt.Enum enum : Opt.JS javascript : chunks
97+ parserHelp imports enums fields $
98+ Opt.ElmField name : Opt.JS javascript : chunks
101+ let (field, newFields) = lookupField name fields in
102+ parserHelp imports enums newFields $
103+ Opt.JsField field : Opt.JS javascript : chunks
111+ Map.Map Text.Text Int
114+lookupField :: Text.Text -> Fields -> (Int, Fields)
115+lookupField name fields =
116+ case Map.lookup name fields of
121+ let n = Map.size fields in
122+ ( n, Map.insert name n fields )
130+ Map.Map Word8 (Map.Map N.Name Int)
133+lookupEnum :: Word8 -> N.Name -> Enums -> (Int, Enums)
134+lookupEnum word var allEnums =
137+ Map.findWithDefault Map.empty word allEnums
139+ case Map.lookup var enums of
144+ let n = Map.size enums in
145+ ( n, Map.insert word (Map.insert var n enums) allEnums )
153+ Map.Map Text.Text (N.Name, N.Name)
156+destructImport :: Src.Import -> Imports
157+destructImport (Src.Import (A.At _ moduleName) maybeAlias exposing) =
165+ if ModuleName.isKernel moduleName then
166+ ModuleName.getKernel moduleName
167+ else if Text.isInfixOf "." moduleName then
168+ error ("modules with dots in kernel code need an alias: " ++ show moduleName)
173+ ( shortName <> "_" <> name, ( moduleName, name ) )
175+ Map.fromList $ map toEntry $
178+ error "cannot have open imports in kernel code"
180+ Src.Explicit exposed ->
181+ map exposedToName exposed
184+exposedToName :: A.Located Src.Exposed -> N.Name
185+exposedToName (A.At _ exposed) =
190+ Src.Upper name Src.Private ->
193+ Src.Upper _ Src.Public ->
194+ error "cannot have Maybe(..) syntax in kernel code header"
197+ error "cannot use binops in kernel code"