on master help sign in
Collapse Elm.Header into File.Header
commit07acefed5f6cb5248b240c6f0dc270360b103114 authorEvan Czaplicki <evancz@users.noreply.github.com> dateSat 29 Dec 2018, 19:28 (8 years ago) parent7feccac
2 files changed+42−102
builder/src/File/Header.hs+42−29 compiler/src/Elm/Header.hs−73
builder/src/File/Header.hs+42−29
@@ -16,12 +16,18 @@ import qualified Data.Time.Calendar as Day
1616import qualified Data.Time.Clock as Time
1717import qualified System.Directory as Dir
1818
19−import qualified Elm.Header as Header
19+import qualified AST.Source as Src
20+import qualified Elm.Compiler.Imports as Imports
2021import qualified Elm.ModuleName as ModuleName
22+import qualified Elm.Package as Pkg
2123import qualified Elm.Project.Json as Project
2224import Elm.Project.Json (Project)
2325import Elm.Project.Summary (Summary(..))
2426import qualified File.IO as IO
27+import qualified Parse.Module as Module
28+import Parse.Utils (Parser)
29+import qualified Parse.Primitives as P
30+import qualified Reporting.Annotation as A
2531import qualified Reporting.Exit as Exit
2632import qualified Reporting.Exit.Crawl as E
2733import qualified Reporting.Task as Task
@@ -82,7 +88,7 @@ readOneFile summary path =
8288
8389readOneHelp :: FilePath -> Task.Task_ E.Exit (Time.UTCTime, BS.ByteString)
8490readOneHelp path =
85− do exists <- IO.exists path
91+ do exists <- liftIO $ IO.exists path
8692 if exists
8793 then liftIO $ (,) <$> Dir.getModificationTime path <*> IO.readUtf8 path
8894 else Task.throw $ E.RootFileNotFound path
@@ -150,41 +156,48 @@ fakeTime =
150156parse :: Project -> FilePath -> Time.UTCTime -> BS.ByteString -> Task.Task_ E.Problem (Maybe ModuleName.Raw, Info)
151157parse project path time source =
152158 -- TODO get regions on data extracted here
153− case Header.parse (Project.getName project) source of
154− Right (maybeDecl, deps) ->
155− do maybeName <- checkTag project path maybeDecl
159+ case P.fromByteString parser source of
160+ P.Ok (maybeHeader, imports) _ ->
161+ let
162+ deps =
163+ map (\(Src.Import (A.At _ name) _ _) -> name) $
164+ if Project.getName project == Pkg.core
165+ then imports
166+ else Imports.addDefaults imports
167+ in
168+ do maybeName <- checkTag project path maybeHeader
156169 return ( maybeName, Info path time source deps )
157170
158− Left msg ->
159− Task.throw (E.BadHeader path time source msg)
171+ P.Err _ _ _ _ ->
172+ Task.throw (error "TODO give an error on bad headers / stop having a double parse")
173+
174+
175+parser :: Parser (Maybe Module.Header, [Src.Import])
176+parser =
177+ do Module.freshLine
178+ header <- Module.chompHeader
179+ Module.maybeSkipDocComment
180+ imports <- Module.chompImports []
181+ return (header, imports)
160182
161183
162−checkTag :: Project -> FilePath -> Maybe (Header.Tag, ModuleName.Raw) -> Task.Task_ E.Problem (Maybe ModuleName.Raw)
163−checkTag project path maybeDecl =
164− case maybeDecl of
184+checkTag :: Project -> FilePath -> Maybe Module.Header -> Task.Task_ E.Problem (Maybe ModuleName.Raw)
185+checkTag project path maybeHeader =
186+ case maybeHeader of
165187 Nothing ->
166188 return Nothing
167189
168− Just (tag, name) ->
169− let
170− success =
190+ Just (Module.Header name effects _) ->
191+ case effects of
192+ Module.NoEffects _ ->
171193 return (Just name)
172− in
173− case tag of
174− Header.Normal ->
175− success
176194
177− Header.Port ->
195+ Module.Ports _ ->
178196 case project of
179− Project.App _ ->
180− success
181−
182− Project.Pkg _ ->
183− Task.throw (E.PortsInPackage path name)
184−
185− Header.Effect ->
186− if Project.isPlatformPackage project then
187− success
197+ Project.App _ -> return (Just name)
198+ Project.Pkg _ -> Task.throw (E.PortsInPackage path name)
188199
189− else
190− Task.throw (E.EffectsUnexpected path name)
200+ Module.Manager _ _ ->
201+ if Project.isPlatformPackage project
202+ then return (Just name)
203+ else Task.throw (E.EffectsUnexpected path name)
compiler/src/Elm/Header.hsdeleted−73
@@ -1,73 +0,0 @@
1−{-# OPTIONS_GHC -Wall #-}
2−module Elm.Header
3− ( Tag(..)
4− , parse
5− )
6− where
7−
8−
9−import qualified Data.ByteString as B
10−import qualified Data.Name as Name
11−
12−import qualified AST.Source as Src
13−import qualified Elm.ModuleName as ModuleName
14−import qualified Elm.Package as Pkg
15−import qualified Parse.Primitives as Parser
16−import qualified Parse.Module as Module
17−import qualified Reporting.Annotation as A
18−import qualified Reporting.Error as Error
19−
20−
21−
22−-- HEADER TAGS
23−
24−
25−data Tag = Normal | Effect | Port
26−
27−
28−
29−-- PARSE
30−
31−
32−parse :: Pkg.Name -> B.ByteString -> Either Error.Error (Maybe (Tag, ModuleName.Raw), [ModuleName.Raw])
33−parse pkgName sourceCode =
34− let
35− headerParser =
36− Module.module_ pkgName (return ())
37− in
38− case Parser.run headerParser sourceCode of
39− Right (Src.Module header imports _) ->
40− Right
41− ( fmap simplifyHeader header
42− , map getName imports
43− )
44−
45− Left err ->
46− Left (Error.Syntax err)
47−
48−
49−getName :: Src.Import -> Name.Name
50−getName (Src.Import (A.At _ name) _ _) =
51− name
52−
53−
54−
55−-- TO HEADER
56−
57−
58−simplifyHeader :: Src.Header -> (Tag, Name.Name)
59−simplifyHeader (Src.Header name effects _ _) =
60− ( toTag effects, name )
61−
62−
63−toTag :: Src.Effects -> Tag
64−toTag effects =
65− case effects of
66− Src.NoEffects ->
67− Normal
68−
69− Src.Ports _ ->
70− Port
71−
72− Src.Manager _ _ ->
73− Effect