1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
10import qualified Data.ByteString as B
11import Data.Text (Text)
13import qualified AST.Expression.Source as Src
14import qualified Elm.Name as N
15import Parse.Primitives (Parser, oneOf)
16import qualified Parse.Primitives as P
17import qualified Parse.Primitives.Keyword as Keyword
18import qualified Parse.Primitives.Symbol as Symbol
19import qualified Parse.Primitives.Variable as Var
20import qualified Parse.Primitives.Whitespace as W
21import qualified Reporting.Annotation as A
22import qualified Reporting.Error.Syntax as E
23import qualified Reporting.Region as R
30module_ :: Parser decls -> Parser (Src.Module decls)
34 [ do start <- P.getPosition
35 P.pushContext start E.Module
36 (name, effects) <- chompNameAndEffects
37 P.hint E.Exposing $ Keyword.exposing_
41 docs <- maybeDocComment
42 imports <- chompImports []
44 return (Src.Module name effects docs exports imports decls)
56-- effect module MyThing where { command = MyCmd }
58chompNameAndEffects :: Parser (N.Name, Src.Effects)
64 name <- Var.moduleName
66 return ( name, Src.NoEffects )
68 do start <- P.getPosition
74 name <- Var.moduleName
76 return ( name, Src.Ports (R.Region start end) )
78 do start <- P.getPosition
84 name <- Var.moduleName
86 manager <- chompManager
87 return ( name, Src.Effects (R.Region start end) manager )
94-- where { command = MyCmd }
95-- where { subscription = MySub }
96-- where { command = MyCmd, subscription = MySub }
98chompManager :: Parser Src.Manager
105 [ do cmd <- chompCommand
108 [ do Symbol.rightCurly
113 sub <- chompSubscription
117 return (Src.Fx cmd sub)
119 , do sub <- chompSubscription
122 [ do Symbol.rightCurly
131 return (Src.Fx cmd sub)
136chompCommand :: Parser (A.Located Text)
142 P.addLocation Var.upper
145chompSubscription :: Parser (A.Located Text)
147 do Keyword.subscription_
151 P.addLocation Var.upper
158maybeDocComment :: Parser (A.Located (Maybe B.ByteString))
160 do oldEnd <- P.getPosition
162 newStart <- P.getPosition
164 [ do doc <- W.docComment
167 return (A.at newStart end (Just doc))
168 , return (A.at oldEnd newStart Nothing)
176chompImports :: [Src.Import] -> Parser [Src.Import]
177chompImports imports =
179 [ do start <- P.getPosition
181 P.pushContext start E.Import
183 name <- P.addLocation Var.moduleName
186 [ do P.checkFreshLine pos
189 Src.Import name Nothing (Src.Explicit []) : imports
190 , do P.checkSpace pos
192 [ chompAs name imports
193 , chompExposing name Nothing imports
196 , return (reverse imports)
200chompAs :: A.Located Text -> [Src.Import] -> Parser [Src.Import]
201chompAs name imports =
207 [ do P.checkFreshLine pos
210 Src.Import name (Just alias) (Src.Explicit []) : imports
211 , do P.checkSpace pos
212 chompExposing name (Just alias) imports
216chompExposing :: A.Located Text -> Maybe Text -> [Src.Import] -> Parser [Src.Import]
217chompExposing name maybeAlias imports =
224 Src.Import name maybeAlias exposed : imports
231exposing :: Parser Src.Exposing
237 [ do Symbol.doubleDot
241 , do entry <- P.addLocation chompEntry
247exposingHelp :: [A.Located Src.Exposed] -> Parser Src.Exposing
248exposingHelp revEntries =
252 entry <- P.addLocation chompEntry
254 exposingHelp (entry:revEntries)
255 , do Symbol.rightParen
256 return (Src.Explicit (reverse revEntries))
260chompEntry :: Parser Src.Exposed
263 [ Src.Lower <$> Var.lower
264 , do Symbol.leftParen
267 return (Src.Lower op)
268 , do name <- Var.upper
270 Src.Upper name <$> privacy
274privacy :: Parser Src.Privacy
277 [ do Symbol.leftParen
291freshLine :: Parser ()
293 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