@@ -16,12 +16,18 @@ import qualified Data.Time.Calendar as Day
16import qualified Data.Time.Clock as Time
16import qualified Data.Time.Clock as Time
17import qualified System.Directory as Dir
17import qualified System.Directory as Dir
19−import qualified Elm.Header as Header
19+import qualified AST.Source as Src
20+import qualified Elm.Compiler.Imports as Imports
20import qualified Elm.ModuleName as ModuleName
21import qualified Elm.ModuleName as ModuleName
22+import qualified Elm.Package as Pkg
21import qualified Elm.Project.Json as Project
23import qualified Elm.Project.Json as Project
22import Elm.Project.Json (Project)
24import Elm.Project.Json (Project)
23import Elm.Project.Summary (Summary(..))
25import Elm.Project.Summary (Summary(..))
24import qualified File.IO as IO
26import 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
25import qualified Reporting.Exit as Exit
31import qualified Reporting.Exit as Exit
26import qualified Reporting.Exit.Crawl as E
32import qualified Reporting.Exit.Crawl as E
27import qualified Reporting.Task as Task
33import qualified Reporting.Task as Task
@@ -82,7 +88,7 @@ readOneFile summary path =
83readOneHelp :: FilePath -> Task.Task_ E.Exit (Time.UTCTime, BS.ByteString)
89readOneHelp :: FilePath -> Task.Task_ E.Exit (Time.UTCTime, BS.ByteString)
84readOneHelp path =
90readOneHelp path =
85− do exists <- IO.exists path
91+ do exists <- liftIO $ IO.exists path
87 then liftIO $ (,) <$> Dir.getModificationTime path <*> IO.readUtf8 path
93 then liftIO $ (,) <$> Dir.getModificationTime path <*> IO.readUtf8 path
88 else Task.throw $ E.RootFileNotFound path
94 else Task.throw $ E.RootFileNotFound path
@@ -150,41 +156,48 @@ fakeTime =
150parse :: Project -> FilePath -> Time.UTCTime -> BS.ByteString -> Task.Task_ E.Problem (Maybe ModuleName.Raw, Info)
156parse :: Project -> FilePath -> Time.UTCTime -> BS.ByteString -> Task.Task_ E.Problem (Maybe ModuleName.Raw, Info)
151parse project path time source =
157parse project path time source =
152 -- TODO get regions on data extracted here
158 -- TODO get regions on data extracted here
153− case Header.parse (Project.getName project) source of
159+ case P.fromByteString parser source of
154− Right (maybeDecl, deps) ->
160+ P.Ok (maybeHeader, imports) _ ->
163+ map (\(Src.Import (A.At _ name) _ _) -> name) $
164+ if Project.getName project == Pkg.core
166+ else Imports.addDefaults imports
155− do maybeName <- checkTag project path maybeDecl
168+ do maybeName <- checkTag project path maybeHeader
156 return ( maybeName, Info path time source deps )
169 return ( maybeName, Info path time source deps )
158− Left msg ->
171+ P.Err _ _ _ _ ->
159− Task.throw (E.BadHeader path time source msg)
172+ Task.throw (error "TODO give an error on bad headers / stop having a double parse")
175+parser :: Parser (Maybe Module.Header, [Src.Import])
178+ header <- Module.chompHeader
179+ Module.maybeSkipDocComment
180+ imports <- Module.chompImports []
181+ return (header, imports)
162−checkTag :: Project -> FilePath -> Maybe (Header.Tag, ModuleName.Raw) -> Task.Task_ E.Problem (Maybe ModuleName.Raw)
184+checkTag :: Project -> FilePath -> Maybe Module.Header -> Task.Task_ E.Problem (Maybe ModuleName.Raw)
163−checkTag project path maybeDecl =
185+checkTag project path maybeHeader =
164− case maybeDecl of
186+ case maybeHeader of
165 Nothing ->
187 Nothing ->
166 return Nothing
188 return Nothing
168− Just (tag, name) ->
190+ Just (Module.Header name effects _) ->
169− let
191+ case effects of
170− success =
192+ Module.NoEffects _ ->
171 return (Just name)
193 return (Just name)
177− Header.Port ->
195+ Module.Ports _ ->
178 case project of
196 case project of
179− Project.App _ ->
197+ Project.App _ -> return (Just name)
183− Task.throw (E.PortsInPackage path name)
198+ Project.Pkg _ -> Task.throw (E.PortsInPackage path name)
186− if Project.isPlatformPackage project then
189− else
200+ Module.Manager _ _ ->
201+ if Project.isPlatformPackage project
202+ then return (Just name)
190− Task.throw (E.EffectsUnexpected path name)
203+ else Task.throw (E.EffectsUnexpected path name)