@@ -8,7 +8,6 @@ import qualified AST.Module as Module
88import qualified AST.Module.Name as ModuleName
99import qualified AST.Variable as Var
1010import qualified Reporting.Annotation as A
11−import qualified Reporting.Region as R
1211
1312
1413getModuleName :: String -> Maybe String
@@ -16,7 +15,7 @@ getModuleName source =
1615 let
1716 minimalParser =
1817 do optional freshLine
19− (_, names, _) <- moduleDecl
18+ (ModuleDecl _ names _ _) <- moduleDecl
2019 return (ModuleName.toString names)
2120 in
2221 case iParse minimalParser source of
@@ -30,9 +29,9 @@ getModuleName source =
3029header :: IParser (Module.Header [Module.UserImport])
3130header =
3231 do optional freshLine
33− (tag, names, exports) <-
32+ (ModuleDecl tag names exports settings) <-
3433 option
35− (Module.Normal, ["Main"], Var.openListing)
34+ (ModuleDecl Module.SrcNormal ["Main"] Var.openListing Module.emptySettings)
3635 (moduleDecl `followedBy` freshLine)
3736
3837 docs <-
@@ -43,70 +42,63 @@ header =
4342
4443 imports' <- imports
4544
46− return (Module.Header tag names docs exports imports')
45+ return (Module.Header tag names exports settings docs imports')
4746
4847
49−moduleDecl :: IParser (Module.Tag, [String], Var.Listing (A.Located Var.Value))
48+data ModuleDecl =
49+ ModuleDecl
50+ { _tag :: Module.SourceTag
51+ , _name :: [String]
52+ , _exports :: Var.Listing (A.Located Var.Value)
53+ , _settings :: Module.SourceSettings
54+ }
55+
56+
57+moduleDecl :: IParser ModuleDecl
5058moduleDecl =
5159 expecting "a module declaration" $
5260 do
53− endParser <-
54− choice
55− [
56− do try (reserved "module")
57− return (return Module.Normal)
58− ,
59− do try (reserved "effect")
60− whitespace
61− reserved "module"
62− return parseEffects
63− ,
64− do start <- getMyPosition
65− reserved "foreign"
66− whitespace
67− reserved "effect"
68− whitespace
69− reserved "module"
70− end <- getMyPosition
71− return (return (Module.Foreign (R.Region start end)))
72− ]
61+ tag <- parseTag
7362
74− whitespace
75− names <- dotSep1 capVar <?> "the name of this module"
63+ names <- padded (dotSep1 capVar) <?> "the name of this module"
7664
77− padded (reserved "exposing")
65+ settings <- option Module.emptySettings parseSetting
7866
79− exports <- listing (addLocation value)
67+ exports <- padded (listing (addLocation value))
8068
81− tag <- endParser
69+ reserved "where"
8270
83− return (tag, names, exports)
71+ return (ModuleDecl tag names exports settings)
8472
8573
86−parseEffects :: IParser Module.Tag
87−parseEffects =
88− do padded (reserved "where")
89− brackets $ choice $
90− [ do cmd <- entry "command"
91− whitespace
92− sub <- option Nothing (secondEntry "subscription")
93− return (Module.Effect cmd sub)
94− , do sub <- entry "subscription"
95− whitespace
96− cmd <- option Nothing (secondEntry "command")
97− return (Module.Effect cmd sub)
98− ]
99− where
100− entry name =
101− do try (string name)
102− padded equals
103− typeName <- addLocation capVar
104− return (Just typeName)
105−
106− secondEntry name =
107− do try comma
74+parseTag :: IParser Module.SourceTag
75+parseTag =
76+ choice
77+ [
78+ do try (reserved "module")
79+ return Module.SrcNormal
80+ ,
81+ do try (reserved "effect")
82+ whitespace
83+ reserved "module"
84+ return Module.SrcEffect
85+ ,
86+ do reserved "foreign"
87+ whitespace
88+ reserved "effect"
10889 whitespace
109− entry name
90+ reserved "module"
91+ return Module.SrcForeign
92+ ]
93+
94+
95+parseSetting :: IParser Module.SourceSettings
96+parseSetting =
97+ addLocation $ brackets $ commaSep $
98+ do name <- addLocation lowVar
99+ padded equals
100+ typeName <- addLocation capVar
101+ return (name, typeName)
110102
111103
112104imports :: IParser [Module.UserImport]