public JsNode VisitVariableInitializer(VariableInitializer node)
        {
            var tLocal = node.Annotation <LocalResolveResult>();

            if (tLocal != null && tLocal.Type != null && tLocal.Type.Kind == TypeKind.Struct &&
                node.ToString() == node.NameToken.ToString() && node.NextSibling.ToString() == ";")
            {
                var tType = Type.GetType(tLocal.Type.FullName);
                //对于基本数据类型,不用new
                if (tType == null || !tType.IsPrimitive)
                {
                    var tTypeMember = new JsMemberExpression {
                        Name = tLocal.Type.FullName
                    };
                    var tCtorMember = new JsMemberExpression {
                        Name = "ctor", PreviousMember = tTypeMember
                    };
                    var tInvocation = new JsInvocationExpression {
                        Member = tCtorMember
                    };
                    var tNewObject = new JsNewObjectExpression {
                        Invocation = tInvocation
                    };
                    return(new JsVariableDeclarator
                    {
                        Name = node.Name,
                        Initializer = tNewObject,
                    });
                }
            }
            return(new JsVariableDeclarator {
                Name = node.Name, Initializer = VisitExpression(node.Initializer)
            });
        }
Exemple #2
0
        public JsNode VisitInvocationResolveResultAsCtor(CSharpInvocationResolveResult res)
        {
            if (res.Type.Kind == TypeKind.Delegate)
            {
                return(Visit(res.Arguments.Single()));
            }
            var me    = (IMethod)res.Member;
            var meAtt = Sk.GetJsMethodAttribute(me);
            var ce    = me.GetDeclaringTypeDefinition();
            var att   = ce == null ? null : ce.GetJsTypeAttribute();

            if (att != null && att.Mode == JsMode.Json && (meAtt == null || meAtt.Name == null))
            {
                var jtfn  = ce == null ? null : Sk.GetJsonTypeFieldName(ce);
                var node2 = VisitInvocationResolveResult(res);
                var json  = Importer.InitializersToJson(res.InitializerStatements, res.Type);
                if (jtfn != null)
                {
                    var x = json as JsJsonObjectExpression;
                    if (x != null)
                    {
                        x.Add(jtfn, SkJs.EntityTypeRefToMember(res.Type));
                    }
                }
                return(json);
            }
            else
            {
                var invokeExp = (JsInvocationExpression)VisitInvocationResolveResult(res);
                var newExp    = new JsNewObjectExpression {
                    Invocation = invokeExp
                };
                JsExpression finalExp;
                if (meAtt != null && meAtt.OmitNewOperator)
                {
                    finalExp = invokeExp;
                }
                else
                {
                    finalExp = newExp;
                }

                if (meAtt != null && meAtt.JsonInitializers)
                {
                    var json = Importer.InitializersToJson(res.InitializerStatements, res.Type);
                    invokeExp.Arguments.Add(json);
                }
                else if (res.InitializerStatements.IsNotNullOrEmpty())
                {
                    var func = Js.Function();

                    var inits2 = res.InitializerStatements.Select(t => Visit(t)).ToList();
                    //var init1 = res.InitializerStatements[0];

                    var target  = AstNodeConverter.FindInitializedObjectResolveResult(res);// ((init1 as OperatorResolveResult).Operands[0] as MemberResolveResult).TargetResult as InitializedObjectResolveResult;
                    var varName = Importer.Initializers[target];
                    func.Add(Js.Var(varName, finalExp).Statement());

                    foreach (var init in inits2)
                    {
                        var exp = ((JsExpression)init);
                        func.Add(exp.Statement());
                    }
                    func.Add(Js.Return(Js.Member(varName)));
                    finalExp = Importer.WrapFunctionAndInvoke(res, func);
                }

                return(finalExp);
            }
        }