module Compile (compile) where
import qualified Data.Map as Map
import Text.PrettyPrint (Doc)
import qualified AST.Module as Module
import qualified Parse.Helpers as Parse
import qualified Parse.Parse as Parse
import qualified Transform.AddDefaultImports as DefaultImports
import qualified Transform.Check as Check
import qualified Type.Inference as TI
import qualified Transform.Canonicalize as Canonical
import Elm.Utils ((|>))
compile
:: String
-> String
-> Module.Interfaces
-> String
-> Either [Doc] Module.CanonicalModule
compile user projectName interfaces source =
do
parsedModule <-
Parse.program (getOpTable interfaces) source
let needsDefaults =
not (user == "elm-lang" && projectName == "core")
let rawModule =
DefaultImports.add needsDefaults parsedModule
case Check.mistakes (Module.body rawModule) of
[] -> return ()
ms -> Left ms
canonicalModule <- Canonical.module' interfaces rawModule
types <- TI.infer interfaces canonicalModule
let body = (Module.body canonicalModule) { Module.types = types }
return $ canonicalModule { Module.body = body }
getOpTable :: Module.Interfaces -> Parse.OpTable
getOpTable interfaces =
Map.elems interfaces
|> concatMap Module.iFixities
|> map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
|> Map.fromList