示例#1
0
        public JNode ExportInitializer(IMember fieldOrProperty, BlockStatement ccBlock, bool isGlobal, bool isNative = false)
        {
            var initializer = GetCreateInitializer(fieldOrProperty);
            var init2       = AccessSelfFieldOrProperty(fieldOrProperty).Assign(initializer);

            var jsInit = JsCodeImporter.VisitExpression(init2);

            if (isGlobal)
            {
                //danel HACK
                var st = new JPreUnaryExpression {
                    Operator = "var ", Right = jsInit
                }.Statement();
                return(st);
            }
            else if (isNative)
            {
                var st = jsInit.Statement();
                return(st);
            }
            else //clr
            {
                var st = jsInit.Statement();
                return(st);
            }
        }
示例#2
0
        public virtual List <JEntityDeclaration> _VisitField(IField fld)
        {
            var         init2       = GetCreateFieldInitializer(fld);
            JExpression initializer = null;

            if (init2 != null)
            {
                initializer = JsCodeImporter.VisitExpression(init2);
            }
            var fe2 = new JFieldDeclaration
            {
                FieldDefinition = fld,
                Initializer     = initializer,
                Type            = fld.Type.JAccess(),
                Name            = JNaming.JName(fld)
            };

            ImportModifiers(fld, fe2);
            return(new List <JEntityDeclaration> {
                fe2
            });
        }
示例#3
0
        protected JBlock ExportMethodBody(IMethod me)
        {
            if (me.DeclaringTypeDefinition.IsInterface())
            {
                return(null);
            }
            if (CompilerConfig.Current.EnableLogging)
            {
                Log.Debug("JsTypeImporter: Visit Method: " + me.ToString());
            }
            var nativeCode = JMeta.GetNativeCode(me);

            if (nativeCode != null)
            {
                var block = J.Block().Add(J.Code(nativeCode).Statement()); //TODO: double semicolon?
                var x     = block.ToJs();
                return(block);
            }
            var def = me.GetDefinition();

            if (def == null || def.IsNull)
            {
                if (me.DeclaringTypeDefinition.IsDelegate())
                {
                    var block = J.Block();
                    if (!me.ReturnType.IsVoid())
                    {
                        block.Add(J.Return(J.Null()));
                    }
                    return(block);
                }
                if (me.IsAutomaticEventAccessor())
                {
                    if (me.IsEventAddAccessor())
                    {
                        var node = GenerateAutomaticEventAccessor((IEvent)me.GetOwner(), false);
                        return(node.Block);
                    }
                    else if (me.IsEventRemoveAccessor())
                    {
                        var node = GenerateAutomaticEventAccessor((IEvent)me.GetOwner(), true);
                        return(node.Block);
                    }
                }
                else if (me.IsAutomaticPropertyAccessor())
                {
                    var bf = J.Member(JNaming.JName(me.AccessorOwner).ToJavaNaming());
                    if (!me.IsStatic)
                    {
                        bf.PreviousMember = J.This();
                    }
                    else if (!JMeta.IsGlobalMethod(me))
                    {
                        bf.PreviousMember = JNaming.JAccess(me.DeclaringType);
                    }
                    if (me.IsGetter())
                    {
                        return(J.Block().Add(J.Return(bf)));
                    }
                    else
                    {
                        return(J.Block().Add(bf.Assign(J.Member("value")).Statement()));
                    }
                }
                return(null);
            }
            var block2 = (JBlock)JsCodeImporter.Visit(def);

            if (def.Descendants.OfType <YieldReturnStatement>().FirstOrDefault() != null)
            {
                if (!JsCodeImporter.SupportClrYield)
                {
                    if (block2.Statements == null)
                    {
                        block2.Statements = new List <JStatement>();
                    }
                    var arg      = me.ReturnType.TypeArguments[0].JAccess();
                    var listType = J.Members("java.util.ArrayList").AddGenericArg(arg);
                    var yieldVar = J.Var("$yield", listType, J.New(listType)).Statement();
                    block2.Statements.Insert(0, yieldVar);
                    block2.Statements.Add(JCodeImporter.GenerateYieldReturnStatement(me));
                }
            }
            return(block2);
        }
示例#4
0
        protected JBlock ExportConstructorBody(IMethod ctor)
        {
            var            ctorNode = (ConstructorDeclaration)ctor.GetDeclaration();
            BlockStatement ccc      = null;

            if (ctorNode != null)
            {
                ccc = ctorNode.Body;
            }
            //var ccc = ctor.GetDefinition();//.decl as CsConstructor;
            //var ccc = ctor.GetDefinition();
            var block2 = (JBlock)JsCodeImporter.Visit(ccc);

            if (block2 == null)
            {
                block2 = new JBlock {
                    Statements = new List <JStatement>()
                }
            }
            ;
            var ce          = ctor.GetDeclaringTypeDefinition();
            var isClr       = JMeta.IsClrType(ce);
            var isPrototype = JMeta.IsNativeType(ce);
            var statements  = new List <JStatement>();

            if (!ctor.IsStatic)
            {
                //TODO:
                //base/this ctor invocation
                var invocation = GetConstructorBaseOrThisInvocation2(ctor);
                if (invocation.Arguments.Count > 0)
                {
                    var exp2 = (JNewObjectExpression)JsCodeImporter.VisitExpression(invocation);
                    var exp3 = exp2.Invocation;
                    exp3.Member = J.Member("super");
                    statements.Insert(0, exp3.Statement());
                }
            }
            if (block2.Statements == null)
            {
                block2.Statements = new List <JStatement>();
            }
            block2.Statements.InsertRange(0, statements);

            return(block2);
        }

        void ExportConstructorParameters(IMethod ctor, JFunction func)
        {
            var ce   = ctor.GetDeclaringTypeDefinition();
            var list = new List <string>();

            if (!JMeta.IgnoreTypeArguments(ce))
            {
                //danel
                var gprms = ce.TypeParameters.ToList();//.GetGenericArguments().Where(ga => ga.isGenericParam()).ToList();
                if (gprms.IsNotNullOrEmpty())
                {
                    var i = 0;
                    foreach (var gprm in gprms)
                    {
                        func.Parameters.Add(gprm.Name);
                        if (!ctor.IsStatic && func.Block != null)
                        {
                            func.Block.Statements.Insert(i, J.This().Member(gprm.Name).Assign(J.Member(gprm.Name)).Statement());
                            i++;
                        }
                    }
                }
            }
            var prms = ctor.Parameters;

            if (prms != null)
            {
                func.Parameters.AddRange(prms.Select(t => t.Name));
            }
        }