Exemplo n.º 1
0
 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");
     }
 }
Exemplo n.º 2
0
        /*
        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;
        }
Exemplo n.º 3
0
 private IEnumerable<KoNodeStatus> Traverse(KoNodeStatus status)
 {
     yield return status;
     foreach (var i in TraverseChildren(status))
         yield return i;
 }
Exemplo n.º 4
0
 private IEnumerable<KoNodeStatus> TraverseChildren(KoNodeStatus status)
 {
     return status.Node.Dependencies.SelectMany(x => Traverse(_map[x.Instance]));
 }
Exemplo n.º 5
0
 private bool HasCommonDependencies(KoNodeStatus status)
 {
     return TraverseChildren(status).Any(x => x.IsCommon && !x.IsScheduled);
 }