Exemplo n.º 1
0
        public InstanceConstructorFrame(ConstructorInstance instance, DisposeTracking disposal, Variable[] arguments,
                                        SetterArg[] setterParameters) : base(instance.ImplementationType, instance.Constructor, f => new ServiceVariable(instance, f, ServiceDeclaration.ServiceType))
        {
            Disposal = disposal;

            Parameters = arguments;

            switch (disposal)
            {
            case DisposeTracking.None:
                Mode = ConstructorCallMode.Variable;
                break;

            case DisposeTracking.WithUsing:
                Mode = ConstructorCallMode.UsingNestedVariable;
                break;

            case DisposeTracking.RegisterWithScope:
                Mode = ConstructorCallMode.Variable;
                var addDisposable = MethodCall.For <Scope>(s => s.TryAddDisposable(null));
                addDisposable.Arguments[0] = Variable;
                ActivatorFrames.Add(addDisposable);
                break;
            }

            Setters.AddRange(setterParameters);
        }
Exemplo n.º 2
0
        public override IEnumerable <Variable> FindVariables(IMethodVariables chain)
        {
            var parameters = Ctor.GetParameters();

            for (var i = 0; i < parameters.Length; i++)
            {
                if (Parameters[i] == null)
                {
                    var parameter = parameters[i];
                    Parameters[i] = chain.FindVariable(parameter.ParameterType);
                }
            }

            foreach (var parameter in Parameters)
            {
                yield return(parameter);
            }

            foreach (var setter in Setters)
            {
                setter.FindVariable(chain);
            }

            foreach (var setter in Setters)
            {
                yield return(setter.Variable);
            }


            if (ActivatorFrames.Any())
            {
                var standin = new StandinMethodVariables(Variable, chain);

                foreach (var frame in ActivatorFrames)
                {
                    foreach (var variable in frame.FindVariables(standin))
                    {
                        yield return(variable);
                    }
                }
            }
        }
Exemplo n.º 3
0
        public override void GenerateCode(GeneratedMethod method, ISourceWriter writer)
        {
            switch (Mode)
            {
            case ConstructorCallMode.Variable:
                writer.Write(Declaration() + ";");
                ActivatorFrames.Write(method, writer);

                Next?.GenerateCode(method, writer);
                break;

            case ConstructorCallMode.ReturnValue:
                if (ActivatorFrames.Any())
                {
                    writer.Write(Declaration() + ";");
                    ActivatorFrames.Write(method, writer);

                    writer.Write($"return {Variable.Usage};");
                    Next?.GenerateCode(method, writer);
                }
                else
                {
                    writer.Write($"return {Invocation()};");
                    Next?.GenerateCode(method, writer);
                }


                break;

            case ConstructorCallMode.UsingNestedVariable:
                writer.UsingBlock(Declaration(), w =>
                {
                    ActivatorFrames.Write(method, writer);
                    Next?.GenerateCode(method, w);
                });
                break;
            }
        }