on master help sign in
Modernize code and change Elm.Compiler.comiple API
f473c68Evan Czaplicki
src/Compile.hs+42−17
@@ -4,32 +4,57 @@ import qualified Data.Map as Map
4import Text.PrettyPrint (Doc)
4import Text.PrettyPrint (Doc)
5
5
6import qualified AST.Module as Module
6import qualified AST.Module as Module
7+import qualified Parse.Helpers as Parse
7import qualified Parse.Parse as Parse
8import qualified Parse.Parse as Parse
8import qualified Transform.AddDefaultImports as DefaultImports
9import qualified Transform.AddDefaultImports as DefaultImports
9import qualified Transform.Check as Check
10import qualified Transform.Check as Check
10import qualified Type.Inference as TI
11import qualified Type.Inference as TI
11import qualified Transform.Canonicalize as Canonical
12import qualified Transform.Canonicalize as Canonical
13+import Elm.Utils ((|>))
12
14
13
15
16+compile
17+ :: String
18+ -> String
19+ -> Module.Interfaces
20+ -> String
14−compile :: Bool -> Module.Interfaces -> String -> Either [Doc] Module.CanonicalModule
21+ -> Either [Doc] Module.CanonicalModule
15−compile noPrelude interfaces source =
16− do let infixes = Map.fromList . map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
17− . concatMap Module.iFixities $ Map.elems interfaces
18
22
23+compile user projectName interfaces source =
24+ do
19− -- Parse the source code and validate that it is well formed.
25+ -- Parse the source code
20− validModule <- do
26+ parsedModule <-
21− modul <- DefaultImports.add noPrelude `fmap` Parse.program infixes source
27+ Parse.program (getOpTable interfaces) source
22− case Check.mistakes (Module.body modul) of
23− [] -> return modul
24− ms -> Left ms
25
28
26− -- Canonicalize all variables, pinning down where they came from.
29+ -- determine if default imports should be added
27− canonicalModule <- Canonical.module' interfaces validModule
30+ -- only elm-lang/core is exempt
31+ let needsDefaults =
32+ not (user == "elm-lang" && projectName == "core")
28
33
29− -- Run type inference on the program.
34+ -- add default imports if necessary
30− types <- TI.infer interfaces canonicalModule
35+ let rawModule =
36+ DefaultImports.add needsDefaults parsedModule
31
37
32− -- Add the real list of tyes
38+ -- validate module (e.g. all variables exist)
33− let body = (Module.body canonicalModule) { Module.types = types }
39+ case Check.mistakes (Module.body rawModule) of
40+ [] -> return ()
41+ ms -> Left ms
34
42
43+ -- Canonicalize all variables, pinning down where they came from.
44+ canonicalModule <- Canonical.module' interfaces rawModule
45+
46+ -- Run type inference on the program.
47+ types <- TI.infer interfaces canonicalModule
48+
49+ -- Add the real list of tyes
50+ let body = (Module.body canonicalModule) { Module.types = types }
51+
35− return $ canonicalModule { Module.body = body }
52+ return $ canonicalModule { Module.body = body }
53+
54+
55+getOpTable :: Module.Interfaces -> Parse.OpTable
56+getOpTable interfaces =
57+ Map.elems interfaces
58+ |> concatMap Module.iFixities
59+ |> map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
60+ |> Map.fromList
src/Elm/Compiler.hs+15−6
@@ -11,6 +11,7 @@ import qualified AST.Module as Module (HeaderAndImports(HeaderAndImports), toInt
11import qualified Compile
11import qualified Compile
12import qualified Elm.Compiler.Module as PublicModule
12import qualified Elm.Compiler.Module as PublicModule
13import qualified Elm.Compiler.Version as Version
13import qualified Elm.Compiler.Version as Version
14+import Elm.Utils ((|>))
14import qualified Elm.Utils as Utils
15import qualified Elm.Utils as Utils
15import qualified Generate.JavaScript as JS
16import qualified Generate.JavaScript as JS
16import qualified Parse.Helpers as Help
17import qualified Parse.Helpers as Help
@@ -48,15 +49,23 @@ parseDependencies src =
48{-| Compiles Elm source code to JavaScript. -}
49{-| Compiles Elm source code to JavaScript. -}
49compile
50compile
50 :: String
51 :: String
52+ -> String
53+ -> String
51 -> Map.Map PublicModule.Name PublicModule.Interface
54 -> Map.Map PublicModule.Name PublicModule.Interface
52 -> Either String (PublicModule.Interface, String)
55 -> Either String (PublicModule.Interface, String)
53−compile source interfaces =
56+compile user packageName source interfaces =
54− case Compile.compile False unwrappedInterfaces source of
55− Left docs -> Left . unlines . List.intersperse "" $ map P.render docs
56− Right modul -> Right (Module.toInterface modul, JS.generate modul)
57− where
58− unwrappedInterfaces =
57+ let unwrappedInterfaces =
59 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
58 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
59+ in
60+ case Compile.compile user packageName unwrappedInterfaces source of
61+ Right modul ->
62+ Right (Module.toInterface modul, JS.generate modul)
63+
64+ Left docs ->
65+ map P.render docs
66+ |> List.intersperse ""
67+ |> unlines
68+ |> Left
60
69
61
70
62-- DATA FILES
71-- DATA FILES
src/Transform/AddDefaultImports.hs+2−2
@@ -47,12 +47,12 @@ signal =
47-- ADDING DEFAULT IMPORTS TO A MODULE
47-- ADDING DEFAULT IMPORTS TO A MODULE
48
48
49add :: Bool -> Module.Module exs body -> Module.Module exs body
49add :: Bool -> Module.Module exs body -> Module.Module exs body
50−add noPrelude (Module.Module moduleName path exports imports decls) =
50+add needsDefaults (Module.Module moduleName path exports imports decls) =
51 Module.Module moduleName path exports ammendedImports decls
51 Module.Module moduleName path exports ammendedImports decls
52 where
52 where
53 ammendedImports =
53 ammendedImports =
54 importDictToList $
54 importDictToList $
55− foldr addImport (if noPrelude then Map.empty else defaultImports) imports
55+ foldr addImport (if needsDefaults then defaultImports else Map.empty) imports
56
56
57
57
58importDictToList :: ImportDict -> [(Module.Name, Module.ImportMethod)]
58importDictToList :: ImportDict -> [(Module.Name, Module.ImportMethod)]