Esempio n. 1
0
        private void ProcessVirtualMembers(
            MasterWrapperCodeGeneratorProxyMemberHelper proxyMemberHelper,
            MixinLevelCodeGeneratorPipelineState manager)
        {
            var virtualMethods =
                manager.MixinGenerationPlan.MasterWrapperPlan.VirtualMembers
                .Where(mw => mw.Member is IMethod);

            var virtualPropertiesAndFields =
                manager.MixinGenerationPlan.MasterWrapperPlan.VirtualMembers
                .Where(mw => mw.Member is IProperty || mw.Member is IField);

            #region Methods
            proxyMemberHelper.CreateMembers(
                virtualMethods,
                generateMemberModifier:
                member => "public",
                baseObjectIdentifierFunc:
                member => "this",
                baseObjectMemberNameFunc:
                member => member.ImplementationDetails.VirtualMemberFunctionName
                );
            #endregion

            #region Properties

            //virtual properties need to be created directly.

            foreach (var virtualProp in virtualPropertiesAndFields)
            {
                proxyMemberHelper.CodeGeneratorProxy.CreateProperty(
                    modifier:
                    "internal",
                    returnTypeFullName:
                    virtualProp.Member.ReturnType.GetOriginalFullNameWithGlobal(),
                    propertyName:
                    virtualProp.Member.Name,
                    getterMethodBody:
                    (!(virtualProp.Member is IProperty) ||
                     !(virtualProp.Member as IProperty).CanGet)
                          ? string.Empty
                          : string.Format(
                        "get{{ return base.ExecutePropertyGet(\"{0}\", () => {1}Get();}}",
                        virtualProp.Member.Name,
                        virtualProp.ImplementationDetails.VirtualMemberFunctionName),
                    setterMethodBody:
                    (!(virtualProp.Member is IProperty) ||
                     !(virtualProp.Member as IProperty).CanSet)
                          ? string.Empty
                          : string.Format(
                        "set{{ base.ExecutePropertySet(\"{0}\", value, (v) => {1}Set(v);}}",
                        virtualProp.Member.Name,
                        virtualProp.ImplementationDetails.VirtualMemberFunctionName)
                    );
            }

            #endregion
        }
Esempio n. 2
0
 private void ProcessRegularMembers(
     MasterWrapperCodeGeneratorProxyMemberHelper proxyMemberHelper,
     MixinLevelCodeGeneratorPipelineState manager)
 {
     proxyMemberHelper.CreateMembers(
         manager.MixinGenerationPlan.MasterWrapperPlan.RegularMembers,
         generateMemberModifier:
         member => "public",
         baseObjectIdentifierFunc:
         member => MasterWrapperPlan.MixinInstanceDataMemberName);
 }
Esempio n. 3
0
 private void ProcessProtectedAbstractMembers(
     MasterWrapperCodeGeneratorProxyMemberHelper proxyMemberHelper,
     MixinLevelCodeGeneratorPipelineState manager)
 {
     proxyMemberHelper.CreateMembers(
         manager.MixinGenerationPlan.MasterWrapperPlan.ProtectedAbstractMembers,
         generateMemberModifier:
         member => "public",
         baseObjectIdentifierFunc:
         member => MasterWrapperPlan.MixinInstanceDataMemberName,
         baseObjectMemberNameFunc:
         member => member.ImplementationDetails.ProtectedAbstractMemberPromotedToPublicMemberName
         );
 }
Esempio n. 4
0
 private void ProcessStaticMembers(
     MasterWrapperCodeGeneratorProxyMemberHelper proxyMemberHelper,
     MixinLevelCodeGeneratorPipelineState manager)
 {
     proxyMemberHelper.CreateMembers(
         manager.MixinGenerationPlan.MasterWrapperPlan.StaticMembers,
         generateMemberModifier:
         member => "public static",
         baseObjectIdentifierFunc:
         member =>
         manager.MixinGenerationPlan.AbstractWrapperPlan.GenrateAbstractWrapper
                    ? manager.AbstractMembersWrapper.GetFullTypeName()
                    : manager.MixinGenerationPlan.MixinAttribute.Mixin.GetOriginalFullNameWithGlobal()
         );
 }
