@@ -8,7 +8,6 @@ import qualified AST.Module as Module
8import qualified AST.Module.Name as ModuleName
8import qualified AST.Module.Name as ModuleName
9import qualified AST.Variable as Var
9import qualified AST.Variable as Var
10import qualified Reporting.Annotation as A
10import qualified Reporting.Annotation as A
11−import qualified Reporting.Region as R
14getModuleName :: String -> Maybe String
13getModuleName :: String -> Maybe String
@@ -16,7 +15,7 @@ getModuleName source =
17 minimalParser =
16 minimalParser =
18 do optional freshLine
17 do optional freshLine
19− (_, names, _) <- moduleDecl
18+ (ModuleDecl _ names _ _) <- moduleDecl
20 return (ModuleName.toString names)
19 return (ModuleName.toString names)
22 case iParse minimalParser source of
21 case iParse minimalParser source of
@@ -30,9 +29,9 @@ getModuleName source =
30header :: IParser (Module.Header [Module.UserImport])
29header :: IParser (Module.Header [Module.UserImport])
32 do optional freshLine
31 do optional freshLine
33− (tag, names, exports) <-
32+ (ModuleDecl tag names exports settings) <-
35− (Module.Normal, ["Main"], Var.openListing)
34+ (ModuleDecl Module.SrcNormal ["Main"] Var.openListing Module.emptySettings)
36 (moduleDecl `followedBy` freshLine)
35 (moduleDecl `followedBy` freshLine)
@@ -43,70 +42,63 @@ header =
44 imports' <- imports
43 imports' <- imports
46− return (Module.Header tag names docs exports imports')
45+ return (Module.Header tag names exports settings docs imports')
50+ { _tag :: Module.SourceTag
49−moduleDecl :: IParser (Module.Tag, [String], Var.Listing (A.Located Var.Value))
52+ , _exports :: Var.Listing (A.Located Var.Value)
53+ , _settings :: Module.SourceSettings
57+moduleDecl :: IParser ModuleDecl
50moduleDecl =
58moduleDecl =
51 expecting "a module declaration" $
59 expecting "a module declaration" $
53− endParser <-
61+ tag <- parseTag
56− do try (reserved "module")
57− return (return Module.Normal)
59− do try (reserved "effect")
64− do start <- getMyPosition
71− return (return (Module.Foreign (R.Region start end)))
75− names <- dotSep1 capVar <?> "the name of this module"
63+ names <- padded (dotSep1 capVar) <?> "the name of this module"
77− padded (reserved "exposing")
65+ settings <- option Module.emptySettings parseSetting
79− exports <- listing (addLocation value)
67+ exports <- padded (listing (addLocation value))
81− tag <- endParser
69+ reserved "where"
83− return (tag, names, exports)
71+ return (ModuleDecl tag names exports settings)
86−parseEffects :: IParser Module.Tag
74+parseTag :: IParser Module.SourceTag
87−parseEffects =
75+parseTag =
88− do padded (reserved "where")
89− brackets $ choice $
76+ choice
90− [ do cmd <- entry "command"
77+ [
91− whitespace
78+ do try (reserved "module")
92− sub <- option Nothing (secondEntry "subscription")
93− return (Module.Effect cmd sub)
79+ return Module.SrcNormal
94− , do sub <- entry "subscription"
80+ ,
81+ do try (reserved "effect")
95− whitespace
82+ whitespace
96− cmd <- option Nothing (secondEntry "command")
83+ reserved "module"
97− return (Module.Effect cmd sub)
84+ return Module.SrcEffect
99− where
86+ do reserved "foreign"
100− entry name =
87+ whitespace
101− do try (string name)
88+ reserved "effect"
103− typeName <- addLocation capVar
104− return (Just typeName)
108 whitespace
89 whitespace
109− entry name
90+ reserved "module"
91+ return Module.SrcForeign
95+parseSetting :: IParser Module.SourceSettings
97+ addLocation $ brackets $ commaSep $
98+ do name <- addLocation lowVar
100+ typeName <- addLocation capVar
101+ return (name, typeName)
112imports :: IParser [Module.UserImport]
104imports :: IParser [Module.UserImport]