on master help sign in
Merge pull request #1082 from elm-lang/dev
c3080d9Evan Czaplicki
src/Generate/JavaScript.hs+5−7
@@ -97,13 +97,11 @@ assign path expr =
97
97
98imports :: [ModuleName.Raw] -> [Statement ()]
98imports :: [ModuleName.Raw] -> [Statement ()]
99imports rawImports =
99imports rawImports =
100− case rawImports of
100+ let
101− [] ->
101+ utils =
102− []
102+ varDecl "_U" (call (obj ["Elm", "Native", "Utils", "make"]) [ref localRuntime])
103−
103+ in
104− _ ->
105− [ VarDeclStmt () (map jsImport rawImports)
104+ [ VarDeclStmt () (utils : map jsImport rawImports) ]
106− ]
107
105
108
106
109jsImport :: ModuleName.Raw -> VarDecl ()
107jsImport :: ModuleName.Raw -> VarDecl ()
src/Generate/JavaScript/BuiltIn.hs+9−10
@@ -1,5 +1,6 @@
1module Generate.JavaScript.BuiltIn where
1module Generate.JavaScript.BuiltIn where
2
2
3+import Control.Arrow (first)
3import qualified Language.ECMAScript3.Syntax as JS
4import qualified Language.ECMAScript3.Syntax as JS
4
5
5import Generate.JavaScript.Helpers
6import Generate.JavaScript.Helpers
@@ -8,7 +9,7 @@ import qualified Reporting.Region as R
8
9
9utils :: String -> [JS.Expression ()] -> JS.Expression ()
10utils :: String -> [JS.Expression ()] -> JS.Expression ()
10utils func args =
11utils func args =
11− obj ["_utils", func] `call` args
12+ obj ["_U", func] `call` args
12
13
13
14
14-- LITERALS
15-- LITERALS
@@ -39,12 +40,10 @@ range low high =
39
40
40recordUpdate :: JS.Expression () -> [(String, JS.Expression ())] -> JS.Expression ()
41recordUpdate :: JS.Expression () -> [(String, JS.Expression ())] -> JS.Expression ()
41recordUpdate record fields =
42recordUpdate record fields =
42− utils "update" [ record, JS.ArrayLit () (map toKeyValue fields) ]
43+ utils "update"
43−
44+ [ record
44−
45+ , JS.ObjectLit () (map (first prop) fields)
45−toKeyValue :: (String, JS.Expression ()) -> JS.Expression ()
46+ ]
46−toKeyValue (key, value) =
47− JS.ArrayLit () [ JS.StringLit () key, value ]
48
47
49
48
50-- COMPARISIONS
49-- COMPARISIONS
@@ -54,9 +53,9 @@ eq left right =
54 utils "eq" [ left, right ]
53 utils "eq" [ left, right ]
55
54
56
55
57−compare :: JS.Expression () -> JS.Expression () -> JS.Expression ()
56+cmp :: JS.Expression () -> JS.Expression () -> JS.Expression ()
58−compare left right =
57+cmp left right =
59− utils "compare" [ left, right ]
58+ utils "cmp" [ left, right ]
60
59
61
60
62-- CRASH
61-- CRASH
src/Generate/JavaScript/Expression.hs+3−3
@@ -1,7 +1,7 @@
1module Generate.JavaScript.Expression (generateDef) where
1module Generate.JavaScript.Expression (generateDef) where
2
2
3−import Control.Arrow (first, second, (***))
3+import Control.Arrow (second)
4−import Control.Monad.State (State, forM, foldM)
4+import Control.Monad.State (State, foldM)
5import qualified Data.List as List
5import qualified Data.List as List
6import qualified Data.Map as Map
6import qualified Data.Map as Map
7import Language.ECMAScript3.Syntax
7import Language.ECMAScript3.Syntax
@@ -517,4 +517,4 @@ specialOps =
517
517
518cmp :: InfixOp -> Int -> Expression () -> Expression () -> Expression ()
518cmp :: InfixOp -> Int -> Expression () -> Expression () -> Expression ()
519cmp op n a b =
519cmp op n a b =
520− InfixExpr () op (BuiltIn.compare a b) (IntLit () n)
520+ InfixExpr () op (BuiltIn.cmp a b) (IntLit () n)
src/Type/Unify.hs+3−3
@@ -51,8 +51,8 @@ typeError
51 -> Maybe String
51 -> Maybe String
52 -> Unify a
52 -> Unify a
53typeError leftType rightType note =
53typeError leftType rightType note =
54− do leftSrcType <- liftIO (toSrcType leftType)
54+ do leftSrcType <- liftIO (Type.toSrcType leftType)
55− rightSrcType <- liftIO (toSrcType rightType)
55+ rightSrcType <- liftIO (Type.toSrcType rightType)
56 liftIO $ do
56 liftIO $ do
57 UF.setDescriptor leftType (Type.descriptor Error)
57 UF.setDescriptor leftType (Type.descriptor Error)
58 UF.setDescriptor rightType (Type.descriptor Error)
58 UF.setDescriptor rightType (Type.descriptor Error)
@@ -129,7 +129,7 @@ actuallyUnify variable1 variable2 = do
129
129
130 Var.TopLevel _ | List.isPrefixOf "number" name ->
130 Var.TopLevel _ | List.isPrefixOf "number" name ->
131 flexAndUnify svar
131 flexAndUnify svar
132−
132+
133 _ ->
133 _ ->
134 typeError variable1 variable2 Nothing
134 typeError variable1 variable2 Nothing
135
135
tests/test-files/good-expected-js/AliasSubstitution.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var extractVec = function (v) { return {x: v.x,y: v.y};};
8 var extractVec = function (v) { return {x: v.x,y: v.y};};
8 return _elm.Main.values = {_op: _op,extractVec: extractVec};
9 return _elm.Main.values = {_op: _op,extractVec: extractVec};
tests/test-files/good-expected-js/CaseExpression3.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var Cons = F2(function (a,b) {
8 var Cons = F2(function (a,b) {
8 return {ctor: "Cons",_0: a,_1: b};
9 return {ctor: "Cons",_0: a,_1: b};
tests/test-files/good-expected-js/Lists/EmptyList.elm.js+2−1
@@ -3,7 +3,8 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7− var emptyList = _utils.list([]);
8+ var emptyList = _U.list([]);
8 return _elm.Main.values = {_op: _op,emptyList: emptyList};
9 return _elm.Main.values = {_op: _op,emptyList: emptyList};
9};
10};
tests/test-files/good-expected-js/Lists/ListRange.elm.js+2−1
@@ -3,7 +3,8 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7− var listRange = _utils.range(2,10);
8+ var listRange = _U.range(2,10);
8 return _elm.Main.values = {_op: _op,listRange: listRange};
9 return _elm.Main.values = {_op: _op,listRange: listRange};
9};
10};
tests/test-files/good-expected-js/Lists/NonEmptyList.elm.js+2−1
@@ -3,7 +3,8 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7− var nonEmptyList = _utils.list([1,4,5]);
8+ var nonEmptyList = _U.list([1,4,5]);
8 return _elm.Main.values = {_op: _op,nonEmptyList: nonEmptyList};
9 return _elm.Main.values = {_op: _op,nonEmptyList: nonEmptyList};
9};
10};
tests/test-files/good-expected-js/NoExpressions.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 return _elm.Main.values = {_op: _op};
8 return _elm.Main.values = {_op: _op};
8};
9};
tests/test-files/good-expected-js/Otherwise.elm.js+1
@@ -3,6 +3,7 @@ Elm.Otherwise.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Otherwise = _elm.Otherwise || {};
4 _elm.Otherwise = _elm.Otherwise || {};
5 if (_elm.Otherwise.values) return _elm.Otherwise.values;
5 if (_elm.Otherwise.values) return _elm.Otherwise.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var boo = false ? "Yay" : "Boo";
8 var boo = false ? "Yay" : "Boo";
8 var otherwise = 3;
9 var otherwise = 3;
tests/test-files/good-expected-js/Ports.elm.js+2−1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var students = Elm.Native.Port.make(_elm).outbound("students",
8 var students = Elm.Native.Port.make(_elm).outbound("students",
8 function (v) {
9 function (v) {
@@ -10,7 +11,7 @@ Elm.Main.make = function (_elm) {
10 return {name: v.name,age: v.age};
11 return {name: v.name,age: v.age};
11 });
12 });
12 },
13 },
13− _utils.list([{name: "Tom",age: 42}]));
14+ _U.list([{name: "Tom",age: 42}]));
14 var time = Elm.Native.Port.make(_elm).outbound("time",
15 var time = Elm.Native.Port.make(_elm).outbound("time",
15 function (v) {
16 function (v) {
16 return v;
17 return v;
tests/test-files/good-expected-js/PortsWithTypeAliases.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var pairs = Elm.Native.Port.make(_elm).inbound("pairs",
8 var pairs = Elm.Native.Port.make(_elm).inbound("pairs",
8 "Main.Point String String",
9 "Main.Point String String",
tests/test-files/good-expected-js/QuotesAndComments.elm.js+3−2
@@ -3,10 +3,11 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var commentStart = "{-";
8 var commentStart = "{-";
8− var singleQuote = _utils.chr("\'");
9+ var singleQuote = _U.chr("\'");
9− var doubleQuote = _utils.chr("\"");
10+ var doubleQuote = _U.chr("\"");
10 var variablesWithPrimes = function (x) {
11 var variablesWithPrimes = function (x) {
11 var x$ = x;
12 var x$ = x;
12 return x$;
13 return x$;
tests/test-files/good-expected-js/Soundness/Apply.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var apply = function (f) {
8 var apply = function (f) {
8 var g = function (x) { return f(x);};
9 var g = function (x) { return f(x);};
tests/test-files/good-expected-js/Soundness/ApplyAnnotated.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var apply = function (f) {
8 var apply = function (f) {
8 var g = function (x) { return f(x);};
9 var g = function (x) { return f(x);};
tests/test-files/good-expected-js/Soundness/Id.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var myId = function () {
8 var myId = function () {
8 var id = function (x) { return x;};
9 var id = function (x) { return x;};
tests/test-files/good-expected-js/Soundness/IdAnnotated.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var myId = function () {
8 var myId = function () {
8 var id = function (x) { return x;};
9 var id = function (x) { return x;};
tests/test-files/good-expected-js/Soundness/TrickyId.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var myId = function (x) { var y = x;return y;};
8 var myId = function (x) { var y = x;return y;};
8 return _elm.Main.values = {_op: _op,myId: myId};
9 return _elm.Main.values = {_op: _op,myId: myId};
tests/test-files/good-expected-js/Soundness/TrickyIdAnnotated.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var myId = function (x) { var y = x;return y;};
8 var myId = function (x) { var y = x;return y;};
8 return _elm.Main.values = {_op: _op,myId: myId};
9 return _elm.Main.values = {_op: _op,myId: myId};
tests/test-files/good-expected-js/Strings/Multiline.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var s = "\nhere\'s a quote: \"\n\n";
8 var s = "\nhere\'s a quote: \"\n\n";
8 return _elm.Main.values = {_op: _op,s: s};
9 return _elm.Main.values = {_op: _op,s: s};
tests/test-files/good-expected-js/Strings/MultilineNormal.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var s = "\nhere\'s a quote: \"\n\n";
8 var s = "\nhere\'s a quote: \"\n\n";
8 return _elm.Main.values = {_op: _op,s: s};
9 return _elm.Main.values = {_op: _op,s: s};
tests/test-files/good-expected-js/TailRecursive.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var any = F2(function (f,l) {
8 var any = F2(function (f,l) {
8 any: while (true) {
9 any: while (true) {
tests/test-files/good-expected-js/Unify/NonHomogeneousRecords.elm.js+1
@@ -3,6 +3,7 @@ Elm.Main.make = function (_elm) {
3 "use strict";
3 "use strict";
4 _elm.Main = _elm.Main || {};
4 _elm.Main = _elm.Main || {};
5 if (_elm.Main.values) return _elm.Main.values;
5 if (_elm.Main.values) return _elm.Main.values;
6+ var _U = Elm.Native.Utils.make(_elm);
6 var _op = {};
7 var _op = {};
7 var f = function (t) { var y = t.y;var x = t.x;return t;};
8 var f = function (t) { var y = t.y;var x = t.x;return t;};
8 var Thing = F2(function (a,b) { return {x: a,y: b};});
9 var Thing = F2(function (a,b) { return {x: a,y: b};});