private void ImplementIContainsMixin(
            CodeGeneratorProxy codeBehind,
            MixinGenerationPlan mgp)
        {
            var containMixinInterfaceName =
                string.Format(
                    "global::{0}.{1}<{2}>",
                    typeof(IContainMixin <>).Namespace,
                    "IContainMixin",
                    mgp.MixinAttribute.Mixin.GetOriginalFullNameWithGlobal());

            codeBehind.ImplementInterface(
                containMixinInterfaceName);

            codeBehind.CreateProperty(
                modifier:
                //implement explicitly
                string.Empty,
                returnTypeFullName:
                mgp.MixinAttribute.Mixin.GetOriginalFullNameWithGlobal(),
                propertyName:
                containMixinInterfaceName + ".MixinInstance",
                getterMethodBody:
                string.Format(
                    "get{{ return {0}.{1}; }}",
                    mgp.MasterWrapperPlan.MasterWrapperInstanceNameAvailableFromTargetCodeBehind,
                    MasterWrapperPlan.MixinInstanceDataMemberName),
                setterMethodBody:
                //no setter
                string.Empty
                );
        }
示例#2
0
        private void ProcessAbstractMembers(
            pMixinGeneratorPipelineState manager, CodeGeneratorProxy requirementInterface)
        {
            foreach (var abstractMember in manager.CurrentMixinMembers
                     .GetUnimplementedAbstractMembers())
            {
                #region Process Methods
                if (abstractMember is IMethod)
                {
                    requirementInterface.CreateMethod(
                        string.Empty, //no modifier for interface member
                        abstractMember.ReturnType.GetOriginalFullNameWithGlobal(),
                        GetAbstractMemberImplementationName(abstractMember),
                        (abstractMember as IMethod).Parameters.ToKeyValuePair(),
                        string.Empty,
                        (abstractMember as IMethod).GetGenericMethodConstraints(
                            manager.BaseState.Context.TypeResolver.Compilation));
                }
                #endregion

                #region Process Properties
                else if (abstractMember is IProperty)
                {
                    requirementInterface.CreateProperty(
                        string.Empty, //no modifier for interface member
                        abstractMember.ReturnType.GetOriginalFullNameWithGlobal(),
                        GetAbstractMemberImplementationName(abstractMember),
                        (abstractMember as IProperty).CanGet ? "get;" : "",
                        (abstractMember as IProperty).CanSet ? "set;" : "");
                }
                #endregion
            }
        }
示例#3
0
        private void AddActivateMixinDependenciesMethod(CodeGeneratorProxy mixinsClassCodeGenerator, TargetLevelCodeGeneratorPipelineState manager)
        {
            const string targetInstanceMethodParameterName = "target";

            var methodBodyStatements = new StringBuilder();

            foreach (var mixin in manager.CodeGenerationPlan.MixinGenerationPlans.Values)
            {
                methodBodyStatements.AppendFormat(
                    "{0}.{1}({2};",
                    mixin.MasterWrapperPlan.MasterWrapperInstanceNameInMixinsContainer,
                    manager.CodeGenerationPlan.TargetCodeBehindPlan.MixinsActivateMixinDependenciesMethodName,
                    targetInstanceMethodParameterName);
            }


            mixinsClassCodeGenerator.CreateMethod(
                modifier:
                "public",
                returnTypeFullName:
                "void",
                methodName:
                manager.CodeGenerationPlan.TargetCodeBehindPlan.MixinsActivateMixinDependenciesMethodName,
                parameters:
                new[]
            {
                new KeyValuePair <string, string>(
                    manager.TargetSourceTypeDeclaration.GetFullTypeName(),
                    targetInstanceMethodParameterName)
            },
                methodBody:
                methodBodyStatements.ToString());
        }
        public bool PerformTask(TargetLevelCodeGeneratorPipelineState manager)
        {
            var targetCodeBehind =
                new TypeDeclaration
            {
                ClassType = ClassType.Class,
                Modifiers = manager.TargetSourceTypeDeclaration.Modifiers,         // this should include partial
                Name      = manager.TargetSourceTypeDeclaration.Name
            };

            var codeGenerator =
                new CodeGeneratorProxy(
                    targetCodeBehind,
                    addCodeGeneratedAttribute: true);

            //implement TargetCodeBehindPlan.MixinInterfaces
            manager.CodeGenerationPlan.TargetCodeBehindPlan.MixinInterfaces
            .Map(i => codeGenerator.ImplementInterface(i.GetOriginalFullNameWithGlobal()));

            //Save targetCodeBehind to state
            manager.TargetCodeBehindTypeDeclaration = targetCodeBehind;


            //Add targetCodeGehind to Syntax Tree
            manager.CodeBehindSyntaxTree.AddChildTypeDeclaration
                (targetCodeBehind,
                manager.TargetSourceTypeDeclaration.GetParent <NamespaceDeclaration>());

            return(true);
        }
