protected void Serialize(KoNodeStatus status) { if (status.Node is ObjectOrValueNode) { var ovi = (ObjectOrValueNode) status.Node; var subject = ovi.Instance; if (ovi.TreatAsValue) { // always emit by value in this case if (subject is string) { Writer.Write(subject.ToSingleQuotedJsString()); } else if (subject is bool) { Writer.Write(((bool) subject) ? "'true'" : "'false'"); } else if (subject is byte || subject is sbyte || subject is short || subject is ushort || subject is int || subject is uint || subject is long || subject is ulong || subject is float || subject is double || subject is decimal) { Writer.Write(subject.ToString()); } else { EmitObject(status); } } else { if (status.IsCommon && !status.HasEmitted) { EmitObject(status); status.HasEmitted = true; } else { Writer.Write(status.RenderName); } } } else if (status.Node is LinkNode) { var li = (LinkNode) status.Node; var subject = li.Instance; if (subject is Expression) { Writer.Write(PortAsLambda((Expression) subject).PortedText); } else if (subject is Binding) { Writer.Write(PortAsLambda(((Binding) subject).BindingLambda).PortedText); } else { throw new NotSupportedException( string.Format("Serialization of links of type '{0}' is not supported", subject.GetType().Name)); } } else if (status.Node is CollectionNode) { using (Writer.CodeBlock("ko.observableArray([\n", "\n])")) using (Writer.List(",\n")) { foreach (var p in status.Elements) { Writer.StartListItem(); SerializeElement(p); } } } else { Writer.Write("null"); } }
/* public ExpressionPort PortAsExpression(Expression expression, params string[] args) { IDictionary<ParameterExpression, string> replacements = null; if (expression is LambdaExpression) { var lambda = (LambdaExpression)expression; expression = lambda.Body; replacements = lambda.Parameters .Zip(args, (p, a) => new { Parameter = p, Argument = a }) .ToDictionary(e => e.Parameter, e => e.Argument); } var visitor = new PortExpressionVisitor(this,replacements); visitor.Visit(expression); return visitor.PortedExpression; } * */ #endregion Other #if NO protected void EmitObject(KoNodeStatus status) { var node = (ObjectOrValueNode) status.Node; if (node.Instance is string) Writer.Write(node.Instance.ToSingleQuotedJsString()); else using (Writer.CodeBlock("{\n", "\n}")) using (Writer.List(",\n")) { foreach (var p in node.Members) { Writer.StartListItem(); SerializeMember(p); } } status.HasEmitted = true; }
private IEnumerable<KoNodeStatus> Traverse(KoNodeStatus status) { yield return status; foreach (var i in TraverseChildren(status)) yield return i; }
private IEnumerable<KoNodeStatus> TraverseChildren(KoNodeStatus status) { return status.Node.Dependencies.SelectMany(x => Traverse(_map[x.Instance])); }
private bool HasCommonDependencies(KoNodeStatus status) { return TraverseChildren(status).Any(x => x.IsCommon && !x.IsScheduled); }