1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
11import qualified Data.ByteString as B
13import qualified AST.Source as Src
14import qualified Elm.Compiler.Imports as Imports
15import qualified Elm.Name as N
16import qualified Elm.Package as Pkg
17import Parse.Primitives (Parser, oneOf)
18import qualified Parse.Primitives as P
19import qualified Parse.Primitives.Keyword as Keyword
20import qualified Parse.Primitives.Symbol as Symbol
21import qualified Parse.Primitives.Variable as Var
22import qualified Parse.Primitives.Whitespace as W
23import qualified Reporting.Annotation as A
24import qualified Reporting.Error.Syntax as E
25import qualified Reporting.Region as R
32module_ :: Pkg.Name -> Parser decls -> Parser (Src.Module decls)
33module_ pkgName chompDecls =
35 header <- oneOf [ Just <$> chompHeader, return Nothing ]
36 imports <- Imports.addDefaults pkgName <$> chompImports []
38 return (Src.Module header imports decls)
41chompHeader :: Parser Src.Header
43 do start <- P.getPosition
44 P.pushContext start E.Module
45 (name, effects) <- chompNameAndEffects
46 P.hint E.Exposing $ Keyword.exposing_
50 docs <- maybeDocComment
51 return (Src.Header name effects exports docs)
59-- effect module MyThing where { command = MyCmd }
61chompNameAndEffects :: Parser (N.Name, Src.Effects)
67 name <- Var.moduleName
69 return ( name, Src.NoEffects )
71 do start <- P.getPosition
77 name <- Var.moduleName
79 return ( name, Src.Ports (R.Region start end) )
81 do start <- P.getPosition
87 name <- Var.moduleName
89 manager <- chompManager
90 return ( name, Src.Manager (R.Region start end) manager )
97-- where { command = MyCmd }
98-- where { subscription = MySub }
99-- where { command = MyCmd, subscription = MySub }
101chompManager :: Parser Src.Manager
108 [ do cmd <- chompCommand
111 [ do Symbol.rightCurly
116 sub <- chompSubscription
120 return (Src.Fx cmd sub)
122 , do sub <- chompSubscription
125 [ do Symbol.rightCurly
134 return (Src.Fx cmd sub)
139chompCommand :: Parser (A.Located N.Name)
145 P.addLocation Var.upper
148chompSubscription :: Parser (A.Located N.Name)
150 do Keyword.subscription_
154 P.addLocation Var.upper
161maybeDocComment :: Parser (Maybe (A.Located B.ByteString))
164 newStart <- P.getPosition
166 [ do doc <- W.docComment
169 return (Just (A.at newStart end doc))
178chompImports :: [Src.Import] -> Parser [Src.Import]
179chompImports imports =
181 [ do start <- P.getPosition
183 P.pushContext start E.Import
185 name <- P.addLocation Var.moduleName
188 [ do P.checkFreshLine pos
191 Src.Import name Nothing (Src.Explicit []) : imports
192 , do P.checkSpace pos
194 [ chompAs name imports
195 , chompExposing name Nothing imports
198 , return (reverse imports)
202chompAs :: A.Located N.Name -> [Src.Import] -> Parser [Src.Import]
203chompAs name imports =
209 [ do P.checkFreshLine pos
212 Src.Import name (Just alias) (Src.Explicit []) : imports
213 , do P.checkSpace pos
214 chompExposing name (Just alias) imports
218chompExposing :: A.Located N.Name -> Maybe N.Name -> [Src.Import] -> Parser [Src.Import]
219chompExposing name maybeAlias imports =
226 Src.Import name maybeAlias exposed : imports
233exposing :: Parser Src.Exposing
239 [ do Symbol.doubleDot
243 , do entry <- P.addLocation chompEntry
249exposingHelp :: [A.Located Src.Exposed] -> Parser Src.Exposing
250exposingHelp revEntries =
254 entry <- P.addLocation chompEntry
256 exposingHelp (entry:revEntries)
257 , do Symbol.rightParen
258 return (Src.Explicit (reverse revEntries))
262chompEntry :: Parser Src.Exposed
265 [ Src.Lower <$> Var.lower
266 , do Symbol.leftParen
269 return (Src.Operator op)
270 , do name <- Var.upper
272 Src.Upper name <$> privacy
276privacy :: Parser Src.Privacy
279 [ do Symbol.leftParen
293freshLine :: Parser ()
295 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