示例#5
0
        private void GenerateConstructor(CodeGeneratorProxy codeGenerator, MixinLevelCodeGeneratorPipelineState manager)
        {
            var constructorBodyStatements = new StringBuilder();

            #region Mixin Instance Initialization Statement

            constructorBodyStatements.AppendFormat(
                "{0} = {1}",
                MasterWrapperPlan.MixinInstanceDataMemberName,
                manager.MixinGenerationPlan.MasterWrapperPlan.MixinInstanceInitializationStatement
                .EnsureEndsWith(";"));

            #endregion

            #region Initialize Virtual Member Functions

            var masterWrapperMemberHelper =
                new MasterWrapperCodeGeneratorProxyMemberHelper(
                    codeGenerator,
                    manager.CommonState.Context.TypeResolver.Compilation);

            manager.MixinGenerationPlan.MasterWrapperPlan.VirtualMembers.
            Map(mw => constructorBodyStatements.Append(
                    GenerateVirtualMemberFunctionInitializationStatement(mw, masterWrapperMemberHelper)));

            #endregion

            #region Initialize BaseMasterWrapper Statement

            constructorBodyStatements.AppendFormat(
                "base.Initialize( {0}, {1}, new global::System.Collections.Generic.List<global::{2}>{{ {3} }});",
                MasterWrapperPlan.TargetInstanceConstructorParameterName,
                MasterWrapperPlan.MixinInstanceDataMemberName,
                typeof(IMixinInterceptor).GetOriginalFullName(),
                string.Join(",",
                            manager.MixinGenerationPlan.MixinAttribute.Interceptors
                            .Select <IType, string>(x => x.GenerateActivationExpression())
                            )
                );

            #endregion

            codeGenerator.CreateConstructor(
                modifiers:
                "public",
                parameters:
                new[]
            {
                new KeyValuePair <string, string>(
                    manager.MixinGenerationPlan.ExternalMixinSpecificAutoGeneratedNamespaceName.EnsureEndsWith(
                        ".") +
                    manager.MixinGenerationPlan.RequirementsInterfacePlan.RequirementsInterfaceName,
                    MasterWrapperPlan.TargetInstanceConstructorParameterName)
            },
                constructorInitializer:
                string.Empty,
                constructorBody:
                constructorBodyStatements.ToString());
        }
        public bool PerformTask(MixinLevelCodeGeneratorPipelineState manager)
        {
            var codeGenerator = new CodeGeneratorProxy(manager.MasterWrapper);

            CreateActivateDependencyMethod(codeGenerator, manager.MixinGenerationPlan);

            return(true);
        }
