void ExportNamespace(JsUnit unit, string ns)
        {
            var Writer = new StringWriter();

            if (ns.IsNotNullOrEmpty())
            {
                var tokens = ns.Split('.');
                for (var i = 0; i < tokens.Length; i++)
                {
                    var         ns2 = tokens.Take(i + 1).StringJoin(".");
                    JsStatement st;
                    if (i == 0)
                    {
                        st = Js.Var(ns2, Js.Json()).Statement();
                    }
                    else
                    {
                        st = Js.Member(ns2).Assign(Js.Json()).Statement();
                    }
                    var st2 = Js.If(Js.Typeof(Js.Member(ns2)).Equal(Js.String("undefined"))).Then(st);
                    unit.Statements.Add(st2);
                    st2.AddAnnotation(new NamespaceVerificationAnnotation {
                        Namespace = ns2
                    });                                                                        //.Ex(true).NamespaceVerification = ns2;
                }
            }
        }
예제 #2
0
 protected JsExpression Serialize(object obj)
 {
     if (obj == null)
     {
         return(Js.Null());
     }
     if (obj is JsExpression)
     {
         return((JsExpression)obj);
     }
     else if (obj is Dictionary <string, object> )
     {
         var obj2 = Js.Json();
         var dic  = (Dictionary <string, object>)obj;
         dic.ForEach(pair => obj2.Add(pair.Key, Serialize(pair.Value)));
         return(obj2);
     }
     else if (obj is IList)
     {
         var list  = (IList)obj;
         var array = Js.NewJsonArray(list.Cast <object>().Select(Serialize).ToArray());
         return(array);
     }
     else if (obj is Enum)
     {
         return(Js.String(obj.ToString()));
     }
     else if (obj is string || obj is bool || obj is int)
     {
         return(Js.Value(obj));
     }
     else
     {
         var json = Js.Json();
         obj.GetType().GetProperties().ForEach(pe =>
         {
             var value = pe.GetValue(obj, null);
             if (value != null)
             {
                 json.Add(pe.Name, Serialize(value));
             }
         });
         return(json);
     }
 }
예제 #3
0
 public JsNode VisitTypeIsResolveResult(TypeIsResolveResult res)
 {
     if (Sk.OmitCasts(res.TargetType))
     {
         return(Js.True());
         //var node2 = Visit(res.Input);
         //return node2;
     }
     else if (Sk.NativeCasts(res.TargetType))
     {
         var typeFieldName = Sk.GetJsonTypeFieldName(res.TargetType.GetDefinitionOrArrayType());
         if (typeFieldName != null && Sk.IsJsonMode(res.TargetType.GetDefinitionOrArrayType()))
         {
             return(Js.Parentheses(VisitExpression(res.Input).Or(Js.Json())).Member(typeFieldName).Equal(SkJs.EntityTypeRefToMember(res.TargetType)));
         }
         var node2 = VisitExpression(res.Input).InstanceOf(SkJs.EntityTypeRefToMember(res.TargetType));
         return(node2);
     }
     else
     {
         var node2 = Js.Member("Is").Invoke(VisitExpression(res.Input), SkJs.EntityTypeRefToMember(res.TargetType));
         return(node2);
     }
 }
예제 #4
0
 internal JsExpression InitializersToJson(IList <ResolveResult> initializerStatements, IType type)
 {
     //if (Sk.IsNativeArrayEnumerator(type.GetDefinition()))
     //FIX for issue 325:
     if (Sk.IsNativeArrayEnumerator(type.GetDefinition()) && (initializerStatements.IsEmpty() || initializerStatements[0] is CSharpInvocationResolveResult))
     {
         var items  = initializerStatements.Cast <CSharpInvocationResolveResult>().Select(t => t.Arguments[0]).ToList();
         var items2 = VisitExpressions(items);
         var arr    = Js.NewJsonArray(items2.ToArray());
         return(arr);
     }
     else
     {
         var json = Js.Json();
         foreach (var st in initializerStatements)
         {
             if (st is OperatorResolveResult)
             {
                 var op    = (OperatorResolveResult)st;
                 var mrr   = (MemberResolveResult)op.Operands[0];
                 var name  = SkJs.GetEntityJsName(mrr.Member);
                 var value = VisitExpression(op.Operands[1]);
                 var pair  = Js.JsonNameValue(name, value);
                 if (mrr.TargetResult is MemberResolveResult)   //happens when using object initializers to set inner properties, e.g. new Parent { Child = { Name="ggg" } }
                 {
                     var targetMrr = (MemberResolveResult)mrr.TargetResult;
                     var name2     = SkJs.GetEntityJsName(targetMrr.Member);
                     var innerJson = Js.Json();
                     innerJson.Add(pair);
                     pair = Js.JsonNameValue(name2, innerJson);
                 }
                 json.Add(pair);
             }
             else if (st is InvocationResolveResult)
             {
                 var irr       = (InvocationResolveResult)st;
                 var targetMrr = irr.TargetResult as MemberResolveResult;
                 if (targetMrr == null)
                 {
                     throw new CompilerException(st.GetFirstNode(), "Expected MemberResolveResult");
                 }
                 var name = SkJs.GetEntityJsName(targetMrr.Member);
                 if (irr.Arguments.Count != 1)
                 {
                     throw new CompilerException(st.GetFirstNode(), "Expected one argument, not " + name + " " + irr.Arguments.Count);
                 }
                 var value      = VisitExpression(irr.Arguments[0]);
                 var jsonMember = json.NamesValues.NotNull().FirstOrDefault(t => t.Name.Name == name);
                 if (jsonMember == null)
                 {
                     json.Add(name, Js.NewJsonArray(value));
                 }
                 else
                 {
                     var array = jsonMember.Value as JsJsonArrayExpression;
                     if (array == null)
                     {
                         throw new CompilerException(st.GetFirstNode(), "json member value array not found " + name);
                     }
                     array.Items.Add(value);
                 }
             }
             else
             {
                 throw new NotImplementedException();
             }
         }
         //var inits2 = initializerStatements.Select(t => Visit(t)).ToList();
         //var namesValues = inits2.Cast<JsBinaryExpression>().Select(t => Js.JsonNameValue(((JsMemberExpression)t.Left).Name, t.Right)).ToList();
         //var json = Js.Json();
         //json.NamesValues = namesValues;
         return(json);
     }
 }
