on master help sign in
Add prelude in compiler with flag. Re-add the `hiding` option for modules internally.
commit294fdfdaa5cdf655fcf08907de0849855f08ca73 authorevancz <info@elm-lang.org> dateWed 3 Apr 2013, 00:32 (14 years ago) parent22bfcb8
4 files changed+38−25
compiler/Compiler.hs+14−3 compiler/Gen/CompileToJS.hs+22−20 compiler/Model/Ast.hs+1−1 compiler/Parse/Modules.hs+1−1
compiler/Compiler.hs+14−3
@@ -2,7 +2,7 @@
22module Main where
33
44import Data.Either (lefts, rights)
5−import Data.List (intersect, intercalate)
5+import Data.List (intersect, intercalate,lookup)
66import Data.Maybe (fromMaybe)
77import Data.Version (showVersion)
88import System.Console.CmdArgs
@@ -78,8 +78,6 @@ fileTo flags what rtLoc file = do
7878 let path = fromMaybe "" (output_directory flags) </> file
7979 js = replaceExtension path ".js"
8080 html = replaceExtension path ".html"
81− addPrelude (Module name exs ims stmts) =
82− Module name exs (("Prelude", Importing []) : ims) stmts
8381 ms = if no_prelude flags then ms' else map addPrelude ms'
8482 txt = jss ++ concatMap jsModule ms
8583 in case what of
@@ -89,3 +87,16 @@ fileTo flags what rtLoc file = do
8987 Split ->
9088 do writeFile html . renderHtml $ linkedHtml rtLoc js ms
9189 writeFile js (formatJS txt)
90+
91+addPrelude (Module name exs ims stmts) = Module name exs (prelude ++ ims) stmts
92+ where prelude = concatMap addModule allModules
93+
94+ addModule (n, method) = case lookup n ims of
95+ Nothing -> [(n, method)]
96+ Just _ -> []
97+ modules = [ "Prelude", "Signal", "List", "Maybe"
98+ , "Time", "Graphics.Element", "Graphics.Color" ]
99+
100+ text = ("Graphics.Text", Hiding ["link", "color"])
101+
102+ allModules = text : map (\n -> (n, Hiding [])) modules
compiler/Gen/CompileToJS.hs+22−20
@@ -36,6 +36,7 @@ internalImports =
3636
3737parens s = "(" ++ s ++ ")"
3838brackets s = "{" ++ s ++ "}"
39+jsObj = brackets . intercalate ", "
3940jsList ss = "["++ intercalate "," ss ++"]"
4041jsFunc args body = "function(" ++ args ++ "){" ++ indent body ++ "}"
4142assign x e = "\nvar " ++ x ++ " = " ++ e ++ ";"
@@ -79,7 +80,7 @@ getExports names stmts = "\n"++ intercalate ";\n" (op : map fnPair fns)
7980 opPair op = "'" ++ op ++ "' : $op['" ++ op ++ "']"
8081 fnPair fn = let fn' = derename fn in "_." ++ fn' ++ " = " ++ fn
8182
82− op = ("_.$op = "++) . brackets . intercalate ", " $ map opPair ops
83+ op = ("_.$op = "++) . jsObj $ map opPair ops
8384
8485 get' (FnDef x _ _) = Left x
8586 get' (OpDef op _ _ _) = Right op
@@ -94,25 +95,26 @@ getExports names stmts = "\n"++ intercalate ";\n" (op : map fnPair fns)
9495jsImport (modul, how) =
9596 case how of
9697 As name -> assign name ("Elm." ++ modul ++ parens "elm")
97− Importing vs ->
98− "\nvar $ = Elm." ++ modul ++ parens "elm" ++ ";" ++ setup modul ++
99− if null vs then "\nfor (var k in $) {eval('var '+k+'=$[\"'+k+'\"]')}"
100− else "\nvar " ++ intercalate ", " (map def vs) ++ ";"
98+ Hiding vs -> include ++ " var hiding=" ++ (jsObj $ map (++":1") vs) ++
99+ "; for(var k in _){if(k in hiding)continue;" ++
100+ "eval('var '+k+'=_[\"'+k+'\"]')}"
101+ Importing vs -> include ++ "\nvar " ++ intercalate ", " (map def vs) ++ ";"
102+ where
103+ imprt v = assign' v ("_." ++ v)
104+ def (o:p) = imprt (if isOp o then "$op['" ++ o:p ++ "']" else deprime (o:p))
105+ where
106+ include = "\nvar _ = Elm." ++ modul ++ parens "elm" ++ ";" ++ setup modul
107+ setup moduleName = " var " ++ concatMap (++";") (defs ++ [assign' moduleName "_"])
101108 where
102− imprt v = assign' v ("$." ++ v)
103− def (o:p) = imprt (if isOp o then "$op['" ++ o:p ++ "']" else deprime (o:p))
104− setup moduleName =
105− "\nvar " ++ concatMap (++";") (defs ++ [assign' moduleName "$"])
106− where
107− defs = map (\n -> assign' n (n ++ "||{}")) (subnames moduleName)
108− subnames = map (intercalate ".") . tail . inits . init . split
109− split names = case go [] names of
110− (name, []) -> [name]
111− (name, ns) -> name : split ns
112− go name str = case str of
113− '.':rest -> (reverse name, rest)
114− c:rest -> go (c:name) rest
115− [] -> (reverse name, [])
109+ defs = map (\n -> assign' n (n ++ "||{}")) (subnames moduleName)
110+ subnames = map (intercalate ".") . tail . inits . init . split
111+ split names = case go [] names of
112+ (name, []) -> [name]
113+ (name, ns) -> name : split ns
114+ go name str = case str of
115+ '.':rest -> (reverse name, rest)
116+ c:rest -> go (c:name) rest
117+ [] -> (reverse name, [])
116118
117119
118120
@@ -226,7 +228,7 @@ instance ToJS Expr where
226228 return $ case name of
227229 "Nil" -> jsNil
228230 "Cons" -> jsCons (head fs) ((head . tail) fs)
229− _ -> brackets $ "ctor:" ++ show name ++ concatMap (", "++) fields
231+ _ -> jsObj $ ("ctor:" ++ show name) : fields
230232 where fields = zipWith (\n e -> "_" ++ show n ++ ":" ++ e) [0..] fs
231233
232234 Markdown doc -> return $ "text('" ++ pad ++ md ++ pad ++ "')"
compiler/Model/Ast.hs+1−1
@@ -12,7 +12,7 @@ data Module = Module [String] Exports Imports [Statement]
1212type Exports = [String]
1313
1414type Imports = [(String, ImportMethod)]
15−data ImportMethod = As String | Importing [String]
15+data ImportMethod = As String | Importing [String] | Hiding [String]
1616 deriving (Eq,Ord)
1717
1818
compiler/Parse/Modules.hs+1−1
@@ -31,7 +31,7 @@ import' = do
3131 reserved "import"
3232 whitespace
3333 name <- intercalate "." <$> dotSep1 capVar
34− method <- option (Importing []) $ try (whitespace >> (as' <|> importing'))
34+ method <- option (Hiding []) $ try (whitespace >> (as' <|> importing'))
3535 return (name, method)
3636
3737