示例#7
0
        public bool PerformTask(TargetLevelCodeGeneratorPipelineState manager)
        {
            var codeGenerator =
                new CodeGeneratorProxy(manager.TargetCodeBehindTypeDeclaration);

            var backingFiledName = "__" + manager.CodeGenerationPlan.TargetCodeBehindPlan.MixinsPropertyName;

            //create backing field
            codeGenerator.CreateDataMember(
                modifiers:
                "private",
                dataMemberTypeFullName:
                manager.CodeGenerationPlan.TargetCodeBehindPlan.MixinsClassName,
                dataMemberName:
                backingFiledName
                );

            //create private property
            codeGenerator.CreateProperty(
                modifier:
                "private",
                returnTypeFullName:
                manager.CodeGenerationPlan.TargetCodeBehindPlan.MixinsClassName,
                propertyName:
                manager.CodeGenerationPlan.TargetCodeBehindPlan.MixinsPropertyName,
                getterMethodBody:
                string.Format(
                    @"
                                get 
                                {{
                                    if (null == {0})
                                    {{
                                        lock({1}.{2})
                                        {{
                                                if (null == {0})
                                                {{
                                                    {0} = new {1}(this);
                                                    {0}.{3}(this);
                                                }}
                                        }}
                                    }}
    
                                    return {0};
                                }}
                            ",
                    backingFiledName,
                    manager.CodeGenerationPlan.TargetCodeBehindPlan.MixinsClassName,
                    manager.CodeGenerationPlan.TargetCodeBehindPlan.MixinsLockVariableName,
                    manager.CodeGenerationPlan.TargetCodeBehindPlan.MixinsActivateMixinDependenciesMethodName)
                ,
                setterMethodBody:
                string.Empty     //no setter
                );

            return(true);
        }
        public bool PerformTask(MixinLevelCodeGeneratorPipelineState manager)
        {
            var codeGenerator = new CodeGeneratorProxy(manager.MasterWrapper);

            GenerateMixinInstanceDataMember(codeGenerator, manager);

            GenerateVirtualFuncDataMembers(codeGenerator, manager);

            return(true);
        }
示例#9
0
        public bool PerformTask(MixinLevelCodeGeneratorPipelineState manager)
        {
            var codeGenerator = new CodeGeneratorProxy(manager.MasterWrapper);



            GenerateConstructor(codeGenerator, manager);

            return(true);
        }
 private void GenerateMixinInstanceDataMember(CodeGeneratorProxy codeGenerator, MixinLevelCodeGeneratorPipelineState manager)
 {
     codeGenerator.CreateDataMember(
         modifiers:
         //must be public for implicit conversion operator
         "public",
         dataMemberTypeFullName:
         manager.MixinGenerationPlan.MasterWrapperPlan.MixinInstanceTypeFullName,
         dataMemberName:
         MasterWrapperPlan.MixinInstanceDataMemberName);
 }
        public bool PerformTask(TargetLevelCodeGeneratorPipelineState manager)
        {
            var codeGeneratorProxy =
                new CodeGeneratorProxy(manager.TargetCodeBehindTypeDeclaration);

            manager.CodeGenerationPlan.MixinGenerationPlans.Values
            .Where(mgp => mgp.AddAnIContainsMixinImplementation)
            .Map(mgp => ImplementIContainsMixin(codeGeneratorProxy, mgp));

            return(true);
        }
示例#12
0
 private void AddLockDataMember(CodeGeneratorProxy mixinsClassCodeGenerator, CodeGenerationPlan codeGenerationPlan)
 {
     mixinsClassCodeGenerator.CreateDataMember(
         modifiers:
         "public static",
         dataMemberTypeFullName:
         "global::System.Object",
         dataMemberName:
         codeGenerationPlan.TargetCodeBehindPlan.MixinsLockVariableName,
         initializerExpression:
         "= new global::System.Object();");
 }
示例#13
0
 private void AddMixinDataMembers(CodeGeneratorProxy mixinsClassCodeGenerator, TargetLevelCodeGeneratorPipelineState manager)
 {
     foreach (var mixin in manager.CodeGenerationPlan.MixinGenerationPlans.Values)
     {
         mixinsClassCodeGenerator.CreateDataMember(
             modifiers:
             "public",
             dataMemberTypeFullName:
             GetMasterWrapperFullTypeName(mixin),
             dataMemberName:
             mixin.MasterWrapperPlan.MasterWrapperInstanceNameInMixinsContainer);
     }
 }
示例#14
0
        public bool PerformTask(MixinLevelCodeGeneratorPipelineState manager)
        {
            var targetCodeBehindCodeGeneratorProxy =
                new CodeGeneratorProxy(
                    manager.TargetLevelCodeGeneratorPipelineState.TargetCodeBehindTypeDeclaration);

            GenerateMembers(
                manager,
                targetCodeBehindCodeGeneratorProxy,
                manager.MixinGenerationPlan.MembersPromotedToTarget);

            return(true);
        }
