on master help sign in
Have header parser return Maybe, not default value

This way we can tell if the user has that line or not. Depending on the situation, elm-make will want to do different things.

commit7bb1738925542d99b8aa666baff5a4ca27ce5c4a authorEvan Czaplicki <evancz@users.noreply.github.com> dateFri 17 Mar 2017, 15:18 (10 years ago) parent357b7e4
4 files changed+57−39
src/AST/Module.hs+16−10 src/Elm/Compiler.hs+20−15 src/Parse/Module.hs+16−13 src/Parse/Parse.hs+5−1
src/AST/Module.hs+16−10
@@ -1,7 +1,8 @@
11{-# OPTIONS_GHC -Wall #-}
22{-# LANGUAGE OverloadedStrings #-}
33module AST.Module
4− ( Header(..), defaultHeader, Module(..)
4+ ( Header(..), HeaderDecl(..), defaultHeaderDecl
5+ , Module(..)
56
67 , Source, SourceInfo(..), SourceTag(..), SourceSettings, emptySettings
78 , Valid, ValidInfo(..)
@@ -40,23 +41,28 @@ import qualified Reporting.Region as R
4041{-| Basic info needed to identify modules and determine dependencies. -}
4142data Header imports =
4243 Header
44+ { _decl :: Maybe HeaderDecl
45+ , _imports :: imports
46+ }
47+
48+
49+data HeaderDecl =
50+ HeaderDecl
4351 { _tag :: SourceTag
4452 , _name :: Name.Raw
4553 , _exports :: Var.Listing (A.Located Var.Value)
4654 , _settings :: SourceSettings
4755 , _docs :: A.Located (Maybe Text)
48− , _imports :: imports
4956 }
5057
5158
52−instance Show (Header a) where
53− show header =
54− show (_name header)
55−
56−
57−defaultHeader :: R.Position -> R.Position -> imports -> Header imports
58−defaultHeader start end imports_ =
59− Header Normal "Main" Var.openListing emptySettings (A.at start end Nothing) imports_
59+defaultHeaderDecl :: HeaderDecl
60+defaultHeaderDecl =
61+ let
62+ zero = R.Position 1 1
63+ noDocs = A.at zero zero Nothing
64+ in
65+ HeaderDecl Normal "Main" Var.openListing emptySettings noDocs
6066
6167
6268
src/Elm/Compiler.hs+20−15
@@ -55,7 +55,7 @@ data Tag
5555 | Port
5656
5757
58−parseDependencies :: Package.Name -> Text -> Either Error (Tag, M.Raw, [M.Raw])
58+parseDependencies :: Package.Name -> Text -> Either Error (Tag, Maybe M.Raw, [M.Raw])
5959parseDependencies pkgName sourceCode =
6060 case Parse.run Parse.header sourceCode of
6161 Right header ->
@@ -65,22 +65,27 @@ parseDependencies pkgName sourceCode =
6565 Left (Error (A.map Error.Syntax err))
6666
6767
68−getDeps :: Package.Name -> Module.Header [Module.UserImport] -> (Tag, M.Raw, [M.Raw])
69−getDeps pkgName (Module.Header sourceTag name _ _ _ imports) =
68+getDeps :: Package.Name -> Module.Header [Module.UserImport] -> (Tag, Maybe M.Raw, [M.Raw])
69+getDeps pkgName (Module.Header maybeHeaderDecl imports) =
7070 let
71− tag =
72− case sourceTag of
73− Module.Normal -> Normal
74− Module.Port _ -> Port
75− Module.Effect _ -> Effect
76−
77− deps =
78− if pkgName == Package.core then
79− map (fst . A.drop) imports
80− else
81− map (fst . A.drop) imports ++ map fst Imports.defaults
71+ dependencies =
72+ if pkgName == Package.core
73+ then map (fst . A.drop) imports
74+ else map (fst . A.drop) imports ++ map fst Imports.defaults
8275 in
83− ( tag, name, deps )
76+ case maybeHeaderDecl of
77+ Nothing ->
78+ ( Normal, Nothing, dependencies )
79+
80+ Just (Module.HeaderDecl sourceTag name _ _ _) ->
81+ let
82+ tag =
83+ case sourceTag of
84+ Module.Normal -> Normal
85+ Module.Port _ -> Port
86+ Module.Effect _ -> Effect
87+ in
88+ ( tag, Just name, dependencies )
8489
8590
8691
src/Parse/Module.hs+16−13
@@ -18,22 +18,26 @@ import qualified Reporting.Region as R
1818
1919header :: Parser (Module.Header [Module.UserImport])
2020header =
21− do start <- getPosition
22− freshLine
23− end <- getPosition
24− oneOf
25− [ fullHeader end
26− , Module.defaultHeader start end <$> chompImports []
27− ]
21+ do freshLine
22+ Module.Header <$> maybeHeaderDecl <*> chompImports []
2823
2924
3025
31−-- FULL HEADER
26+-- HEADER DECL
3227
3328
34−fullHeader :: R.Position -> Parser (Module.Header [Module.UserImport])
35−fullHeader start =
36− do pushContext start E.Module
29+maybeHeaderDecl :: Parser (Maybe Module.HeaderDecl)
30+maybeHeaderDecl =
31+ oneOf
32+ [ Just <$> headerDecl
33+ , return Nothing
34+ ]
35+
36+
37+headerDecl :: Parser Module.HeaderDecl
38+headerDecl =
39+ do start <- getPosition
40+ pushContext start E.Module
3741 tag <- sourceTag
3842 spaces
3943 name <- qualifiedCapVar
@@ -44,8 +48,7 @@ fullHeader start =
4448 exports <- listing (addLocation listingValue)
4549 popContext ()
4650 docs <- maybeDocComment
47− imports <- chompImports []
48− return (Module.Header tag name exports settings docs imports)
51+ return (Module.HeaderDecl tag name exports settings docs)
4952
5053
5154
src/Parse/Parse.hs+5−1
@@ -32,9 +32,13 @@ program pkgName src =
3232
3333chompProgram :: Package.Name -> Parser Module.Source
3434chompProgram pkgName =
35− do (Module.Header tag name exports settings docs imports) <- Parse.header
35+ do (Module.Header maybeHeaderDecl imports) <- Parse.header
3636 decls <- chompDeclarations []
3737 endOfFile
38+
39+ let (Module.HeaderDecl tag name exports settings docs) =
40+ maybe Module.defaultHeaderDecl id maybeHeaderDecl
41+
3842 let moduleName = ModuleName.Canonical pkgName name
3943 let source = Module.Source tag settings docs exports imports decls
4044 return (Module.Module moduleName source)