@@ -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)