示例#15
0
        public bool PerformTask(TargetLevelCodeGeneratorPipelineState manager)
        {
            var codeGeneratorProxy =
                new CodeGeneratorProxy(manager.TargetCodeBehindTypeDeclaration);

            foreach (var mixinPlan in manager.CodeGenerationPlan.MixinGenerationPlans.Values)
            {
                codeGeneratorProxy.ImplementInterface(
                    mixinPlan.ExternalMixinSpecificAutoGeneratedNamespaceName.EnsureEndsWith(".") +
                    mixinPlan.RequirementsInterfacePlan.RequirementsInterfaceName);
            }

            return(true);
        }
        public bool PerformTask(pMixinGeneratorPipelineState manager)
        {
            if (manager.CurrentpMixinAttribute.Mixin.IsStaticOrSealed())
            {
                return(true);
            }

            var wrapperClassDeclaration = new TypeDeclaration
            {
                ClassType = ClassType.Class,
                Modifiers = GenerateProtectedMixinMembersWrapperClass.GetMixinTypeModifiers(manager),
                Name      = GetWrapperClassName(manager)
            };


            var simpleType = new SimpleType(
                (Identifier)
                manager.CurrentMixinProtectedMembersWrapperClass.Descendants.OfType <Identifier>().First().Clone());

            wrapperClassDeclaration.BaseTypes.Add(simpleType);

            manager.CurrentMixinAbstractMembersWrapperClass = wrapperClassDeclaration;

            ICodeGeneratorProxy wrapperClass;

            if (manager.CurrentpMixinAttribute.Mixin.GetDefinition().IsAbstract)
            {
                //Protected/Abstract Wrappers will all be created in the external
                //namespace (Mixin is not allowed to be private)
                manager.BaseState.GeneratedCodeSyntaxTree.AddChildTypeDeclaration(
                    wrapperClassDeclaration,
                    new NamespaceDeclaration(ExternalGeneratedNamespaceHelper.GenerateNamespace(manager)));

                wrapperClass = new CodeGeneratorProxy(wrapperClassDeclaration, "");
            }
            else
            {
                //Protected/Abstract Wrappers will all be created as
                //a nested type inside Target (in case Mixin is private)

                wrapperClass = manager.CurrentAutoGeneratedTypeDeclaration.AddNestedType(wrapperClassDeclaration);
            }

            CreateRequirementsDataMemberAndConstructor(wrapperClass, manager);

            ProcessMembers(wrapperClass, manager);

            return(true);
        }
示例#17
0
        public bool PerformTask(TargetLevelCodeGeneratorPipelineState manager)
        {
            var mixinsClassCodeGenerator =
                new CodeGeneratorProxy(manager.MixinsClassInTargetCodeBehind);

            AddLockDataMember(mixinsClassCodeGenerator, manager.CodeGenerationPlan);

            AddMixinDataMembers(mixinsClassCodeGenerator, manager);

            AddConstructor(mixinsClassCodeGenerator, manager);

            AddActivateMixinDependenciesMethod(mixinsClassCodeGenerator, manager);

            return(true);
        }
        public bool PerformTask(MixinLevelCodeGeneratorPipelineState manager)
        {
            if (!manager.MixinGenerationPlan.ProtectedWrapperPlan.GenrateProtectedWrapper)
            {
                return(true);
            }

            var codeGenerator =
                new CodeGeneratorProxy(manager.ProtectedMembersWrapper);

            ProcessConstructors(codeGenerator, manager);

            ProcessMembers(codeGenerator, manager);

            return(true);
        }
        /// <summary>
        /// Creates simple public constructors that pass all parameters to base.
        /// <code>
        /// <![CDATA[
        /// public ProtectedWrapper(obj p1, obj p2) : base (p1, p2){}
        /// ]]></code>
        /// </summary>
        /// <param name="codeGenerator"></param>
        /// <param name="manager"></param>
        private void ProcessConstructors(CodeGeneratorProxy codeGenerator, MixinLevelCodeGeneratorPipelineState manager)
        {
            manager.MixinGenerationPlan.ProtectedWrapperPlan.Constructors
            .Map(c =>

                 codeGenerator.CreateConstructor(
                     modifiers:
                     "public",
                     parameters:
                     c.Parameters.ToKeyValuePair(),
                     constructorInitializer:
                     ": base(" + string.Join(",", c.Parameters.Select(p => p.Name)) + ")",
                     constructorBody:
                     string.Empty
                     )
                 );
        }
