on master help sign in
Parse "effect module" and "foreign effect module" headers
commit50a14ca0f855a352a36e0abd71116ac55837b8c0 authorEvan Czaplicki <info@elm-lang.org> dateMon 1 Feb 2016, 14:02 (11 years ago) parent0137452
7 files changed+69−30
src/AST/Module.hs+14−6 src/Canonicalize.hs+2−2 src/Canonicalize/Setup.hs+1−1 src/Elm/Compiler.hs+1−1 src/Optimize.hs+1−1 src/Parse/Module.hs+39−14 src/Parse/Parse.hs+11−5
src/AST/Module.hs+14−6
@@ -3,7 +3,7 @@ module AST.Module
33 , Types, Aliases, Unions
44 , UnionInfo, CanonicalUnion
55 , SourceModule, ValidModule, CanonicalModule, Optimized
6− , Module(..), Body(..)
6+ , Module(..), Kind(..), Body(..)
77 , Header(..)
88 , Interface(..), toInterface
99 , UserImport, DefaultImport, ImportMethod(..)
@@ -82,15 +82,22 @@ type Optimized =
8282
8383data Module docs imports exports body =
8484 Module
85− { name :: Name.Canonical
86− , path :: FilePath
87− , docs :: A.Located (Maybe docs)
85+ { kind :: Kind
86+ , name :: Name.Canonical
87+ , path :: FilePath
88+ , docs :: A.Located (Maybe docs)
8889 , exports :: exports
8990 , imports :: imports
90− , body :: body
91+ , body :: body
9192 }
9293
9394
95+data Kind
96+ = Normal
97+ | Effect
98+ | Foreign
99+
100+
94101data Body expr =
95102 Body
96103 { program :: expr
@@ -108,7 +115,8 @@ data Body expr =
108115{-| Basic info needed to identify modules and determine dependencies. -}
109116data Header imports =
110117 Header
111− { _name :: Name.Raw
118+ { _kind :: Kind
119+ , _name :: Name.Raw
112120 , _docs :: A.Located (Maybe String)
113121 , _exports :: Var.Listing (A.Located Var.Value)
114122 , _imports :: imports
src/Canonicalize.hs+2−2
@@ -76,7 +76,7 @@ moduleHelp
7676 -> Module.Interfaces
7777 -> Module.ValidModule
7878 -> Result.ResultErr (Env.Environment, AlmostCanonicalModule)
79−moduleHelp importDict interfaces modul@(Module.Module _ _ comment exports _ decls) =
79+moduleHelp importDict interfaces modul@(Module.Module _ _ _ comment exports _ decls) =
8080 canonicalModule
8181 <$> canonicalDeclsResult
8282 <*> resolveExports locals exports
@@ -127,7 +127,7 @@ filterImports
127127 :: Set.Set ModuleName.Raw
128128 -> AlmostCanonicalModule
129129 -> R.Result Warning.Warning e Module.CanonicalModule
130−filterImports uses modul@(Module.Module _ _ _ _ (defaults, imports) _) =
130+filterImports uses modul@(Module.Module _ _ _ _ _ (defaults, imports) _) =
131131 do reducedImports <-
132132 Maybe.catMaybes <$> T.traverse checkImport imports
133133
src/Canonicalize/Setup.hs+1−1
@@ -30,7 +30,7 @@ environment
3030 -> Module.Interfaces
3131 -> Module.ValidModule
3232 -> Result.ResultErr Env.Environment
33−environment importDict interfaces (Module.Module name _ _ _ (defaults, imports) decls) =
33+environment importDict interfaces (Module.Module _ name _ _ _ (defaults, imports) decls) =
3434 let
3535 allImports =
3636 imports ++ map (A.A (error "default import not found")) defaults
src/Elm/Compiler.hs+1−1
@@ -53,7 +53,7 @@ parseDependencies sourceCode =
5353 Result.Err msgs ->
5454 Left $ map (Error . A.map Error.Syntax) msgs
5555
56− Result.Ok (Module.Header name _docs _exports imports) ->
56+ Result.Ok (Module.Header _kind name _docs _exports imports) ->
5757 Right
5858 ( PublicModule.Name name
5959 , map (PublicModule.Name . fst . A.drop) imports
src/Optimize.hs+1−1
@@ -24,7 +24,7 @@ import qualified Reporting.Region as R
2424
2525
2626optimize :: DT.VariantDict -> Module.CanonicalModule -> Module.Optimized
27−optimize variantDict module_@(Module.Module home _ _ _ _ body) =
27+optimize variantDict module_@(Module.Module _ home _ _ _ _ body) =
2828 let
2929 (defs, _) =
3030 flattenLets [] (Module.program body)
src/Parse/Module.hs+39−14
@@ -11,44 +11,69 @@ import Reporting.Annotation as A
1111
1212getModuleName :: String -> Maybe String
1313getModuleName source =
14− case iParse getModuleName source of
15− Right name ->
16− Just name
17−
18− Left _ ->
19− Nothing
20− where
14+ let
2115 getModuleName =
2216 do optional freshLine
23− (names, _) <- moduleDecl
17+ (_, names, _) <- moduleDecl
2418 return (ModuleName.toString names)
19+ in
20+ case iParse getModuleName source of
21+ Right name ->
22+ Just name
23+
24+ Left _ ->
25+ Nothing
2526
2627
2728header :: IParser (Module.Header [Module.UserImport])
2829header =
2930 do optional freshLine
30− (names, exports) <-
31− option (["Main"], Var.openListing) (moduleDecl `followedBy` freshLine)
31+ (kind, names, exports) <-
32+ option
33+ (Module.Normal, ["Main"], Var.openListing)
34+ (moduleDecl `followedBy` freshLine)
35+
3236 docs <-
3337 choice
3438 [ addLocation (Just <$> docComment) `followedBy` freshLine
3539 , addLocation (return Nothing)
3640 ]
41+
3742 imports' <- imports
38− return (Module.Header names docs exports imports')
43+
44+ return (Module.Header kind names docs exports imports')
3945
4046
41−moduleDecl :: IParser ([String], Var.Listing (A.Located Var.Value))
47+moduleDecl :: IParser (Module.Kind, [String], Var.Listing (A.Located Var.Value))
4248moduleDecl =
4349 expecting "a module declaration" $
44− do try (reserved "module")
50+ do
51+ kind <-
52+ choice
53+ [ do try (reserved "module")
54+ return Module.Normal
55+ , do try (reserved "effect")
56+ whitespace
57+ reserved "module"
58+ return Module.Effect
59+ , do reserved "foreign"
60+ whitespace
61+ reserved "effect"
62+ whitespace
63+ reserved "module"
64+ return Module.Foreign
65+ ]
66+
4567 whitespace
4668 names <- dotSep1 capVar <?> "the name of this module"
69+
4770 whitespace
4871 exports <- option Var.openListing (listing (addLocation value))
72+
4973 whitespace
5074 reserved "where"
51− return (names, exports)
75+
76+ return (kind, names, exports)
5277
5378
5479imports :: IParser [Module.UserImport]
src/Parse/Parse.hs+11−5
@@ -20,13 +20,14 @@ import qualified Reporting.Result as Result
2020import qualified Validate
2121
2222
23+
2324program
2425 :: Package.Name
2526 -> OpTable
2627 -> String
2728 -> Result.Result wrn Error.Error M.ValidModule
2829program pkgName table src =
29− do (M.Module name filePath docs exports imports sourceDecls) <-
30+ do (M.Module kind name filePath docs exports imports sourceDecls) <-
3031 parseWithTable table src (programParser pkgName)
3132
3233 validDecls <- Validate.declarations sourceDecls
@@ -37,14 +38,16 @@ program pkgName table src =
3738 , imports
3839 )
3940
40− return (M.Module name filePath docs exports ammendedImports validDecls)
41+ return (M.Module kind name filePath docs exports ammendedImports validDecls)
42+
4143
4244
4345-- HEADERS AND DECLARATIONS
4446
47+
4548programParser :: Package.Name -> IParser M.SourceModule
4649programParser pkgName =
47− do (M.Header name docs exports imports) <- Module.header
50+ do (M.Header kind name docs exports imports) <- Module.header
4851 decls <- declarations
4952 _ <- many (spaces <|> newline)
5053 eof
@@ -52,7 +55,7 @@ programParser pkgName =
5255 let canonicalName =
5356 ModuleName.Canonical pkgName name
5457
55− return $ M.Module canonicalName "" docs exports imports decls
58+ return $ M.Module kind canonicalName "" docs exports imports decls
5659
5760
5861declarations :: IParser [D.SourceDecl]
@@ -68,8 +71,10 @@ freshDef =
6871 Decl.declaration
6972
7073
74+
7175-- RUN PARSERS
7276
77+
7378parse :: String -> IParser a -> Result.Result wrn Error.Error a
7479parse source parser =
7580 case iParse parser source of
@@ -101,6 +106,7 @@ parseWithTable table source parser =
101106
102107-- INFIX INFO
103108
109+
104110makeInfixTable
105111 :: Map.Map String (Int, D.Assoc)
106112 -> [(String, InfixInfo)]
@@ -142,4 +148,4 @@ parseFixities =
142148data InfixInfo = InfixInfo
143149 { _region :: R.Region
144150 , _info :: (Int, D.Assoc)
145− }
151+ }