1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
11import qualified AST.Exposing as Exposing
12import qualified AST.Module as Module
14import qualified Reporting.Annotation as A
15import qualified Reporting.Error.Syntax as E
16import qualified Reporting.Region as R
23header :: Parser (Module.Header [Module.UserImport])
26 Module.Header <$> maybeHeaderDecl <*> chompImports []
29kernelHeader :: Parser [Module.UserImport]
33 imports <- chompImports []
38{-# NOINLINE headerOpen #-}
39headerOpen :: Parser ()
44{-# NOINLINE headerClose #-}
45headerClose :: Parser ()
54maybeHeaderDecl :: Parser (Maybe Module.HeaderDecl)
62headerDecl :: Parser Module.HeaderDecl
64 do start <- getPosition
65 pushContext start E.Module
68 name <- qualifiedCapVar
70 settings <- effectSettings
71 hint E.Exposing $ keyword "exposing"
73 exports <- exposing exposingEntry
75 docs <- maybeDocComment
76 return (Module.HeaderDecl tag name exports settings docs)
80-- MODULE TAGS - module, effect module, port module
83sourceTag :: Parser Module.SourceTag
90 do start <- getPosition
95 return (Module.Port (R.Region start end))
97 do start <- getPosition
102 return (Module.Effect (R.Region start end))
107-- EFFECTS - where { command = MyCmd }
110effectSettings :: Parser Module.SourceSettings
120 effectSettingsHelp start [entry]
121 , return Module.emptySettings
125effectSettingsHelp :: R.Position -> [(A.Located Text, A.Located Text)] -> Parser Module.SourceSettings
126effectSettingsHelp start entries =
132 effectSettingsHelp start (entry:entries)
136 return (A.at start end entries)
140setting :: Parser (A.Located Text, A.Located Text)
142 do name <- addLocation lowVar
146 tipe <- addLocation capVar
154maybeDocComment :: Parser (A.Located (Maybe Text))
156 do oldEnd <- getPosition
158 newStart <- getPosition
160 [ do doc <- docComment
163 return (A.at newStart end (Just doc))
164 , return (A.at oldEnd newStart Nothing)
172chompImports :: [Module.UserImport] -> Parser [Module.UserImport]
173chompImports imports =
175 [ do start <- getPosition
177 pushContext start E.Import
179 name <- addLocation qualifiedCapVar
183 [ do checkFreshLine pos
184 let userImport = method start end name Nothing Exposing.closed
186 chompImports (userImport:imports)
189 [ chompAs start name imports
190 , chompExposing start name Nothing imports
193 , return (reverse imports)
197chompAs :: R.Position -> A.Located Text -> [Module.UserImport] -> Parser [Module.UserImport]
198chompAs start name imports =
205 [ do checkFreshLine pos
206 let userImport = method start end name (Just alias) (Exposing.Explicit [])
208 chompImports (userImport:imports)
210 chompExposing start name (Just alias) imports
214chompExposing :: R.Position -> A.Located Text -> Maybe Text -> [Module.UserImport] -> Parser [Module.UserImport]
215chompExposing start name maybeAlias imports =
216 do keyword "exposing"
218 exposed <- exposing exposingEntry
221 let userImport = method start end name maybeAlias exposed
223 chompImports (userImport:imports)
226method :: R.Position -> R.Position -> A.Located Text -> Maybe Text -> Exposing.Raw -> Module.UserImport
227method start end name maybeAlias exposed =
228 A.at start end ( name, Module.ImportMethod maybeAlias exposed )
235exposing :: Parser a -> Parser (Exposing.Exposing a)
246 , do value <- addLocation parser
248 exposingHelp parser [value]
252exposingHelp :: Parser a -> [A.Located a] -> Parser (Exposing.Exposing a)
253exposingHelp parser values =
257 value <- addLocation parser
259 exposingHelp parser (value:values)
261 return (Exposing.Explicit (reverse values))
265exposingEntry :: Parser Exposing.Entry
268 [ Exposing.Lower <$> lowVar
272 return (Exposing.Lower op)
275 Exposing.Upper name <$>
277 [ Just <$> exposing capVar
287freshLine :: Parser ()
289 checkFreshLine =<< 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