Beispiel #1
0
        protected virtual void EmitCtorForStaticClass()
        {
            var ctor = this.TypeInfo.StaticCtor;

            if (ctor != null && ctor.Body.HasChildren)
            {
                this.PushWriter("{0}");
                this.Outdent();
                string methodName = "staticCtor".Ident();
                this.ResetLocals();
                var prevNamesMap = this.BuildLocalsNamesMap();
                this.Write(methodName);
                this.WriteEqualsSign();
                this.WriteFunction();
                this.WriteOpenCloseParentheses(true);

                this.BeginFunctionBlock();
                var beginPosition = this.Emitter.Output.Length;

                ctor.Body.AcceptChildren(this.Emitter);

                if (!this.Emitter.IsAsync)
                {
                    this.EmitTempVars(beginPosition, true);
                }

                this.EndFunctionBlock();
                this.ClearLocalsNamesMap(prevNamesMap);
                this.Indent();
                string methodContent = this.PopWriter(true);
                TransformCtx.CurClassOtherMethodNames.Add(new TransformCtx.MethodInfo()
                {
                    Name = methodName
                });
                TransformCtx.CurClassOtherMethods.Add(methodContent);
            }

            var fieldBlock = new FieldBlock(this.Emitter, this.TypeInfo, true, true);

            fieldBlock.Emit();
            if (fieldBlock.WasEmitted)
            {
                this.Emitter.Comma = true;
            }

            IEnumerable <string> fieldsInjectors = fieldBlock.Injectors;
            var injectors = this.GetInjectors();

            if (this.TypeInfo.StaticConfig.HasConfigMembers || injectors.Any() || fieldsInjectors.Any())
            {
                this.EnsureComma();
                if (this.TypeInfo.StaticConfig.HasConfigMembers)
                {
                    var configBlock = new FieldBlock(this.Emitter, this.TypeInfo, true, false);
                    configBlock.Emit();
                    if (configBlock.Injectors.Count > 0)
                    {
                        injectors = configBlock.Injectors.Concat(injectors);
                    }

                    if (configBlock.WasEmitted)
                    {
                        this.Emitter.Comma = true;
                    }
                }

                if (fieldsInjectors.Any())
                {
                    injectors = fieldsInjectors.Concat(injectors);
                }

                if (injectors.Count() > 0)
                {
                    string methodName = "staticInit".Ident();
                    this.PushWriter("{0}");
                    this.Outdent();
                    this.Write(methodName);
                    this.WriteEqualsSign();
                    this.WriteFunction();
                    this.WriteOpenParentheses();
                    this.WriteThis();
                    this.WriteCloseParentheses();
                    this.WriteSpace();
                    this.BeginFunctionBlock();
                    foreach (var fn in injectors)
                    {
                        this.Write(fn);
                        this.WriteNewLine();
                    }
                    this.EndFunctionBlock();
                    this.Indent();
                    string methodContent = this.PopWriter(true);
                    TransformCtx.CurClassOtherMethodNames.Add(new TransformCtx.MethodInfo()
                    {
                        Name = methodName
                    });
                    TransformCtx.CurClassOtherMethods.Add(methodContent);
                }
            }
        }
        protected virtual void EmitCtorForStaticClass()
        {
            var ctor = this.TypeInfo.StaticCtor;
            if (ctor != null && ctor.Body.HasChildren)
            {
                this.PushWriter("{0}");
                this.Outdent();
                string methodName = "staticCtor".Ident();
                this.ResetLocals();
                var prevNamesMap = this.BuildLocalsNamesMap();
                this.Write(methodName);
                this.WriteEqualsSign();
                this.WriteFunction();
                this.WriteOpenCloseParentheses(true);

                this.BeginFunctionBlock();
                var beginPosition = this.Emitter.Output.Length;

                ctor.Body.AcceptChildren(this.Emitter);

                if (!this.Emitter.IsAsync)
                {
                    this.EmitTempVars(beginPosition, true);
                }

                this.EndFunctionBlock();
                this.ClearLocalsNamesMap(prevNamesMap);
                this.Indent();
                string methodContent = this.PopWriter(true);
                TransformCtx.CurClassOtherMethodNames.Add(new TransformCtx.MethodInfo() { Name = methodName });
                TransformCtx.CurClassOtherMethods.Add(methodContent);
            }

            var fieldBlock = new FieldBlock(this.Emitter, this.TypeInfo, true, true);
            fieldBlock.Emit();
            if (fieldBlock.WasEmitted)
            {
                this.Emitter.Comma = true;
            }

            IEnumerable<string> fieldsInjectors = fieldBlock.Injectors;
            var injectors = this.GetInjectors();
            if (this.TypeInfo.StaticConfig.HasConfigMembers || injectors.Any() || fieldsInjectors.Any())
            {
                this.EnsureComma();
                if (this.TypeInfo.StaticConfig.HasConfigMembers)
                {
                    var configBlock = new FieldBlock(this.Emitter, this.TypeInfo, true, false);
                    configBlock.Emit();

                    if (configBlock.Injectors.Count > 0)
                    {
                        injectors = configBlock.Injectors.Concat(injectors);
                    }

                    if (configBlock.WasEmitted)
                    {
                        this.Emitter.Comma = true;
                    }
                }

                if (fieldsInjectors.Any())
                {
                    injectors = fieldsInjectors.Concat(injectors);
                }

                if(injectors.Count() > 0) {
                    string methodName = "staticInit".Ident();
                    this.PushWriter("{0}");
                    this.Outdent();
                    this.Write(methodName);
                    this.WriteEqualsSign();
                    this.WriteFunction();
                    this.WriteOpenParentheses();
                    this.WriteThis();
                    this.WriteCloseParentheses();
                    this.WriteSpace();
                    this.BeginFunctionBlock();
                    foreach(var fn in injectors) {
                        this.Write(fn);
                        this.WriteNewLine();
                    }
                    this.EndFunctionBlock();
                    this.Indent();
                    string methodContent = this.PopWriter(true);
                    TransformCtx.CurClassOtherMethodNames.Add(new TransformCtx.MethodInfo() { Name = methodName });
                    TransformCtx.CurClassOtherMethods.Add(methodContent);
                }
            }
        }
