1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
9import qualified Data.ByteString as BS
10import qualified Data.Map as Map
11import Data.Monoid ((<>))
12import Data.Text (Text)
13import qualified Data.Text as Text
14import qualified Data.Text.Encoding as Text
15import Data.Word (Word8)
17import qualified AST.Expression.Source as Src
18import qualified AST.Kernel as Kernel
19import qualified AST.Module.Name as Module
20import qualified Elm.Name as N
21import Generate.JavaScript.Helpers as Help (toFieldName)
22import Generate.JavaScript.Variable as Var (intToAscii)
23import Parse.Primitives (Parser)
24import qualified Parse.Primitives.Kernel as K
25import qualified Parse.Primitives.Symbol as Symbol
26import qualified Parse.Module as Module
27import qualified Reporting.Annotation as A
34parser :: Parser Kernel.Content
36 do Symbol.jsMultiCommentOpen
38 srcImports <- Module.chompImports []
39 Symbol.jsMultiCommentClose
40 let imports = Map.unions (map destructImport srcImports)
41 chunks <- parserHelp imports Map.empty Map.empty []
42 return (Kernel.Content (Map.elems imports) chunks)
45parserHelp :: Imports -> Enums -> Fields -> [Kernel.Chunk] -> Parser [Kernel.Chunk]
46parserHelp imports enums fields chunks =
47 do (javascript, maybeTag) <- K.chunk
50 return (Kernel.JS javascript : chunks)
55 parserHelp imports enums fields (Kernel.Prod : Kernel.JS javascript : chunks)
58 parserHelp imports enums fields (Kernel.Debug : Kernel.JS javascript : chunks)
61 case Map.lookup var imports of
63 error ("Bad kernel symbol: " ++ Text.unpack var)
66 parserHelp imports enums fields (Kernel.Var home name : Kernel.JS javascript : chunks)
71 lookupEnum n var enums
73 parserHelp imports newEnums fields (Kernel.JS bytes : Kernel.JS javascript : chunks)
76 parserHelp imports enums fields (Kernel.Field name : Kernel.JS javascript : chunks)
81 lookupField name fields
83 parserHelp imports enums newFields (Kernel.JS bytes : Kernel.JS javascript : chunks)
91 Map.Map Text BS.ByteString
94lookupField :: Text -> Fields -> (BS.ByteString, Fields)
95lookupField longName fields =
96 case Map.lookup longName fields of
103 Var.intToAscii (Map.size fields)
105 ( shortName, Map.insert longName shortName fields )
113 Map.Map Word8 (Map.Map Text BS.ByteString)
116lookupEnum :: Word8 -> Text -> Enums -> (BS.ByteString, Enums)
117lookupEnum word var allEnums =
120 Map.findWithDefault Map.empty word allEnums
122 case Map.lookup var enums of
129 Text.encodeUtf8 ("'" <> Help.toFieldName (Map.size enums) <> "'")
131 ( identifier, Map.insert word (Map.insert var identifier enums) allEnums )
139 Map.Map Text (Module.Raw, Text)
142destructImport :: Src.Import -> Imports
143destructImport (Src.Import (A.A _ moduleName) maybeAlias exposing) =
151 if Module.isKernel moduleName then
152 Module.getKernel moduleName
153 else if Text.isInfixOf "." moduleName then
154 error ("modules with dots in kernel code need an alias: " ++ show moduleName)
159 ( shortName <> "_" <> name, ( moduleName, name ) )
161 Map.fromList $ map toEntry $
164 error "cannot have open imports in kernel code"
166 Src.Explicit exposed ->
167 map exposedToName exposed
170exposedToName :: A.Located Src.Exposed -> N.Name
171exposedToName (A.A _ exposed) =
176 Src.Upper name Src.Private ->
179 Src.Upper _ Src.Public ->
180 error "cannot have Maybe(..) syntax in kernel code header"
183 error "cannot use binops in kernel code"
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list