示例#20
0
        public bool PerformTask(MixinLevelCodeGeneratorPipelineState manager)
        {
            if (!manager.MixinGenerationPlan.AbstractWrapperPlan.GenrateAbstractWrapper)
            {
                return(true);
            }

            var codeGenerator =
                new CodeGeneratorProxy(manager.AbstractMembersWrapper);

            CreateRequirementsDataMember(codeGenerator, manager);

            CreateRequirementsDataMemberAndConstructor(codeGenerator, manager);

            ProcessMembers(codeGenerator, manager);

            return(true);
        }
        private void ProcessMembers(CodeGeneratorProxy codeGenerator, MixinLevelCodeGeneratorPipelineState manager)
        {
            var proxyMemberHelper =
                new CodeGeneratorProxyMemberHelper(
                    codeGenerator,
                    manager.CommonState.Context.TypeResolver.Compilation);

            proxyMemberHelper.CreateMembers(
                members:
                manager.MixinGenerationPlan.ProtectedWrapperPlan.Members,
                generateMemberModifier:
                m => "public new " + (m.Member.IsStatic ? " static" : ""),
                baseObjectIdentifierFunc:
                m =>
                (m.Member.IsStatic)
                        ? m.MixinAttribute.Mixin.GetOriginalFullNameWithGlobal()
                        : "base");
        }
示例#22
0
        public bool PerformTask(pMixinGeneratorPipelineState manager)
        {
            if (manager.CurrentpMixinAttribute.Mixin.GetDefinition().IsStatic)
            {
                return(true);
            }

            //Create the TypeDeclaration
            var requirementsInterfaceDeclaration =
                new TypeDeclaration
            {
                ClassType = ClassType.Interface,
                Modifiers = Modifiers.Public,
                Name      =
                    "I"
                    + manager.CurrentpMixinAttribute.Mixin.GetNameAsIdentifier()
                    + "Requirements"
            };

            var interfaceNamespace = ExternalGeneratedNamespaceHelper.GenerateNamespace(manager);

            //Save the interface's FullName into the manager
            manager.CurrentMixinRequirementsInterface =
                interfaceNamespace
                .EnsureStartsWith("global::").EnsureEndsWith(".") +
                requirementsInterfaceDeclaration.Name;

            //Add the TypeDeclaration to the Generated Code Tree
            manager.BaseState.GeneratedCodeSyntaxTree.AddChildTypeDeclaration(
                requirementsInterfaceDeclaration, new NamespaceDeclaration(interfaceNamespace));

            //Create the Code Generator
            var requirementInterface = new CodeGeneratorProxy(
                requirementsInterfaceDeclaration, "");

            ProcessAbstractMembers(manager, requirementInterface);

            //Have the Target implement mixinRequirementsInterface
            manager.GeneratedClass.ImplementInterface(manager.CurrentMixinRequirementsInterface);

            return(true);
        }
示例#23
0
        public bool PerformTask(TargetLevelCodeGeneratorPipelineState manager)
        {
            var codeGeneratorProxy =
                new CodeGeneratorProxy(manager.TargetCodeBehindTypeDeclaration);

            manager.CodeGenerationPlan.MixinGenerationPlans.Values
            .Where(mgp => mgp.AddIMixinConstructorRequirementInterface)
            .Map(mgp =>

                 codeGeneratorProxy.ImplementInterface(
                     string.Format("{0}.{1}<{2}>",
                                   typeof(IMixinConstructorRequirement <>).Namespace,
                                   "IMixinConstructorRequirement",
                                   mgp.MasterWrapperPlan.MixinInstanceTypeFullName
                                   )
                     )
                 );

            return(true);
        }