Esempio n. 5
0
        private void ProcessExplicitlyImplementedMembers(
            MasterWrapperCodeGeneratorProxyMemberHelper proxyMemberHelper,
            MixinLevelCodeGeneratorPipelineState manager)
        {
            proxyMemberHelper.CreateMembers(
                manager.MixinGenerationPlan.MasterWrapperPlan.ImplementExplicitlyMembers,
                generateMemberModifier:
                member => "",

                generateMemberNameFunc:
                member =>
                string.Format("{0}.{1}",
                              member.ImplementationDetails.ExplicitInterfaceImplementationType
                              .GetOriginalFullNameWithGlobal(),

                              (member.Member is IProperty) &&
                              (member.Member as IProperty).IsIndexer
                                ? string.Format("this [{0} {1}]",
                                                (member.Member as IProperty).Parameters.First().Type.GetOriginalFullNameWithGlobal(),
                                                (member.Member as IProperty).Parameters.First().Name)
                                : member.Member.Name),

                baseObjectIdentifierFunc:
                member =>
                string.Format("( ({0}) {1} )",
                              member.ImplementationDetails.ExplicitInterfaceImplementationType
                              .GetOriginalFullNameWithGlobal(),
                              MasterWrapperPlan.MixinInstanceDataMemberName));


            //Implement Explicit interfaces
            manager.MixinGenerationPlan.MasterWrapperPlan.ImplementExplicitlyMembers
            .Select(x => x.ImplementationDetails.ExplicitInterfaceImplementationType
                    .GetOriginalFullNameWithGlobal())
            .Map(t =>
                 proxyMemberHelper.CodeGeneratorProxy.ImplementInterface(t));
        }
        /// <summary>
        /// Wrap every non-private member in current pMixin with special
        /// handling for static and virtual members
        /// </summary>
        /// <param name="manager"></param>
        /// <param name="wrapperClass"></param>
        private void ProcessMembers(pMixinGeneratorPipelineState manager, ICodeGeneratorProxy wrapperClass)
        {
            var proxyMemberHelper =
                new MasterWrapperCodeGeneratorProxyMemberHelper(wrapperClass,
                                                                manager.BaseState.Context.TypeResolver.Compilation);


            //Static Members
            proxyMemberHelper.CreateMembers(
                manager.CurrentMixinMembers
                .Select(x => x.Member)
                .DistinctMembers()
                .Where(member => member.IsStatic),
                generateMemberModifier: member => "internal static",
                baseObjectIdentifierFunc:
                member =>
                manager.CurrentpMixinAttribute.Mixin.IsStaticOrSealed()
                            ? manager.CurrentpMixinAttribute.Mixin.GetOriginalFullNameWithGlobal()
                            : manager.CurrentMixinAbstractMembersWrapperClass.Name
                );

            //Regular Members
            proxyMemberHelper.CreateMembers(
                manager.CurrentMixinMembers
                .Select(x => x.Member)
                .DistinctMembers()
                .Where(
                    member => !member.IsStatic &&
                    !(member.IsAbstract && member.IsProtected) &&
                    !member.IsOverride &&
                    !member.IsOverridable &&
                    !member.IsVirtual),
                generateMemberModifier: member => "internal",
                baseObjectIdentifierFunc: member => MixinInstanceDataMemberName);

            //Protected Abstract Members
            proxyMemberHelper.CreateMembers(
                manager.CurrentMixinMembers
                .Select(x => x.Member)
                .DistinctMembers()
                .Where(member => (member.IsAbstract || member.IsOverride) && member.IsProtected),
                generateMemberModifier: member => "internal",
                baseObjectIdentifierFunc: member => MixinInstanceDataMemberName,
                baseObjectMemberNameFunc: member =>
                GenerateAbstractMixinMembersWrapperClass.GetProtectedMemberWrapperMemberName(member));


            //Virtual Members
            foreach (
                var member in
                manager.CurrentMixinMembers
                .Select(x => x.Member)
                .DistinctMembers()
                .Where(member => member.IsVirtual ||
                       (member.IsOverride ||
                        member.IsOverridable &&
                        !member.IsProtected)))
            {
                #region Virtual Method
                if (member is IMethod)
                {
                    //Virtual methods call to the Virtual Method Func
                    wrapperClass.CreateMethod(
                        "internal",
                        member.ReturnType.GetOriginalFullNameWithGlobal(),
                        member.Name,
                        (member as IMethod).Parameters.ToKeyValuePair(),
                        string.Format("{0} {1}({2});",
                                      (member as IMethod).GetReturnString(),
                                      GenerateVirtualMethodFuncName(member),
                                      string.Join(",",
                                                  (member as IMethod).Parameters.Select(x => x.Name))),
                        (member as IMethod).GetGenericMethodConstraints(
                            manager.BaseState.Context.TypeResolver.Compilation));
                }
                #endregion
                #region Virtual Property
                else if (member is IProperty)
                {
                    wrapperClass.CreateProperty(
                        "internal",
                        member.ReturnType.GetOriginalFullNameWithGlobal(),
                        member.Name,
                        (member as IProperty).CanGet && !(member as IProperty).Getter.IsPrivate
                            ? string.Format("get{{ return {0}(); }}",
                                            GenerateVirtualMethodFuncName(member) + "Get")
                            : "",
                        (member as IProperty).CanSet && !(member as IProperty).Setter.IsPrivate
                            ? string.Format("set {{{0}(value); }}",
                                            GenerateVirtualMethodFuncName(member) + "Set")
                            : ""
                        );
                }
                #endregion
            }
        }