diff --git a/snippets/Nemerle.WUI.Reactive/MVCTest/Controllers/HomeController.n b/snippets/Nemerle.WUI.Reactive/MVCTest/Controllers/HomeController.n index 68680ecd81..6e1b9d6095 100644 --- a/snippets/Nemerle.WUI.Reactive/MVCTest/Controllers/HomeController.n +++ b/snippets/Nemerle.WUI.Reactive/MVCTest/Controllers/HomeController.n @@ -12,7 +12,7 @@ namespace MVCTest.Controllers { public Index() : ActionResult { - Content(Utils.MakePageHtml(BetterListViewModel("", ["Fries", "Eggs Benedict", "Ham", "Cheese"], ["Ham"]), Views.BetterListView)); + Content("" /*Utils.MakePageHtml(BetterListViewModel("", ["Fries", "Eggs Benedict", "Ham", "Cheese"], ["Ham"]), Views.BetterListView)*/); } public Tutorial() : ActionResult diff --git a/snippets/Nemerle.WUI.Reactive/MVCTest/MVCTest.nproj b/snippets/Nemerle.WUI.Reactive/MVCTest/MVCTest.nproj index e41950742a..bde4260186 100644 --- a/snippets/Nemerle.WUI.Reactive/MVCTest/MVCTest.nproj +++ b/snippets/Nemerle.WUI.Reactive/MVCTest/MVCTest.nproj @@ -286,6 +286,12 @@ Content + + Content + + + Content + Content diff --git a/snippets/Nemerle.WUI.Reactive/MVCTest/MVVM/BetterList.n b/snippets/Nemerle.WUI.Reactive/MVCTest/MVVM/BetterList.n index e10848a9b3..1e5972f9ed 100644 --- a/snippets/Nemerle.WUI.Reactive/MVCTest/MVVM/BetterList.n +++ b/snippets/Nemerle.WUI.Reactive/MVCTest/MVVM/BetterList.n @@ -12,7 +12,7 @@ using System.Xml.Linq; namespace MVCTest { - [Record, ViewModel] + [Record, /*ViewModel*/] public class BetterListViewModel { public ItemToAdd : string { get; set; } diff --git a/snippets/Nemerle.WUI.Reactive/MVCTest/MVVM/Tutorial_1_Introduction.n b/snippets/Nemerle.WUI.Reactive/MVCTest/MVVM/Tutorial_1_Introduction.n index 965f9066a7..7fd912ed78 100644 --- a/snippets/Nemerle.WUI.Reactive/MVCTest/MVVM/Tutorial_1_Introduction.n +++ b/snippets/Nemerle.WUI.Reactive/MVCTest/MVVM/Tutorial_1_Introduction.n @@ -17,7 +17,7 @@ namespace MVCTest { public FirstName : string { get; set; } public LastName : string { get; set; } - public FullName : string { get { FirstName + LastName } } + public FullName : string { get { FirstName + " " + LastName } } CapitalizeLastName() : void { @@ -33,13 +33,13 @@ namespace MVCTest _ = viewModel; xml <#
-

First name:

-

Last name:

+

First name:

+

Last name:

First name:

Last name:

-

Full name:

+

Full name:

diff --git a/snippets/Nemerle.WUI.Reactive/MVCTest/Scripts/knockout-2.1.0.debug.js b/snippets/Nemerle.WUI.Reactive/MVCTest/Scripts/knockout-2.1.0.debug.js new file mode 100644 index 0000000000..79882cec82 --- /dev/null +++ b/snippets/Nemerle.WUI.Reactive/MVCTest/Scripts/knockout-2.1.0.debug.js @@ -0,0 +1,3443 @@ +// Knockout JavaScript library v2.1.0 +// (c) Steven Sanderson - http://knockoutjs.com/ +// License: MIT (http://www.opensource.org/licenses/mit-license.php) + +(function(window,document,navigator,undefined){ +var DEBUG=true; +!function(factory) { + // Support three module loading scenarios + if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') { + // [1] CommonJS/Node.js + var target = module['exports'] || exports; // module.exports is for Node.js + factory(target); + } else if (typeof define === 'function' && define['amd']) { + // [2] AMD anonymous module + define(['exports'], factory); + } else { + // [3] No module loader (plain "); + }; + + if (jQueryTmplVersion > 0) { + jQuery['tmpl']['tag']['ko_code'] = { + open: "__.push($1 || '');" + }; + jQuery['tmpl']['tag']['ko_with'] = { + open: "with($1) {", + close: "} " + }; + } + }; + + ko.jqueryTmplTemplateEngine.prototype = new ko.templateEngine(); + + // Use this one by default *only if jquery.tmpl is referenced* + var jqueryTmplTemplateEngineInstance = new ko.jqueryTmplTemplateEngine(); + if (jqueryTmplTemplateEngineInstance.jQueryTmplVersion > 0) + ko.setTemplateEngine(jqueryTmplTemplateEngineInstance); + + ko.exportSymbol('jqueryTmplTemplateEngine', ko.jqueryTmplTemplateEngine); +})(); +}); +})(window,document,navigator); diff --git a/snippets/Nemerle.WUI.Reactive/MVCTest/Scripts/knockout-2.1.0.js b/snippets/Nemerle.WUI.Reactive/MVCTest/Scripts/knockout-2.1.0.js new file mode 100644 index 0000000000..107026da16 --- /dev/null +++ b/snippets/Nemerle.WUI.Reactive/MVCTest/Scripts/knockout-2.1.0.js @@ -0,0 +1,86 @@ +// Knockout JavaScript library v2.1.0 +// (c) Steven Sanderson - http://knockoutjs.com/ +// License: MIT (http://www.opensource.org/licenses/mit-license.php) + +(function(window,document,navigator,undefined){ +function m(w){throw w;}var n=void 0,p=!0,s=null,t=!1;function A(w){return function(){return w}};function E(w){function B(b,c,d){d&&c!==a.k.r(b)&&a.k.S(b,c);c!==a.k.r(b)&&a.a.va(b,"change")}var a="undefined"!==typeof w?w:{};a.b=function(b,c){for(var d=b.split("."),f=a,g=0;g",c[0];);return 4a.a.j(c,b[e])&&c.push(b[e]);return c},T:function(a,b){for(var a=a||[],c=[], +e=0,f=a.length;ea.length?t:a.substring(0,b.length)===b},eb:function(a,b){for(var c="return ("+a+")",e=0;e",""]||!d.indexOf("",""]||(!d.indexOf("",""]||[0,"",""];b="ignored
"+d[1]+b+d[2]+"
";for("function"==typeof window.innerShiv?c.appendChild(window.innerShiv(b)):c.innerHTML=b;d[0]--;)c=c.lastChild;c=a.a.L(c.lastChild.childNodes)}return c}; +a.a.Y=function(b,c){a.a.ga(b);if(c!==s&&c!==n)if("string"!=typeof c&&(c=c.toString()),"undefined"!=typeof jQuery)jQuery(b).html(c);else for(var d=a.a.pa(c),f=0;f"},Va:function(a,b){var c=d[a];c===n&&m(Error("Couldn't find any memo with ID "+a+". Perhaps it's already been unmemoized."));try{return c.apply(s,b||[]),p}finally{delete d[a]}},Wa:function(b,d){var e=[];c(b,e);for(var h=0,j=e.length;hc;c++)b=b();return b})};a.toJSON=function(b,c,e){b=a.Ta(b);return a.a.sa(b,c,e)}})();a.b("toJS",a.Ta);a.b("toJSON",a.toJSON);(function(){a.k={r:function(b){switch(a.a.o(b)){case "option":return b.__ko__hasDomDataOptionValue__===p?a.a.f.get(b,a.c.options.oa):b.getAttribute("value");case "select":return 0<=b.selectedIndex?a.k.r(b.options[b.selectedIndex]):n;default:return b.value}},S:function(b,c){switch(a.a.o(b)){case "option":switch(typeof c){case "string":a.a.f.set(b,a.c.options.oa, +n);"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__;b.value=c;break;default:a.a.f.set(b,a.c.options.oa,c),b.__ko__hasDomDataOptionValue__=p,b.value="number"===typeof c?c:""}break;case "select":for(var d=b.options.length-1;0<=d;d--)if(a.k.r(b.options[d])==c){b.selectedIndex=d;break}break;default:if(c===s||c===n)c="";b.value=c}}}})();a.b("selectExtensions",a.k);a.b("selectExtensions.readValue",a.k.r);a.b("selectExtensions.writeValue",a.k.S);a.g=function(){function b(a,b){for(var d= +s;a!=d;)d=a,a=a.replace(c,function(a,c){return b[c]});return a}var c=/\@ko_token_(\d+)\@/g,d=/^[\_$a-z][\_$a-z0-9]*(\[.*?\])*(\.[\_$a-z][\_$a-z0-9]*(\[.*?\])*)*$/i,f=["true","false"];return{D:[],W:function(c){var e=a.a.w(c);if(3>e.length)return[];"{"===e.charAt(0)&&(e=e.substring(1,e.length-1));for(var c=[],d=s,f,k=0;k$/: +/^\s*ko\s+(.*\:.*)\s*$/,h=g?/^<\!--\s*\/ko\s*--\>$/:/^\s*\/ko\s*$/,j={ul:p,ol:p};a.e={C:{},childNodes:function(a){return b(a)?d(a):a.childNodes},ha:function(c){if(b(c))for(var c=a.e.childNodes(c),e=0,d=c.length;e"),t))}};a.c.uniqueName.gb=0;a.c.checked={init:function(b,c,d){a.a.n(b,"click",function(){var f;if("checkbox"==b.type)f=b.checked;else if("radio"==b.type&&b.checked)f=b.value;else return;var g=c();"checkbox"==b.type&&a.a.d(g)instanceof Array?(f=a.a.j(a.a.d(g),b.value), +b.checked&&0>f?g.push(b.value):!b.checked&&0<=f&&g.splice(f,1)):a.g.$(g,d,"checked",f,p)});"radio"==b.type&&!b.name&&a.c.uniqueName.init(b,A(p))},update:function(b,c){var d=a.a.d(c());"checkbox"==b.type?b.checked=d instanceof Array?0<=a.a.j(d,b.value):d:"radio"==b.type&&(b.checked=b.value==d)}};var F={"class":"className","for":"htmlFor"};a.c.attr={update:function(b,c){var d=a.a.d(c())||{},f;for(f in d)if("string"==typeof f){var g=a.a.d(d[f]),e=g===t||g===s||g===n;e&&b.removeAttribute(f);8>=a.a.ja&& +f in F?(f=F[f],e?b.removeAttribute(f):b[f]=g):e||b.setAttribute(f,g.toString())}}};a.c.hasfocus={init:function(b,c,d){function f(b){var e=c();a.g.$(e,d,"hasfocus",b,p)}a.a.n(b,"focus",function(){f(p)});a.a.n(b,"focusin",function(){f(p)});a.a.n(b,"blur",function(){f(t)});a.a.n(b,"focusout",function(){f(t)})},update:function(b,c){var d=a.a.d(c());d?b.focus():b.blur();a.a.va(b,d?"focusin":"focusout")}};a.c["with"]={p:function(b){return function(){var c=b();return{"if":c,data:c,templateEngine:a.q.K}}}, +init:function(b,c){return a.c.template.init(b,a.c["with"].p(c))},update:function(b,c,d,f,g){return a.c.template.update(b,a.c["with"].p(c),d,f,g)}};a.g.D["with"]=t;a.e.C["with"]=p;a.c["if"]={p:function(b){return function(){return{"if":b(),templateEngine:a.q.K}}},init:function(b,c){return a.c.template.init(b,a.c["if"].p(c))},update:function(b,c,d,f,g){return a.c.template.update(b,a.c["if"].p(c),d,f,g)}};a.g.D["if"]=t;a.e.C["if"]=p;a.c.ifnot={p:function(b){return function(){return{ifnot:b(),templateEngine:a.q.K}}}, +init:function(b,c){return a.c.template.init(b,a.c.ifnot.p(c))},update:function(b,c,d,f,g){return a.c.template.update(b,a.c.ifnot.p(c),d,f,g)}};a.g.D.ifnot=t;a.e.C.ifnot=p;a.c.foreach={p:function(b){return function(){var c=a.a.d(b());return!c||"number"==typeof c.length?{foreach:c,templateEngine:a.q.K}:{foreach:c.data,includeDestroyed:c.includeDestroyed,afterAdd:c.afterAdd,beforeRemove:c.beforeRemove,afterRender:c.afterRender,templateEngine:a.q.K}}},init:function(b,c){return a.c.template.init(b,a.c.foreach.p(c))}, +update:function(b,c,d,f,g){return a.c.template.update(b,a.c.foreach.p(c),d,f,g)}};a.g.D.foreach=t;a.e.C.foreach=p;a.t=function(){};a.t.prototype.renderTemplateSource=function(){m(Error("Override renderTemplateSource"))};a.t.prototype.createJavaScriptEvaluatorBlock=function(){m(Error("Override createJavaScriptEvaluatorBlock"))};a.t.prototype.makeTemplateSource=function(b,c){if("string"==typeof b){var c=c||document,d=c.getElementById(b);d||m(Error("Cannot find template with ID "+b));return new a.l.i(d)}if(1== +b.nodeType||8==b.nodeType)return new a.l.M(b);m(Error("Unknown template type: "+b))};a.t.prototype.renderTemplate=function(a,c,d,f){return this.renderTemplateSource(this.makeTemplateSource(a,f),c,d)};a.t.prototype.isTemplateRewritten=function(a,c){return this.allowTemplateRewriting===t||!(c&&c!=document)&&this.V&&this.V[a]?p:this.makeTemplateSource(a,c).data("isRewritten")};a.t.prototype.rewriteTemplate=function(a,c,d){var f=this.makeTemplateSource(a,d),c=c(f.text());f.text(c);f.data("isRewritten", +p);!(d&&d!=document)&&"string"==typeof a&&(this.V=this.V||{},this.V[a]=p)};a.b("templateEngine",a.t);a.Z=function(){function b(b,c,e){for(var b=a.g.W(b),d=a.g.D,j=0;j/g;return{mb:function(b,c,e){c.isTemplateRewritten(b,e)||c.rewriteTemplate(b,function(b){return a.Z.zb(b,c)},e)},zb:function(a,g){return a.replace(c,function(a,c,d,f,i,l,q){return b(q,c,g)}).replace(d,function(a,c){return b(c,"<\!-- ko --\>",g)})},Za:function(b){return a.s.na(function(c, +e){c.nextSibling&&a.ya(c.nextSibling,b,e)})}}}();a.b("templateRewriting",a.Z);a.b("templateRewriting.applyMemoizedBindingsToNextSibling",a.Z.Za);(function(){a.l={};a.l.i=function(a){this.i=a};a.l.i.prototype.text=function(){var b=a.a.o(this.i),b="script"===b?"text":"textarea"===b?"value":"innerHTML";if(0==arguments.length)return this.i[b];var c=arguments[0];"innerHTML"===b?a.a.Y(this.i,c):this.i[b]=c};a.l.i.prototype.data=function(b){if(1===arguments.length)return a.a.f.get(this.i,"templateSourceData_"+ +b);a.a.f.set(this.i,"templateSourceData_"+b,arguments[1])};a.l.M=function(a){this.i=a};a.l.M.prototype=new a.l.i;a.l.M.prototype.text=function(){if(0==arguments.length){var b=a.a.f.get(this.i,"__ko_anon_template__")||{};b.ua===n&&b.da&&(b.ua=b.da.innerHTML);return b.ua}a.a.f.set(this.i,"__ko_anon_template__",{ua:arguments[0]})};a.l.i.prototype.nodes=function(){if(0==arguments.length)return(a.a.f.get(this.i,"__ko_anon_template__")||{}).da;a.a.f.set(this.i,"__ko_anon_template__",{da:arguments[0]})}; +a.b("templateSources",a.l);a.b("templateSources.domElement",a.l.i);a.b("templateSources.anonymousTemplate",a.l.M)})();(function(){function b(b,c,d){for(var f,c=a.e.nextSibling(c);b&&(f=b)!==c;)b=a.e.nextSibling(f),(1===f.nodeType||8===f.nodeType)&&d(f)}function c(c,d){if(c.length){var f=c[0],g=c[c.length-1];b(f,g,function(b){a.xa(d,b)});b(f,g,function(b){a.s.Wa(b,[d])})}}function d(a){return a.nodeType?a:0a.a.ja)&&b.nodes?b.nodes():s; +if(c)return a.a.L(c.cloneNode(p).childNodes);b=b.text();return a.a.pa(b)};a.q.K=new a.q;a.ra(a.q.K);a.b("nativeTemplateEngine",a.q);(function(){a.ma=function(){var a=this.vb=function(){if("undefined"==typeof jQuery||!jQuery.tmpl)return 0;try{if(0<=jQuery.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,f,g){g=g||{};2>a&&m(Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later."));var e=b.data("precompiled"); +e||(e=b.text()||"",e=jQuery.template(s,"{{ko_with $item.koBindingContext}}"+e+"{{/ko_with}}"),b.data("precompiled",e));b=[f.$data];f=jQuery.extend({koBindingContext:f},g.templateOptions);f=jQuery.tmpl(e,b,f);f.appendTo(document.createElement("div"));jQuery.fragments={};return f};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){document.write(" - + - - - @RenderBody() - + + @RenderBody() + diff --git a/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsAST.n b/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsAST.n index 43ee851a38..a79e7cc8d7 100644 --- a/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsAST.n +++ b/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsAST.n @@ -29,7 +29,7 @@ namespace Nemerle.WUI.Reactive | Literal { Value : JsLiteral } | LocalRef { Name : string } | MethodRef { Obj : JsAST; Method : string } - | MethodCorLib { Obj : string; Method : string } + | StaticRef { Type : string; Method : string } | OpCode { Name : string; } | Object { Fields : list[(string * JsAST)] } | Seq { Items : list[JsAST] } diff --git a/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsASTBuilder.n b/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsASTBuilder.n index 6b306bc9aa..2556b7cf5f 100644 --- a/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsASTBuilder.n +++ b/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsASTBuilder.n @@ -27,11 +27,10 @@ namespace Nemerle.WUI.Reactive | ArrayIndexer => JsAST.NotImpl() | Assign(s, t) => JsAST.Assign(Build(s), Build(t)) | Base => JsAST.NotImpl() - | Block(body = body) => Build(body) + | Block(body = body) => Build(body) | Cache => JsAST.NotImpl() | CacheRef => JsAST.NotImpl() - | Call(StaticRef(from, mem, _), parms, _) => JsKnownMembers.Convert(from.TypeInfo.FullName, mem, parms.Map(p => Build(p.expr))) - | Call(func, parms, istail) => JsAST.Call(Build(func), parms.Map(p => Build(p.expr))) + | Call as call => JsKnownMembers.Convert(call, Build(_, false)) | ClosureFieldOf => JsAST.NotImpl() | ClosureObjectOf => JsAST.NotImpl() | ConstantObjectRef => JsAST.NotImpl() @@ -86,7 +85,7 @@ namespace Nemerle.WUI.Reactive | MethodAddress => JsAST.NotImpl() | MethodOf => JsAST.NotImpl() | MethodRef(obj, meth, _, _) => - if(meth.Name.StartsWith("get_")) + if(meth.Name.StartsWith("get_") || meth.Name.StartsWith("set_")) JsAST.MethodRef(Build(obj), meth.Name.Substring(4)) else JsAST.MethodRef(Build(obj), meth.Name) diff --git a/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsASTOptimizer.n b/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsASTOptimizer.n index e6e872a278..ae261c6b53 100644 --- a/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsASTOptimizer.n +++ b/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsASTOptimizer.n @@ -14,8 +14,8 @@ namespace Nemerle.WUI.Reactive public Optimize(ast : JsAST) : JsAST { def allowedForAssignment = [typeof(JsAST.Call), typeof(JsAST.MethodRef), typeof(JsAST.LocalRef), - typeof(JsAST.MethodCorLib), typeof(JsAST.Literal), typeof(JsAST.Code), - typeof(JsAST.Void), typeof(JsAST.Ternary), typeof(JsAST.NotImpl)]; + typeof(JsAST.Literal), typeof(JsAST.Code), typeof(JsAST.Void), + typeof(JsAST.Ternary), typeof(JsAST.NotImpl)]; def delayAssignment(e : JsAST, left : JsAST) { def delayAssignment = delayAssignment(_, left); diff --git a/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsASTWriter.n b/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsASTWriter.n index b43c854e7a..35b73f4d7c 100644 --- a/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsASTWriter.n +++ b/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsASTWriter.n @@ -55,8 +55,7 @@ $(Write(body, indent + 1)) | Literal(String(val)) => $<#"$val"#> | Literal(Bool(val)) => $"$val" | LocalRef(name) => $"$name" - | MethodRef(obj, meth) => i() + $"$(Write(obj)).$meth" - | MethodCorLib(obj, meth) => i() + $"$obj.$meth" + | MethodRef(obj, meth) => i() + $"$(Write(obj)).$meth" | OpCode(name) => $"$name" | Object(fields) => def fieldToObjectField((name, ast)) { diff --git a/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsKnownMembers.n b/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsKnownMembers.n index 82d26edfe1..651bf7501e 100644 --- a/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsKnownMembers.n +++ b/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/JsKnownMembers.n @@ -3,6 +3,7 @@ using Nemerle.Collections; using Nemerle.Text; using Nemerle.Utility; using Nemerle.Compiler; +using Nemerle.Compiler.Typedtree; using System; using System.Collections.Generic; @@ -12,26 +13,22 @@ namespace Nemerle.WUI.Reactive { module JsKnownMembers { - public Convert(typeName : string, member : IMember, parms : list[JsAST]) : JsAST + public Convert(call : TExpr.Call, builder : TExpr -> JsAST) : JsAST { - match(member.MemberKind) { - | Method => ConvertMethod(typeName, member, parms) - | Field => ConvertField(typeName, member, parms) - | Property => ConvertProperty(typeName, member, parms) - | _ => - Message.Warning($"MemberKind $(member.MemberKind) not supported"); - JsAST.NotImpl() - } + def result = match(call) { + | Call(MethodRef(obj = o, meth = meth), parms, _) => ConvertMethod(o.Type.TypeInfo.FullName, builder(o), meth, parms.Map(p => builder(p.expr))) + | Call(StaticRef(from = fromType, mem = meth) as left, parms, _) => ConvertMethod(fromType.TypeInfo.FullName, builder(left), meth, parms.Map(p => builder(p.expr))) + } + result } - public ConvertMethod(typeName : string, member : IMember, parms : list[JsAST]) : JsAST + public ConvertMethod(typeName : string, left : JsAST, member : IMember, parms : list[JsAST]) : JsAST { match(member.Name, parms) { | ("op_Inequality", _) => JsAST.Call(JsAST.OpCode("!="), parms) | ("Concat", h :: t) when typeName == typeof(string).FullName => JsAST.Call(JsAST.MethodRef(h, "concat"), t) - | _ => - Message.Warning($"member.Name $(member.Name) unsupported by type $(typeName)"); - JsAST.NotImpl(); + | ("ToUpper", []) when typeName == typeof(string).FullName => JsAST.Call(JsAST.MethodRef(left, "toUpperCase"), []) + | _ => JsAST.Call(JsAST.MethodRef(left, RemoveGetSet(member.Name)), parms) } } @@ -54,5 +51,12 @@ namespace Nemerle.WUI.Reactive JsAST.NotImpl(); } } + + private RemoveGetSet(method : string) : string { + if(method.StartsWith("get_") || method.StartsWith("set_")) + method.Substring(4); + else + method; + } } } diff --git a/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/ViewModel.n b/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/ViewModel.n index 99f98bef71..57a630da03 100644 --- a/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/ViewModel.n +++ b/snippets/Nemerle.WUI.Reactive/Nemerle.WUI.Reactive/ViewModel.n @@ -163,38 +163,40 @@ namespace Nemerle.WUI.Reactive def code = if (isDependent) $<# -viewModel.$name = ko.dependentObservable( - function() - { - $scriptBody; - }, viewModel);#> +this.$name = ko.computed(function() { + return $scriptBody; +}, this);#> else $<# -viewModel.$name = - function() - { +this.$name = function() { $scriptBody; - };#>; +};#>; <[ $(code : string) ]> } + assert2(false); + def convertMember(member : IMember) : PExpr { | meth is MethodBuilder when meth.Name.StartsWith("get_") || meth.Name.StartsWith("set_") => null //TODO: Add property IMethod.IsAccessor | meth is MethodBuilder when meth.IsConstructor => null - | meth is MethodBuilder when meth.ReturnType is FixedType.Void => - convertMethod(meth.Name, meth, false) - | prop is PropertyBuilder when prop.CanRead && !prop.CanWrite => - convertMethod(prop.Name, prop.GetGetter() :> MethodBuilder) - - | meth is MethodBuilder when meth.Header.ParametersDeclarations.Length == 0 => - convertMethod(meth.Name, meth) - + | meth is MethodBuilder when meth.ReturnType is FixedType.Void => convertMethod(meth.Name, meth, false) + | prop is PropertyBuilder when prop.AutoPropertyField.IsSome => + //assert2(false); + def arrayTypes = [<[ ttype: Nemerle.Core.list[_] ]>, <[ ttype: System.Collections.Generic.List[_] ]>]; + def isArray = arrayTypes.Any(t => prop.Getter.ReturnType.TryUnify(t)); + def ctor = if (isArray) "observableArray" else "observable"; + def prefix = $<#this.$(prop.Name) = ko.$ctor(#>; + <[ $(prefix : string) + + Nemerle.WUI.Reactive.Utils.ToJson(this.$(prop.Ast.name)) + + $(<#);#> : string) ]> + | prop is PropertyBuilder when prop.CanRead && !prop.CanWrite => convertMethod(prop.Name, prop.GetGetter() :> MethodBuilder) + | meth is MethodBuilder when meth.Header.ParametersDeclarations.Length == 0 => convertMethod(meth.Name, meth) | _ => null - } + } - assert2(false); - def members = tb.GetMembers(BF.DeclaredOnly | BF.Instance | BF.Public); + //assert2(false); + def members = tb.GetMembers(BF.DeclaredOnly | BF.Instance | BF.Public | BF.NonPublic); def exprs1 = members.RevMap(convertMember).RevFilter(_ != null); def exprs2 = exprs1.Map(e => <[ _ = sb.AppendLine($e) ]>); @@ -202,9 +204,10 @@ viewModel.$name = public GetViewModelScript() : string { def sb = System.Text.StringBuilder(); - _ = sb.AppendLine("var viewModel = { };"); - { ..$exprs2 } - _ = sb.AppendLine("ko.applyBindings(viewModel);"); + _ = sb.AppendLine("function ViewModel() { "); + { ..$exprs2 } + _ = sb.AppendLine("}"); + _ = sb.AppendLine("ko.applyBindings(new ViewModel());"); sb.ToString() } ]>);