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) }); }
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); } }