1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
11import qualified Data.ByteString as B
12import Data.Text (Text)
14import qualified AST.Source as Src
15import qualified Elm.Compiler.Imports as Imports
16import qualified Elm.Name as N
17import qualified Elm.Package as Pkg
18import Parse.Primitives (Parser, oneOf)
19import qualified Parse.Primitives as P
20import qualified Parse.Primitives.Keyword as Keyword
21import qualified Parse.Primitives.Symbol as Symbol
22import qualified Parse.Primitives.Variable as Var
23import qualified Parse.Primitives.Whitespace as W
24import qualified Reporting.Annotation as A
25import qualified Reporting.Error.Syntax as E
26import qualified Reporting.Region as R
33module_ :: Pkg.Name -> Parser decls -> Parser (Src.Module decls)
34module_ pkgName chompDecls =
36 header <- oneOf [ Just <$> chompHeader, return Nothing ]
37 imports <- Imports.addDefaults pkgName <$> chompImports []
39 return (Src.Module header imports decls)
42chompHeader :: Parser Src.Header
44 do start <- P.getPosition
45 P.pushContext start E.Module
46 (name, effects) <- chompNameAndEffects
47 P.hint E.Exposing $ Keyword.exposing_
51 docs <- maybeDocComment
52 return (Src.Header name effects exports docs)
60-- effect module MyThing where { command = MyCmd }
62chompNameAndEffects :: Parser (N.Name, Src.Effects)
68 name <- Var.moduleName
70 return ( name, Src.NoEffects )
72 do start <- P.getPosition
78 name <- Var.moduleName
80 return ( name, Src.Ports (R.Region start end) )
82 do start <- P.getPosition
88 name <- Var.moduleName
90 manager <- chompManager
91 return ( name, Src.Manager (R.Region start end) manager )
98-- where { command = MyCmd }
99-- where { subscription = MySub }
100-- where { command = MyCmd, subscription = MySub }
102chompManager :: Parser Src.Manager
109 [ do cmd <- chompCommand
112 [ do Symbol.rightCurly
117 sub <- chompSubscription
121 return (Src.Fx cmd sub)
123 , do sub <- chompSubscription
126 [ do Symbol.rightCurly
135 return (Src.Fx cmd sub)
140chompCommand :: Parser (A.Located Text)
146 P.addLocation Var.upper
149chompSubscription :: Parser (A.Located Text)
151 do Keyword.subscription_
155 P.addLocation Var.upper
162maybeDocComment :: Parser (Maybe (A.Located B.ByteString))
165 newStart <- P.getPosition
167 [ do doc <- W.docComment
170 return (Just (A.at newStart end doc))
179chompImports :: [Src.Import] -> Parser [Src.Import]
180chompImports imports =
182 [ do start <- P.getPosition
184 P.pushContext start E.Import
186 name <- P.addLocation Var.moduleName
189 [ do P.checkFreshLine pos
192 Src.Import name Nothing (Src.Explicit []) : imports
193 , do P.checkSpace pos
195 [ chompAs name imports
196 , chompExposing name Nothing imports
199 , return (reverse imports)
203chompAs :: A.Located Text -> [Src.Import] -> Parser [Src.Import]
204chompAs name imports =
210 [ do P.checkFreshLine pos
213 Src.Import name (Just alias) (Src.Explicit []) : imports
214 , do P.checkSpace pos
215 chompExposing name (Just alias) imports
219chompExposing :: A.Located Text -> Maybe Text -> [Src.Import] -> Parser [Src.Import]
220chompExposing name maybeAlias imports =
227 Src.Import name maybeAlias exposed : imports
234exposing :: Parser Src.Exposing
240 [ do Symbol.doubleDot
244 , do entry <- P.addLocation chompEntry
250exposingHelp :: [A.Located Src.Exposed] -> Parser Src.Exposing
251exposingHelp revEntries =
255 entry <- P.addLocation chompEntry
257 exposingHelp (entry:revEntries)
258 , do Symbol.rightParen
259 return (Src.Explicit (reverse revEntries))
263chompEntry :: Parser Src.Exposed
266 [ Src.Lower <$> Var.lower
267 , do Symbol.leftParen
270 return (Src.Operator op)
271 , do name <- Var.upper
273 Src.Upper name <$> privacy
277privacy :: Parser Src.Privacy
280 [ do Symbol.leftParen
294freshLine :: Parser ()
296 P.checkFreshLine =<< W.whitespace
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