on master help sign in
Modernize code and change Elm.Compiler.comiple API

Someday, it will be necessary to generate source code that knows which package each module came from. As is, it’s possible for two unexposed modules in different packages to interfere with each other. This new API points to how things will be once that is fixed.

commitf473c685a33cfed9c48ae25f3961651d261b501c authorEvan Czaplicki <info@elm-lang.org> dateMon 10 Nov 2014, 18:53 (12 years ago) parented1aeb6
3 files changed+59−25
src/Compile.hs+42−17 src/Elm/Compiler.hs+15−6 src/Transform/AddDefaultImports.hs+2−2
src/Compile.hs+42−17
@@ -4,32 +4,57 @@ import qualified Data.Map as Map
44import Text.PrettyPrint (Doc)
55
66import qualified AST.Module as Module
7+import qualified Parse.Helpers as Parse
78import qualified Parse.Parse as Parse
89import qualified Transform.AddDefaultImports as DefaultImports
910import qualified Transform.Check as Check
1011import qualified Type.Inference as TI
1112import qualified Transform.Canonicalize as Canonical
13+import Elm.Utils ((|>))
1214
1315
14−compile :: Bool -> Module.Interfaces -> String -> 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
16+compile
17+ :: String
18+ -> String
19+ -> Module.Interfaces
20+ -> String
21+ -> Either [Doc] Module.CanonicalModule
1822
19− -- Parse the source code and validate that it is well formed.
20− validModule <- do
21− modul <- DefaultImports.add noPrelude `fmap` Parse.program infixes source
22− case Check.mistakes (Module.body modul) of
23− [] -> return modul
24− ms -> Left ms
23+compile user projectName interfaces source =
24+ do
25+ -- Parse the source code
26+ parsedModule <-
27+ Parse.program (getOpTable interfaces) source
2528
26− -- Canonicalize all variables, pinning down where they came from.
27− canonicalModule <- Canonical.module' interfaces validModule
29+ -- determine if default imports should be added
30+ -- only elm-lang/core is exempt
31+ let needsDefaults =
32+ not (user == "elm-lang" && projectName == "core")
2833
29− -- Run type inference on the program.
30− types <- TI.infer interfaces canonicalModule
34+ -- add default imports if necessary
35+ let rawModule =
36+ DefaultImports.add needsDefaults parsedModule
3137
32− -- Add the real list of tyes
33− let body = (Module.body canonicalModule) { Module.types = types }
38+ -- validate module (e.g. all variables exist)
39+ case Check.mistakes (Module.body rawModule) of
40+ [] -> return ()
41+ ms -> Left ms
3442
35− return $ canonicalModule { Module.body = body }
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+
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
1111import qualified Compile
1212import qualified Elm.Compiler.Module as PublicModule
1313import qualified Elm.Compiler.Version as Version
14+import Elm.Utils ((|>))
1415import qualified Elm.Utils as Utils
1516import qualified Generate.JavaScript as JS
1617import qualified Parse.Helpers as Help
@@ -48,15 +49,23 @@ parseDependencies src =
4849{-| Compiles Elm source code to JavaScript. -}
4950compile
5051 :: String
52+ -> String
53+ -> String
5154 -> Map.Map PublicModule.Name PublicModule.Interface
5255 -> Either String (PublicModule.Interface, String)
53−compile 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 =
56+compile user packageName source interfaces =
57+ let unwrappedInterfaces =
5958 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
6069
6170
6271-- DATA FILES
src/Transform/AddDefaultImports.hs+2−2
@@ -47,12 +47,12 @@ signal =
4747-- ADDING DEFAULT IMPORTS TO A MODULE
4848
4949add :: 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) =
5151 Module.Module moduleName path exports ammendedImports decls
5252 where
5353 ammendedImports =
5454 importDictToList $
55− foldr addImport (if noPrelude then Map.empty else defaultImports) imports
55+ foldr addImport (if needsDefaults then defaultImports else Map.empty) imports
5656
5757
5858importDictToList :: ImportDict -> [(Module.Name, Module.ImportMethod)]