1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
11import qualified AST.Source as Src
12import qualified Elm.Compiler.Imports as Imports
13import qualified Elm.Name as N
14import qualified Elm.Package as Pkg
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_ :: Pkg.Name -> Parser decls -> Parser (Src.Module decls)
31module_ pkgName chompDecls =
33 header <- oneOf [ Just <$> chompHeader, return Nothing ]
34 imports <- Imports.addDefaults pkgName <$> chompImports []
36 return (Src.Module header imports decls)
39chompHeader :: Parser Src.Header
41 do start <- P.getPosition
42 P.pushContext start E.Module
43 (name, effects) <- chompNameAndEffects
44 P.hint E.Exposing $ Keyword.exposing_
46 exports <- P.addLocation exposing
48 docs <- chompDocComment
49 return (Src.Header name effects exports docs)
57-- effect module MyThing where { command = MyCmd }
59chompNameAndEffects :: Parser (N.Name, Src.Effects)
65 name <- Var.moduleName
67 return ( name, Src.NoEffects )
69 do start <- P.getPosition
75 name <- Var.moduleName
77 return ( name, Src.Ports (R.Region start end) )
79 do start <- P.getPosition
85 name <- Var.moduleName
87 manager <- chompManager
88 return ( name, Src.Manager (R.Region start end) manager )
95-- where { command = MyCmd }
96-- where { subscription = MySub }
97-- where { command = MyCmd, subscription = MySub }
99chompManager :: Parser Src.Manager
106 [ do cmd <- chompCommand
109 [ do Symbol.rightCurly
114 sub <- chompSubscription
118 return (Src.Fx cmd sub)
120 , do sub <- chompSubscription
123 [ do Symbol.rightCurly
132 return (Src.Fx cmd sub)
137chompCommand :: Parser (A.Located N.Name)
143 P.addLocation Var.upper
146chompSubscription :: Parser (A.Located N.Name)
148 do Keyword.subscription_
152 P.addLocation Var.upper
159chompDocComment :: Parser Src.Docs
161 do endOfExposing <- P.getPosition
163 nextStart <- P.getPosition
165 [ do doc <- W.docComment
166 docEnd <- P.getPosition
168 return (Src.YesDocs (R.Region nextStart docEnd) doc)
169 , return (Src.NoDocs (R.Region endOfExposing nextStart))
177chompImports :: [Src.Import] -> Parser [Src.Import]
178chompImports imports =
180 [ do start <- P.getPosition
182 P.pushContext start E.Import
184 name <- P.addLocation Var.moduleName
187 [ do P.checkFreshLine pos
190 Src.Import name Nothing (Src.Explicit []) : imports
191 , do P.checkSpace pos
193 [ chompAs name imports
194 , chompExposing name Nothing imports
197 , return (reverse imports)
201chompAs :: A.Located N.Name -> [Src.Import] -> Parser [Src.Import]
202chompAs name imports =
208 [ do P.checkFreshLine pos
211 Src.Import name (Just alias) (Src.Explicit []) : imports
212 , do P.checkSpace pos
213 chompExposing name (Just alias) imports
217chompExposing :: A.Located N.Name -> Maybe N.Name -> [Src.Import] -> Parser [Src.Import]
218chompExposing name maybeAlias imports =
225 Src.Import name maybeAlias exposed : imports
232exposing :: Parser Src.Exposing
238 [ do Symbol.doubleDot
242 , do entry <- P.addLocation chompEntry
248exposingHelp :: [A.Located Src.Exposed] -> Parser Src.Exposing
249exposingHelp revEntries =
253 entry <- P.addLocation chompEntry
255 exposingHelp (entry:revEntries)
256 , do Symbol.rightParen
257 return (Src.Explicit (reverse revEntries))
261chompEntry :: Parser Src.Exposed
264 [ Src.Lower <$> Var.lower
265 , do Symbol.leftParen
268 return (Src.Operator op)
269 , do name <- Var.upper
271 Src.Upper name <$> privacy
275privacy :: Parser Src.Privacy
278 [ do Symbol.leftParen
292freshLine :: Parser ()
294 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