예제 #5
0
        void TransformIntoBaseMethodCallIfNeeded(CSharpInvocationResolveResult res, JsInvocationExpression node2)
        {
            var target = res.TargetResult as ThisResolveResult;

            if (target != null && target.CausesNonVirtualInvocation) //base.
            {
                //var info = res.GetInfo();
                //var node = info.Nodes.FirstOrDefault();
                var ce = target.Type;// node.FindThisEntity();
                if (ce != null && Sk.IsExtJsType(ce.GetDefinitionOrArrayType()))
                {
                    node2.Member = Js.This().Member("callParent");
                    if (node2.Arguments.IsNotNullOrEmpty())
                    {
                        node2.Arguments = new List <JsExpression> {
                            Js.NewJsonArray(node2.Arguments.ToArray())
                        }
                    }
                    ;
                    //var me2 = (node2.Member as JsMemberExpression);
                    //me2.Name = "callParent";
                    return;
                }
                IMethod me2;
                var     me = res.Member;
                if (me is IProperty)
                {
                    me2 = ((IProperty)me).Getter;
                }
                else if (me is IMethod)
                {
                    me2 = (IMethod)res.Member;
                }
                else
                {
                    throw new Exception("Can't resolve method from member: " + res.Member);
                }
                var member = SkJs.EntityMethodToJsFunctionRef(me2);
                member       = member.Member("call");
                node2.Member = member;
                if (node2.Arguments == null)
                {
                    node2.Arguments = new List <JsExpression>();
                }
                node2.Arguments.Insert(0, Js.This());
            }
        }

        void ProcessByRefs1()
        {
            ByRefs       = new List <ByReferenceResolveResult>();
            ByRefIndexes = new List <int>();
            RefToRefs    = new List <int>();
            var c = 0;

            foreach (var bin in PrmBindings)
            {
                var binding = bin.Binding;
                var byRef   = binding.CallResult as ByReferenceResolveResult;
                if (byRef == null)
                {
                    c++;
                    continue;
                }
                var x = byRef.ElementResult as LocalResolveResult;
                if (x != null && x.Variable != null && x.Variable.Type.Kind == TypeKind.ByReference)
                {
                    if (binding.Parameter.IsRef || binding.Parameter.IsOut)
                    {
                        RefToRefs.Add(c);
                    }
                    c++;
                    continue;
                }
                ByRefs.Add(byRef);
                ByRefIndexes.Add(c);
                c++;
            }
        }

        void ProcessByRefs2()
        {
            var c = 0;

            for (var i = 0; i < Node2.Arguments.Count; i++)
            {
                JsMemberExpression jsmex = Node2.Arguments[i] as JsMemberExpression;
                if (jsmex != null)
                {
                    if (RefToRefs.Contains(i))
                    {
                        Node2.Arguments[i] = jsmex.PreviousMember; //remove the .Value ref wrapper
                    }
                    else if (ByRefIndexes.Contains(i))
                    {
                        Node2.Arguments[i] = Js.Member(RefIndexToName(c));
                        c++;
                    }
                }
            }
        }

        void ProcessByRefs3()
        {
            if (ByRefs.IsNotNullOrEmpty())
            {
                var func = Js.Function();

                //It must assigned to a temporary variable, because typed arrays do not acceppt json.
                for (var i = 0; i < ByRefs.Count; i++)
                {
                    var byRef = ByRefs[i];
                    func.Add(Js.Var(RefIndexToName(i), Js.Json().Add("Value", VisitExpression(byRef))).Statement());
                }

                func.Add(Js.Var("$res", Node2).Statement());

                for (var i = 0; i < ByRefs.Count; i++)
                {
                    var byRef = ByRefs[i];
                    func.Add(Js.Assign(VisitExpression(byRef), Js.Member(Js.Member(RefIndexToName(i)), "Value")).Statement());
                }

                func.Add(Js.Return(Js.Member("$res")));
                Node2 = Importer.WrapFunctionAndInvoke(Res, func);
            }
        }