示例#24
0
        private void AddConstructor(CodeGeneratorProxy mixinsClassCodeGenerator, TargetLevelCodeGeneratorPipelineState manager)
        {
            const string targetInstanceConstructorParameterName = "target";

            var constructorBodyStatements = new StringBuilder();

            foreach (var mixin in manager.CodeGenerationPlan.MixinGenerationPlans.Values)
            {
                constructorBodyStatements.AppendFormat(
                    "{0} = {1};",

                    mixin.MasterWrapperPlan.MasterWrapperInstanceNameInMixinsContainer,

                    TypeExtensions.GenerateActivationExpression(
                        typeFullName:
                        GetMasterWrapperFullTypeName(mixin),
                        constructorArgs:
                        string.Format(
                            "({0}.{1}) {2}",
                            mixin.ExternalMixinSpecificAutoGeneratedNamespaceName,
                            mixin.RequirementsInterfacePlan.RequirementsInterfaceName,
                            targetInstanceConstructorParameterName))
                    );
            }

            mixinsClassCodeGenerator.CreateConstructor(
                modifiers:
                "public",
                parameters:
                new[]
            {
                new KeyValuePair <string, string>(
                    manager.TargetSourceTypeDeclaration.Name,
                    targetInstanceConstructorParameterName)
            },
                constructorInitializer:
                string.Empty,
                constructorBody:
                constructorBodyStatements.ToString());
        }
