示例#1
0
        private EntityDeclaration GenerateProperty(
            MemberWrapper mw,
            ICodeGeneratorProxy targetCodeBehind,
            string masterWrapperVariableName)
        {
            var property = (IProperty)mw.Member;

            if (mw.ImplementationDetails.ImplementExplicitly)
            {
                return
                    (targetCodeBehind.CreateProperty(
                         modifier:
                         string.Empty,
                         returnTypeFullName:
                         property.ReturnType.GetOriginalFullNameWithGlobal(),
                         propertyName:
                         property.IsIndexer
                                ? string.Format(
                             "{0}.this [{1} {2}]",
                             mw.ImplementationDetails.ExplicitInterfaceImplementationType
                             .GetOriginalFullNameWithGlobal(),
                             property.Parameters.First().Type.GetOriginalFullNameWithGlobal(),
                             property.Parameters.First().Name
                             )
                                :
                         mw.ImplementationDetails.ExplicitInterfaceImplementationType
                         .GetOriginalFullNameWithGlobal() +
                         "." + property.Name,
                         getterMethodBody:
                         GetPropertyGetterStatement(mw, masterWrapperVariableName),
                         setterMethodBody:
                         GetPropertySetterStatement(mw, masterWrapperVariableName)));
            }
            else
            {
                return
                    (targetCodeBehind.CreateProperty(
                         modifier:
                         property.GetModifiersString(
                             overrideModifiers:
                             mw.ImplementationDetails.ImplementInTargetAsAbstract
                                    ? "abstract" : null),
                         returnTypeFullName:
                         property.ReturnType.GetOriginalFullNameWithGlobal(),
                         propertyName:
                         property.IsIndexer
                                ? string.Format(
                             "this [{0} {1}]",
                             property.Parameters.First().Type.GetOriginalFullNameWithGlobal(),
                             property.Parameters.First().Name
                             )
                                : property.Name,
                         getterMethodBody:
                         GetPropertyGetterStatement(mw, masterWrapperVariableName),
                         setterMethodBody:
                         GetPropertySetterStatement(mw, masterWrapperVariableName)));
            }
        }
        /// <summary>
        /// Create code similar to:
        /// <code>
        /// <![CDATA[
        /// public System.Func<int,string> ProtectedVirtualMethodFunc { get; set; }
        ///
        /// public System.Func<string> PublicVirtualPropertyGetFunc { get; set; }
        /// public System.Action<string> PublicVirtualPropertySetFunc { get; set; }
        ///
        /// ]]></code>
        /// </summary>
        /// <param name="manager"></param>
        /// <param name="wrapperClass"></param>
        private void CreateVirtualMemberFunctions(
            pMixinGeneratorPipelineState manager, ICodeGeneratorProxy wrapperClass)
        {
            var membersThatNeedVirtualFuncs =
                manager.CurrentMixinMembers.Select(x => x.Member)
                .DistinctMembers()
                .Where(
                    member => member.IsVirtual ||
                    member.IsOverride ||
                    member.IsOverridable);

            foreach (var member in membersThatNeedVirtualFuncs)
            {
                if (member is IMethod)
                {
                    var propertyReturnType =
                        (member as IMethod).ReturnType.Kind == TypeKind.Void
                            ? "global::System.Action"
                            : String.Format("global::System.Func<{0}>",
                                            string.Join(",",
                                                        (member as IMethod).Parameters.Select(x => x.Type.GetOriginalFullNameWithGlobal())
                                                        .Union(member.ReturnType.GetFullTypeName())));

                    wrapperClass.CreateProperty(
                        "public",
                        propertyReturnType,
                        this.GenerateVirtualMethodFuncName(member),
                        "get;",
                        "set;");
                }
                else if (member is IProperty)
                {
                    //Get
                    if ((member as IProperty).CanGet && !(member as IProperty).Getter.IsPrivate)
                    {
                        wrapperClass.CreateProperty(
                            "public",
                            "global::System.Func<" + member.ReturnType.GetOriginalFullNameWithGlobal() + ">",
                            GenerateVirtualMethodFuncName(member) + "Get",
                            "get;",
                            "set;");
                    }
                    //Set
                    if ((member as IProperty).CanSet && !(member as IProperty).Setter.IsPrivate)
                    {
                        wrapperClass.CreateProperty(
                            "public",
                            "global::System.Action<" + member.ReturnType.GetOriginalFullNameWithGlobal() + ">",
                            GenerateVirtualMethodFuncName(member) + "Set",
                            "get;",
                            "set;");
                    }
                }
            }
        }
示例#3
0
        private EntityDeclaration GenerateField(
            IField field,
            ICodeGeneratorProxy targetCodeBehind,
            string masterWrapperVariableName)
        {
            return

                (targetCodeBehind.CreateProperty(
                     modifier:
                     field.GetModifiersString(),
                     returnTypeFullName:
                     field.ReturnType.GetOriginalFullNameWithGlobal(),
                     propertyName:
                     field.Name,
                     getterMethodBody:
                     string.Format(
                         "get{{ return {0}.{1}; }}",
                         masterWrapperVariableName,
                         field.Name),
                     setterMethodBody:
                     (field.IsConst || field.IsReadOnly)
                            ? string.Empty
                            : string.Format(
                         "set{{ {0}.{1} = value; }}",
                         masterWrapperVariableName,
                         field.Name)));
        }
示例#4
0
        public void CreateMembers(IEnumerable <MemberWrapper> memberWrappers)
        {
            foreach (var mw in memberWrappers)
            {
                #region Process Methods
                if (mw.Member is IMethod)
                {
                    CodeGeneratorProxy.CreateMethod(
                        modifier:
                        string.Empty,     //no modifier for interface member
                        returnTypeFullName:
                        mw.Member.ReturnType.GetOriginalFullNameWithGlobal(),
                        methodName:
                        mw.ImplementationDetails.RequirementsInterfaceImplementationName,
                        parameters:
                        (mw.Member as IMethod).Parameters.ToKeyValuePair(),
                        methodBody:
                        string.Empty,
                        constraingClause:
                        (mw.Member as IMethod).GetGenericMethodConstraints(Compilation));
                }
                #endregion

                #region Process Properties
                else if (mw.Member is IProperty)
                {
                    CodeGeneratorProxy.CreateProperty(
                        modifier:
                        string.Empty,     //no modifier for interface member
                        returnTypeFullName:
                        mw.Member.ReturnType.GetOriginalFullNameWithGlobal(),
                        propertyName:
                        mw.ImplementationDetails.RequirementsInterfaceImplementationName,
                        getterMethodBody:
                        (mw.Member as IProperty).CanGet ? "get;" : "",
                        setterMethodBody:
                        (mw.Member as IProperty).CanSet ? "set;" : "");
                }
                #endregion
            }
        }
        /// <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
            }
        }