@@ -4,14 +4,12 @@ module Parse.Module
4 ( fromByteString
4 ( fromByteString
5 , Header(..)
5 , Header(..)
6 , Effects(..)
6 , Effects(..)
8 , chompImports
7 , chompImports
14−import qualified Data.ByteString as B
12+import qualified Data.ByteString as BS
15import qualified Data.Name as Name
13import qualified Data.Name as Name
17import qualified AST.Source as Src
15import qualified AST.Source as Src
@@ -19,21 +17,20 @@ import qualified Elm.Compiler.Imports as Imports
19import qualified Elm.Package as Pkg
17import qualified Elm.Package as Pkg
20import qualified Parse.Declaration as Decl
18import qualified Parse.Declaration as Decl
21import qualified Parse.Keyword as Keyword
19import qualified Parse.Keyword as Keyword
20+import qualified Parse.Space as Space
22import qualified Parse.Symbol as Symbol
21import qualified Parse.Symbol as Symbol
23import qualified Parse.Variable as Var
22import qualified Parse.Variable as Var
24import qualified Parse.Primitives as P
23import qualified Parse.Primitives as P
25−import Parse.Primitives hiding (Parser, State, fromByteString)
24+import Parse.Primitives hiding (State, fromByteString)
27import qualified Reporting.Annotation as A
25import qualified Reporting.Annotation as A
28import qualified Reporting.Error.Syntax as E
26import qualified Reporting.Error.Syntax as E
29−import qualified Reporting.Result as Result
33-- FROM BYTE STRING
30-- FROM BYTE STRING
36−fromByteString :: Pkg.Name -> B.ByteString -> Result.Result i w E.Error Src.Module
33+fromByteString :: Pkg.Name -> BS.ByteString -> Either E.Error Src.Module
37fromByteString pkg source =
34fromByteString pkg source =
@@ -44,80 +41,91 @@ fromByteString pkg source =
44 case P.fromByteString parser source of
41 case P.fromByteString parser source of
45 P.Ok outcome _ ->
42 P.Ok outcome _ ->
46 case outcome of
43 case outcome of
47− Right modul -> Result.ok modul
44+ Right modul -> Right modul
48− Left err -> Result.throw err
45+ Left err -> Left err
50− P.Err row col ctx err ->
47+ P.Err err ->
51− Result.throw (E.ParseError row col ctx err)
48+ Left (E.ParseError err)
58−normal :: Parser (Either E.Error Src.Module)
55+normal :: Parser E.Module (Either E.Error Src.Module)
60− do freshLine
57+ do freshLine E.FreshLineModuleStart
61 header <- chompHeader
58 header <- chompHeader
59+ comment <- chompModuleDocComment
62 imports <- chompImports []
60 imports <- chompImports []
63− decls <- chompDecls []
61+ decls <- specialize E.Declarations $ chompDecls []
65− return (checkModule header (Imports.addDefaults imports) [] decls)
63+ return (checkModule header comment (Imports.addDefaults imports) [] decls)
68−core :: Parser (Either E.Error Src.Module)
66+core :: Parser E.Module (Either E.Error Src.Module)
70− do freshLine
68+ do freshLine E.FreshLineModuleStart
71 header <- chompHeader
69 header <- chompHeader
70+ comment <- chompModuleDocComment
72 imports <- chompImports []
71 imports <- chompImports []
73 binops <- chompBinops []
72 binops <- chompBinops []
74− decls <- chompDecls []
73+ decls <- specialize E.Declarations $ chompDecls []
76− return (checkModule header imports binops decls)
75+ return (checkModule header comment imports binops decls)
79−platform :: Parser (Either E.Error Src.Module)
78+platform :: Parser E.Module (Either E.Error Src.Module)
81− do freshLine
80+ do freshLine E.FreshLineModuleStart
82 header <- chompHeader
81 header <- chompHeader
82+ comment <- chompModuleDocComment
83 imports <- chompImports []
83 imports <- chompImports []
84 binops <- chompBinops []
84 binops <- chompBinops []
85− decls <- chompDecls []
85+ decls <- specialize E.Declarations $ chompDecls []
87− return (checkModule header (Imports.addDefaults imports) binops decls)
87+ return (checkModule header comment (Imports.addDefaults imports) binops decls)
91-- CHECK MODULE
91-- CHECK MODULE
94−checkModule :: Maybe Header -> [Src.Import] -> [A.Located Src.Binop] -> [Decl.Decl] -> Either E.Error Src.Module
94+checkModule :: Maybe Header -> Maybe Space.DocComment -> [Src.Import] -> [A.Located Src.Binop] -> [Decl.Decl] -> Either E.Error Src.Module
95−checkModule maybeHeader imports binops decls =
95+checkModule maybeHeader _maybeDocs imports binops decls =
97− (Header name effects exports) = maybe (Header "Main" NoEffects (A.At A.one Src.Open)) id maybeHeader
98 (values, unions, aliases, ports) = categorizeDecls [] [] [] [] decls
97 (values, unions, aliases, ports) = categorizeDecls [] [] [] [] decls
100+ Just (Header name effects exports) ->
100− Src.Module name exports imports values unions aliases binops
101+ Src.Module (Just name) exports imports values unions aliases binops
101− <$> checkEffects ports effects
102+ <$> checkEffects ports effects
106+ Src.Module Nothing (A.At A.one Src.Open) imports values unions aliases binops $
109+ _:_ -> Src.Ports ports
104checkEffects :: [Src.Port] -> Effects -> Either E.Error Src.Effects
112checkEffects :: [Src.Port] -> Effects -> Either E.Error Src.Effects
105checkEffects ports effects =
113checkEffects ports effects =
106 case effects of
114 case effects of
107− NoEffects ->
115+ NoEffects region ->
108 case ports of
116 case ports of
109 [] -> Right Src.NoEffects
117 [] -> Right Src.NoEffects
110− _:_ -> Left (error "TODO no ports")
118+ _:_ -> Left (E.UnexpectedPort region)
112 Ports region ->
120 Ports region ->
113 case ports of
121 case ports of
114− [] -> Left (error "TODO no ports in port module" region)
122+ [] -> Left (E.NoPorts region)
115 _:_ -> Right (Src.Ports ports)
123 _:_ -> Right (Src.Ports ports)
117 Manager region manager ->
125 Manager region manager ->
118 case ports of
126 case ports of
119 [] -> Right (Src.Manager region manager)
127 [] -> Right (Src.Manager region manager)
120− _:_ -> Left (error "TODO ports in effect manager")
128+ _:_ -> Left (E.UnexpectedPort region)
123categorizeDecls :: [A.Located Src.Value] -> [A.Located Src.Union] -> [A.Located Src.Alias] -> [Src.Port] -> [Decl.Decl] -> ( [A.Located Src.Value], [A.Located Src.Union], [A.Located Src.Alias], [Src.Port] )
131categorizeDecls :: [A.Located Src.Value] -> [A.Located Src.Union] -> [A.Located Src.Alias] -> [Src.Port] -> [Decl.Decl] -> ( [A.Located Src.Value], [A.Located Src.Union], [A.Located Src.Alias], [Src.Port] )
@@ -128,26 +136,27 @@ categorizeDecls values unions aliases ports decls =
129 decl:otherDecls ->
137 decl:otherDecls ->
130 case decl of
138 case decl of
131− Decl.Value value -> categorizeDecls (value:values) unions aliases ports otherDecls
139+ Decl.Value _ value -> categorizeDecls (value:values) unions aliases ports otherDecls
132− Decl.Union union -> categorizeDecls values (union:unions) aliases ports otherDecls
140+ Decl.Union _ union -> categorizeDecls values (union:unions) aliases ports otherDecls
133− Decl.Alias alias -> categorizeDecls values unions (alias:aliases) ports otherDecls
141+ Decl.Alias _ alias -> categorizeDecls values unions (alias:aliases) ports otherDecls
134− Decl.Port port_ -> categorizeDecls values unions aliases (port_:ports) otherDecls
142+ Decl.Port _ port_ -> categorizeDecls values unions aliases (port_:ports) otherDecls
138-- FRESH LINES
146-- FRESH LINES
141−freshLine :: Parser ()
149+freshLine :: (Row -> Col -> E.Module) -> Parser E.Module ()
142−freshLine =
150+freshLine toFreshLineError =
151+ do Space.chomp E.ModuleSpace
143− checkFreshLine =<< whitespace
152+ Space.checkFreshLine toFreshLineError
146−endOfFile :: Parser ()
155+endOfFile :: Parser E.Module ()
147endOfFile =
156endOfFile =
148− P.Parser $ \state@(P.State pos end _ row col ctx) _ eok _ eerr ->
157+ P.Parser $ \state@(P.State pos end _ row col) _ eok _ eerr ->
149 if pos < end then
158 if pos < end then
150− eerr row col ctx E.EndOfFile
159+ eerr row col E.ModuleEndOfFile
152 eok () state
161 eok () state
@@ -156,23 +165,39 @@ endOfFile =
156-- CHOMP DECLARATIONS
165-- CHOMP DECLARATIONS
159−chompDecls :: [Decl.Decl] -> Parser [Decl.Decl]
168+chompDecls :: [Decl.Decl] -> Parser E.Decl [Decl.Decl]
160chompDecls decls =
169chompDecls decls =
161− do (decl, _, pos) <- Decl.declaration
170+ do (decl, _) <- Decl.declaration
162− oneOf E.XXX
171+ oneOfWithFallback
163− [ do checkFreshLine pos
172+ [ do Space.checkFreshLine E.DeclFreshLineStart
164 chompDecls (decl:decls)
173 chompDecls (decl:decls)
165− , return (reverse (decl:decls))
175+ (reverse (decl:decls))
169−chompBinops :: [A.Located Src.Binop] -> Parser [A.Located Src.Binop]
178+chompBinops :: [A.Located Src.Binop] -> Parser E.Module [A.Located Src.Binop]
170chompBinops binops =
179chompBinops binops =
171− oneOf E.XXX
180+ oneOfWithFallback
172 [ do binop <- Decl.infix_
181 [ do binop <- Decl.infix_
173 chompBinops (binop:binops)
182 chompBinops (binop:binops)
188+-- MODULE DOC COMMENT
191+chompModuleDocComment :: Parser E.Module (Maybe Space.DocComment)
192+chompModuleDocComment =
195+ do docComment <- Space.docComment E.ImportStart E.ModuleSpace
196+ Space.chomp E.ModuleSpace
197+ Space.checkFreshLine E.FreshLineAfterDocComment
198+ return (Just docComment)
@@ -184,175 +209,170 @@ data Header =
186data Effects
211data Effects
187− = NoEffects
212+ = NoEffects A.Region
188 | Ports A.Region
213 | Ports A.Region
189 | Manager A.Region Src.Manager
214 | Manager A.Region Src.Manager
192−chompHeader :: Parser (Maybe Header)
217+chompHeader :: Parser E.Module (Maybe Header)
193chompHeader =
218chompHeader =
194 do start <- getPosition
219 do start <- getPosition
195− oneOf E.XXX
220+ oneOfWithFallback
197 -- module MyThing exposing (..)
222 -- module MyThing exposing (..)
198− do Keyword.module_
223+ do Keyword.module_ E.Module
199− pushContext start E.Module
224+ end <- getPosition
200− spaces
225+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleIndentName
201− name <- Var.moduleName
226+ name <- Var.moduleName E.ModuleName
202− spaces
227+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleIndentExposing
203− Keyword.exposing_
228+ Keyword.exposing_ E.ModuleExposing
204− spaces
229+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleIndentExposingList
205− exports <- addLocation exposing
230+ exports <- addLocation (specialize E.ModuleExposingList exposing)
207− freshLine
231+ freshLine E.FreshLineAfterModuleLine
208− return (Just (Header name NoEffects exports))
232+ return (Just (Header name (NoEffects (A.Region start end)) exports))
210 -- port module MyThing exposing (..)
234 -- port module MyThing exposing (..)
211− do Keyword.port_
235+ do Keyword.port_ E.Module
212− pushContext start E.Module
236+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleIndentPortModule
214− Keyword.module_
237+ Keyword.module_ E.ModulePortModule
215 end <- getPosition
238 end <- getPosition
216− spaces
239+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleIndentName
217− name <- Var.moduleName
240+ name <- Var.moduleName E.ModuleName
218− spaces
241+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleIndentExposing
219− Keyword.exposing_
242+ Keyword.exposing_ E.ModuleExposing
220− spaces
243+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleIndentExposingList
221− exports <- addLocation exposing
244+ exports <- addLocation (specialize E.ModuleExposingList exposing)
223− freshLine
245+ freshLine E.FreshLineAfterModuleLine
224 return (Just (Header name (Ports (A.Region start end)) exports))
246 return (Just (Header name (Ports (A.Region start end)) exports))
226 -- effect module MyThing where { command = MyCmd } exposing (..)
248 -- effect module MyThing where { command = MyCmd } exposing (..)
227− do Keyword.effect_
249+ do Keyword.effect_ E.Module
228− pushContext start E.Module
250+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleEffect
230− Keyword.module_
251+ Keyword.module_ E.ModuleEffect
231 end <- getPosition
252 end <- getPosition
232− spaces
253+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleEffect
233− name <- Var.moduleName
254+ name <- Var.moduleName E.ModuleName
234− spaces
255+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleEffect
235− Keyword.where_
256+ Keyword.where_ E.ModuleEffect
236− spaces
257+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleEffect
237 manager <- chompManager
258 manager <- chompManager
238− spaces
259+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleIndentExposing
239− Keyword.exposing_
260+ Keyword.exposing_ E.ModuleExposing
240− spaces
261+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleIndentExposingList
241− exports <- addLocation exposing
262+ exports <- addLocation (specialize E.ModuleExposingList exposing)
243− freshLine
263+ freshLine E.FreshLineAfterModuleLine
244 return (Just (Header name (Manager (A.Region start end) manager) exports))
264 return (Just (Header name (Manager (A.Region start end) manager) exports))
251−chompManager :: Parser Src.Manager
270+chompManager :: Parser E.Module Src.Manager
252chompManager =
271chompManager =
253− do word1 0x7B {- { -} E.XXX
272+ do word1 0x7B {- { -} E.ModuleEffect
254− spaces
273+ spaces_em
255− oneOf E.XXX
274+ oneOf E.ModuleEffect
256 [ do cmd <- chompCommand
275 [ do cmd <- chompCommand
257− spaces
276+ spaces_em
258− oneOf E.XXX
277+ oneOf E.ModuleEffect
259− [ do word1 0x7D {-}-} E.XXX
278+ [ do word1 0x7D {-}-} E.ModuleEffect
260− spaces
279+ spaces_em
261 return (Src.Cmd cmd)
280 return (Src.Cmd cmd)
262− , do word1 0x2C {-,-} E.XXX
281+ , do word1 0x2C {-,-} E.ModuleEffect
263− spaces
282+ spaces_em
264 sub <- chompSubscription
283 sub <- chompSubscription
265− spaces
284+ spaces_em
266− word1 0x7D {-}-} E.XXX
285+ word1 0x7D {-}-} E.ModuleEffect
267− spaces
286+ spaces_em
268 return (Src.Fx cmd sub)
287 return (Src.Fx cmd sub)
270 , do sub <- chompSubscription
289 , do sub <- chompSubscription
271− spaces
290+ spaces_em
272− oneOf E.XXX
291+ oneOf E.ModuleEffect
273− [ do word1 0x7D {-}-} E.XXX
292+ [ do word1 0x7D {-}-} E.ModuleEffect
274− spaces
293+ spaces_em
275 return (Src.Sub sub)
294 return (Src.Sub sub)
276− , do word1 0x2C {-,-} E.XXX
295+ , do word1 0x2C {-,-} E.ModuleEffect
277− spaces
296+ spaces_em
278 cmd <- chompCommand
297 cmd <- chompCommand
279− spaces
298+ spaces_em
280− word1 0x7D {-}-} E.XXX
299+ word1 0x7D {-}-} E.ModuleEffect
281− spaces
300+ spaces_em
282 return (Src.Fx cmd sub)
301 return (Src.Fx cmd sub)
287−chompCommand :: Parser (A.Located Name.Name)
306+chompCommand :: Parser E.Module (A.Located Name.Name)
288chompCommand =
307chompCommand =
289− do Keyword.command_
308+ do Keyword.command_ E.ModuleEffect
290− spaces
309+ spaces_em
291− word1 0x3D {-=-} E.XXX
310+ word1 0x3D {-=-} E.ModuleEffect
292− spaces
311+ spaces_em
293− addLocation Var.upper
312+ addLocation (Var.upper E.ModuleEffect)
296−chompSubscription :: Parser (A.Located Name.Name)
315+chompSubscription :: Parser E.Module (A.Located Name.Name)
297chompSubscription =
316chompSubscription =
298− do Keyword.subscription_
317+ do Keyword.subscription_ E.ModuleEffect
299− spaces
318+ spaces_em
300− word1 0x3D {-=-} E.XXX
319+ word1 0x3D {-=-} E.ModuleEffect
301− spaces
320+ spaces_em
302− addLocation Var.upper
321+ addLocation (Var.upper E.ModuleEffect)
324+spaces_em :: Parser E.Module ()
326+ Space.chompAndCheckIndent E.ModuleSpace E.ModuleEffect
306-- IMPORTS
330-- IMPORTS
309−chompImports :: [Src.Import] -> Parser [Src.Import]
333+chompImports :: [Src.Import] -> Parser E.Module [Src.Import]
310chompImports imports =
334chompImports imports =
311− oneOf E.XXX
335+ oneOfWithFallback
312− [ do start <- getPosition
313− Keyword.import_
336+ [ do Keyword.import_ E.ImportStart
314− pushContext start E.Import
337+ Space.chompAndCheckIndent E.ModuleSpace E.ImportIndentName
316− name <- addLocation Var.moduleName
338+ name@(A.At (A.Region _ end) _) <- addLocation (Var.moduleName E.ImportName)
317− pos <- whitespace
339+ Space.chomp E.ModuleSpace
318− oneOf E.XXX
340+ oneOf E.ImportEnd
319− [ do checkFreshLine pos
341+ [ do Space.checkFreshLine E.ImportEnd
321 chompImports $
342 chompImports $
322 Src.Import name Nothing (Src.Explicit []) : imports
343 Src.Import name Nothing (Src.Explicit []) : imports
323− , do checkSpace pos
344+ , do Space.checkIndent end E.ImportIndentAs
324− oneOf E.XXX
345+ oneOf E.ImportAs
325 [ chompAs name imports
346 [ chompAs name imports
326 , chompExposing name Nothing imports
347 , chompExposing name Nothing imports
329− , return (reverse imports)
333−chompAs :: A.Located Name.Name -> [Src.Import] -> Parser [Src.Import]
354+chompAs :: A.Located Name.Name -> [Src.Import] -> Parser E.Module [Src.Import]
334chompAs name imports =
355chompAs name imports =
335− do Keyword.as_
356+ do Keyword.as_ E.ImportAs
336− spaces
357+ Space.chompAndCheckIndent E.ModuleSpace E.ImportIndentAlias
337− alias <- Var.upper
358+ alias <- Var.upper E.ImportAlias
338− pos <- whitespace
359+ end <- getPosition
360+ Space.chomp E.ModuleSpace
339− oneOf E.XXX
361+ oneOf E.ImportEnd
340− [ do checkFreshLine pos
362+ [ do Space.checkFreshLine E.ImportEnd
342 chompImports $
363 chompImports $
343 Src.Import name (Just alias) (Src.Explicit []) : imports
364 Src.Import name (Just alias) (Src.Explicit []) : imports
344− , do checkSpace pos
365+ , do Space.checkIndent end E.ImportIndentExposing
345 chompExposing name (Just alias) imports
366 chompExposing name (Just alias) imports
349−chompExposing :: A.Located Name.Name -> Maybe Name.Name -> [Src.Import] -> Parser [Src.Import]
370+chompExposing :: A.Located Name.Name -> Maybe Name.Name -> [Src.Import] -> Parser E.Module [Src.Import]
350chompExposing name maybeAlias imports =
371chompExposing name maybeAlias imports =
351− do Keyword.exposing_
372+ do Keyword.exposing_ E.ImportExposing
352− spaces
373+ Space.chompAndCheckIndent E.ModuleSpace E.ImportIndentExposingList
353− exposed <- exposing
374+ exposed <- specialize E.ImportExposingList exposing
354− freshLine
375+ freshLine E.ImportEnd
356 chompImports $
376 chompImports $
357 Src.Import name maybeAlias exposed : imports
377 Src.Import name maybeAlias exposed : imports
@@ -361,56 +381,56 @@ chompExposing name maybeAlias imports =
361-- LISTING
381-- LISTING
364−exposing :: Parser Src.Exposing
384+exposing :: Parser E.Exposing Src.Exposing
365exposing =
385exposing =
366− do word1 0x28 {-(-} E.XXX
386+ do word1 0x28 {-(-} E.ExposingStart
367− spaces
387+ Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentValue
368− oneOf E.XXX
388+ oneOf E.ExposingIndentValue
369− [ do word2 0x2E 0x2E {-..-} E.XXX
389+ [ do word2 0x2E 0x2E {-..-} E.ExposingIndentValue
370− spaces
390+ Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentEnd
371− word1 0x29 {-)-} E.XXX
391+ word1 0x29 {-)-} E.ExposingEnd
372 return Src.Open
392 return Src.Open
373− , do entry <- addLocation chompEntry
393+ , do exposed <- addLocation chompExposed
374− spaces
394+ Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentEnd
375− exposingHelp [entry]
395+ exposingHelp [exposed]
379−exposingHelp :: [A.Located Src.Exposed] -> Parser Src.Exposing
399+exposingHelp :: [A.Located Src.Exposed] -> Parser E.Exposing Src.Exposing
380−exposingHelp revEntries =
400+exposingHelp revExposed =
381− oneOf E.XXX
401+ oneOf E.ExposingEnd
382− [ do word1 0x2C {-,-} E.XXX
402+ [ do word1 0x2C {-,-} E.ExposingEnd
383− spaces
403+ Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentValue
384− entry <- addLocation chompEntry
404+ exposed <- addLocation chompExposed
385− spaces
405+ Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentValueEnd
386− exposingHelp (entry:revEntries)
406+ exposingHelp (exposed:revExposed)
387− , do word1 0x29 {-)-} E.XXX
407+ , do word1 0x29 {-)-} E.ExposingEnd
388− return (Src.Explicit (reverse revEntries))
408+ return (Src.Explicit (reverse revExposed))
392−chompEntry :: Parser Src.Exposed
412+chompExposed :: Parser E.Exposing Src.Exposed
393−chompEntry =
413+chompExposed =
394− oneOf E.XXX
414+ oneOf E.ExposingValue
395− [ Src.Lower <$> Var.lower
415+ [ Src.Lower <$> Var.lower E.ExposingValue
396− , do word1 0x28 {-(-} E.XXX
416+ , do word1 0x28 {-(-} E.ExposingValue
397− op <- Symbol.binop
417+ op <- Symbol.operator E.ExposingOperator E.ExposingOperatorReserved
398− word1 0x29 {-)-} E.XXX
418+ word1 0x29 {-)-} E.ExposingOperatorRightParen
399 return (Src.Operator op)
419 return (Src.Operator op)
400− , do name <- Var.upper
420+ , do name <- Var.upper E.ExposingValue
401− spaces
421+ Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentTypePrivacy
402 Src.Upper name <$> privacy
422 Src.Upper name <$> privacy
406−privacy :: Parser Src.Privacy
426+privacy :: Parser E.Exposing Src.Privacy
408− oneOf E.XXX
428+ oneOfWithFallback
409− [ do word1 0x28 {-(-} E.XXX
429+ [ do word1 0x28 {-(-} E.ExposingTypePrivacy
410− spaces
430+ Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentTypePrivacyDots
411− word2 0x2E 0x2E {-..-} E.XXX
431+ word2 0x2E 0x2E {-..-} E.ExposingTypePrivacyDots
412− spaces
432+ Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentTypePrivacyEnd
413− word1 0x29 {-)-} E.XXX
433+ word1 0x29 {-)-} E.ExposingTypePrivacyEnd
414 return Src.Public
434 return Src.Public
415− , return Src.Private