Beispiel #3
0
        protected virtual void EmitInitMembers()
        {
            var fieldBlock = new FieldBlock(this.Emitter, this.TypeInfo, false, true);

            fieldBlock.Emit();
            if (fieldBlock.WasEmitted)
            {
                this.Emitter.Comma = true;
            }

            var injectors = this.GetInjectors();
            IEnumerable <string> fieldsInjectors = fieldBlock.Injectors;

            if (!this.TypeInfo.InstanceConfig.HasConfigMembers && !injectors.Any() && !fieldsInjectors.Any())
            {
                return;
            }

            if (this.TypeInfo.InstanceConfig.HasConfigMembers)
            {
                var configBlock = new FieldBlock(this.Emitter, this.TypeInfo, false, false);
                configBlock.Emit();
                if (configBlock.Injectors.Count > 0)
                {
                    injectors = configBlock.Injectors.Concat(injectors);
                }
                if (configBlock.WasEmitted)
                {
                    this.Emitter.Comma = true;
                }
            }

            if (fieldsInjectors.Any())
            {
                injectors = fieldsInjectors.Concat(injectors);
            }

            if (injectors.Count() > 0)
            {
                string initName = "init".Ident();
                if (this.TypeInfo.InstanceMethods.Any(m => m.Value.Any(subm => this.Emitter.GetEntityName(subm) == initName)) ||
                    this.TypeInfo.InstanceConfig.Fields.Any(m => m.GetName(this.Emitter) == initName))
                {
                    throw new System.NotSupportedException(string.Format("has member named {0} in {1}.{2}, please refactor", initName, TypeInfo.Namespace, TypeInfo.Name));
                }

                this.PushWriter("{0}");
                this.Outdent();
                this.Write(initName);
                this.WriteEqualsSign();
                this.WriteFunction();
                this.WriteOpenParentheses();
                this.WriteThis();
                this.WriteCloseParentheses();
                this.WriteSpace();
                this.BeginFunctionBlock();

                foreach (var fn in injectors)
                {
                    this.Write(fn);
                    this.WriteNewLine();
                }

                this.EndFunctionBlock();
                this.Indent();
                string method = this.PopWriter(true);
                TransformCtx.CurClassOtherMethodNames.Add(new TransformCtx.MethodInfo()
                {
                    Name = initName, IsPrivate = true
                });
                TransformCtx.CurClassOtherMethods.Add(method);
                isInitExists_ = true;
            }
        }
        protected virtual void EmitInitMembers()
        {
            var injectors = this.GetInjectors();
            IEnumerable<string> fieldsInjectors = null;

            var fieldBlock = new FieldBlock(this.Emitter, this.TypeInfo, false, true);
            fieldBlock.Emit();

            fieldsInjectors = fieldBlock.Injectors;

            if (fieldBlock.WasEmitted)
            {
                this.Emitter.Comma = true;
            }

            if (!this.TypeInfo.InstanceConfig.HasConfigMembers && !injectors.Any() && !fieldsInjectors.Any())
            {
                return;
            }

            if (this.TypeInfo.InstanceConfig.HasConfigMembers)
            {
                var configBlock = new FieldBlock(this.Emitter, this.TypeInfo, false, false);
                configBlock.Emit();

                if (configBlock.Injectors.Count > 0)
                {
                    injectors = configBlock.Injectors.Concat(injectors);
                }

                if (configBlock.WasEmitted)
                {
                    this.Emitter.Comma = true;
                }
            }

            if (fieldsInjectors.Any())
            {
                injectors = fieldsInjectors.Concat(injectors);
            }

            if (injectors.Count() > 0)
            {
                string initName = "init".Ident();
                if(this.TypeInfo.InstanceMethods.Any(m => m.Value.Any(subm => this.Emitter.GetEntityName(subm) == initName)) ||
                    this.TypeInfo.InstanceConfig.Fields.Any(m => m.GetName(this.Emitter) == initName)) {
                    throw new System.NotSupportedException(string.Format("has member named {0} in {1}.{2}, please refactor", initName, TypeInfo.Namespace, TypeInfo.Name));
                }

                this.PushWriter("{0}");
                this.Outdent();
                this.Write(initName);
                this.WriteEqualsSign();
                this.WriteFunction();
                this.WriteOpenParentheses();
                this.WriteThis();
                this.WriteCloseParentheses();
                this.WriteSpace();
                this.BeginFunctionBlock();

                foreach(var fn in injectors) {
                    this.Write(fn);
                    this.WriteNewLine();
                }

                this.EndFunctionBlock();
                this.Indent();
                string method = this.PopWriter(true);
                TransformCtx.CurClassOtherMethodNames.Add(new TransformCtx.MethodInfo() { Name = initName, IsPrivate = true });
                TransformCtx.CurClassOtherMethods.Add(method);
                isInitExists_ = true;
            }
        }