示例#25
0
        private void ProcessConstructors(pMixinGeneratorPipelineState manager, CodeGeneratorProxy requirementInterface)
        {
            bool hasANonParamaterlessConstructor =
                manager.CurrentpMixinAttribute.Mixin.GetConstructors()
                .Any(c => !c.Parameters.Any());

            if (hasANonParamaterlessConstructor &&
                !manager.CurrentpMixinAttribute.Mixin.GetDefinition().IsAbstract&&
                !manager.CurrentpMixinAttribute.ExplicitlyInitializeMixin)
            {
                return;
            }


            //Update ExplicitlyInitializeMixin - Changed mind, user has to always set
            //ExplicitlyInitializeMixin to true even if mixin does not have parameterless constructor.
            //They could be using a custom MixinActivator that uses DI
            //manager.CurrentpMixinAttribute.ExplicitlyInitializeMixin = true;
            if (!manager.CurrentpMixinAttribute.ExplicitlyInitializeMixin)
            {
                return;
            }


            var requiredMixinWrapperType =
                (manager.CurrentpMixinAttribute.Mixin.GetDefinition().IsAbstract)
                    ? GenerateMixinSpecificAutoGeneratedClass.GetFullNameForChildType(
                    manager,
                    GenerateAbstractMixinMembersWrapperClass.GetWrapperClassName(manager))
                    : manager.CurrentpMixinAttribute.Mixin.GetOriginalFullNameWithGlobal();

            //generate the mixin initialization method
            requirementInterface.CreateMethod(
                string.Empty, //no modifier for interface member
                requiredMixinWrapperType,
                GetInitializationMethod(manager),
                new List <KeyValuePair <string, string> >(),
                "");
        }
        private void CreateActivateDependencyMethod(CodeGeneratorProxy codeGenerator, MixinGenerationPlan mixinPlan)
        {
            const string targetInstanceMethodParameterName = "target";

            var methodBodyStatements = new StringBuilder();

            foreach (var dependency in mixinPlan.MasterWrapperPlan.MixinDependencies)
            {
                methodBodyStatements.AppendFormat(
                    @"  (({0}){1}).Dependency = {2};
                        (({0}){1}).OnDependencySet();",

                    dependency.GetOriginalFullNameWithGlobal(),
                    MasterWrapperPlan.MixinInstanceDataMemberName,
                    targetInstanceMethodParameterName);
            }

            codeGenerator.CreateMethod(
                modifier:
                "public",
                returnTypeFullName:
                "void",
                methodName:
                mixinPlan.CodeGenerationPlan.TargetCodeBehindPlan.MixinsActivateMixinDependenciesMethodName,
                parameters:
                new[]
            {
                new KeyValuePair <string, string>(
                    mixinPlan.CodeGenerationPlan.SourceClass.GetFullTypeName(),
                    targetInstanceMethodParameterName)
            },
                methodBody:
                methodBodyStatements.ToString()
                //make sure method has at least an empty body
                .IfEmpty("{}"));
        }
        public bool PerformTask(TargetLevelCodeGeneratorPipelineState manager)
        {
            var codeGenerator =
                new CodeGeneratorProxy(manager.TargetCodeBehindTypeDeclaration);

            const string targetInstanceMethodParameterName = "target";

            foreach (var conversionPlan in manager.CodeGenerationPlan.TargetCodeBehindPlan.ImplicitCoversionPlans)
            {
                codeGenerator.CreateMethod(
                    modifier:
                    "public static implicit",
                    returnTypeFullName:
                    "operator",
                    methodName:
                    conversionPlan.ConversionTargetType.GetOriginalFullNameWithGlobal(),
                    parameters:
                    new []
                {
                    new KeyValuePair <string, string>(
                        manager.TargetCodeBehindTypeDeclaration.Name,
                        targetInstanceMethodParameterName)
                },
                    methodBody:
                    string.Format(
                        "return {0}.{1}.{2};",
                        targetInstanceMethodParameterName,
                        conversionPlan.MixinGenerationPlan.MasterWrapperPlan
                        .MasterWrapperInstanceNameAvailableFromTargetCodeBehind,
                        MasterWrapperPlan.MixinInstanceDataMemberName)
                    );
            }


            return(true);
        }
        private void GenerateVirtualFuncDataMembers(CodeGeneratorProxy codeGenerator, MixinLevelCodeGeneratorPipelineState manager)
        {
            foreach (var mw in manager.MixinGenerationPlan.MasterWrapperPlan.VirtualMembers)
            {
                if (mw.Member is IMethod)
                {
                    var virtualFuncReturnType =
                        (mw.Member as IMethod).ReturnType.Kind == TypeKind.Void
                            ? typeof(Action).GetOriginalFullNameWithGlobal()
                            : string.Format("global::System.Func<{0}>",
                                            string.Join(",",
                                                        (mw.Member as IMethod).Parameters
                                                        .Select(x => x.Type.GetOriginalFullNameWithGlobal())
                                                        .Concat(new[] { mw.Member.ReturnType.GetOriginalFullNameWithGlobal() })));

                    codeGenerator.CreateProperty(
                        modifier:
                        "public",
                        returnTypeFullName:
                        virtualFuncReturnType,
                        propertyName:
                        mw.ImplementationDetails.VirtualMemberFunctionName,
                        getterMethodBody:
                        "get;",
                        setterMethodBody:
                        "set;");
                }
                else if (mw.Member is IProperty)
                {
                    //Get
                    if ((mw.Member as IProperty).CanGet && !(mw.Member as IProperty).Getter.IsPrivate)
                    {
                        codeGenerator.CreateProperty(
                            modifier:
                            "public",
                            returnTypeFullName:
                            "global::System.Func<" + mw.Member.ReturnType.GetOriginalFullNameWithGlobal() + ">",
                            propertyName:
                            mw.ImplementationDetails.VirtualMemberFunctionName + "Get",
                            getterMethodBody:
                            "get;",
                            setterMethodBody:
                            "set;");
                    }
                    //Set
                    if ((mw.Member as IProperty).CanSet && !(mw.Member as IProperty).Setter.IsPrivate)
                    {
                        codeGenerator.CreateProperty(
                            modifier:
                            "public",
                            returnTypeFullName:
                            "global::System.Action<" + mw.Member.ReturnType.GetOriginalFullNameWithGlobal() + ">",
                            propertyName:
                            mw.ImplementationDetails.VirtualMemberFunctionName + "Set",
                            getterMethodBody:
                            "get;",
                            setterMethodBody:
                            "set;");
                    }
                }
            }
        }