/// <summary>
        /// Generate code similar to:
        /// <code>
        /// <![CDATA[
        ///     public void __ActivateMixinDependencies(Target target)
        ///     {
        ///        ((IMixinDependency<T>)_mixinInstance).Dependency = mixinInstance;
        ///        ((IMixinDependency<T>)_mixinInstance).OnDependencySet();
        ///     }
        /// ]]>
        /// </code>
        /// </summary>
        private void CreateActivateMixinDependenciesMethod(
            pMixinGeneratorPipelineState manager, ICodeGeneratorProxy wrapperClass)
        {
            const string targetMetherParameterVariableName = "target";

            wrapperClass.CreateMethod(
                modifier: "public",
                returnTypeFullName: "void",
                methodName: ActivateMixinDependenciesMethodName,
                parameters: new[]
            {
                new KeyValuePair <string, string>(
                    manager.GeneratedClass.ClassName,
                    targetMetherParameterVariableName),
            },
                methodBody:

                string.Join(Environment.NewLine,
                            manager.CurrentpMixinAttribute.Mixin
                            .GetAllBaseTypes()
                            .Where(t =>
                                   EnsureMixinDependenciesAreSatisfiedOnGeneratedClass.TypeIsIMixinDependency(t))
                            .Select(t =>
                                    string.Format("(({0}){1}).Dependency = {2};(({0}){1}).OnDependencySet();",
                                                  t.GetOriginalFullNameWithGlobal(),
                                                  MixinInstanceDataMemberName,
                                                  targetMetherParameterVariableName)))

                //Ensure the method is not created as MethodName(); but MethodName(){}
                + Environment.NewLine

                );
        }
示例#2
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
            }
        }
示例#3
0
        private EntityDeclaration GenerateMethod(
            MemberWrapper mw,
            ICodeGeneratorProxy targetCodeBehind,
            ICompilation compilation,
            string masterWrapperVariableName)
        {
            var method = (IMethod)mw.Member;

            if (mw.ImplementationDetails.ImplementExplicitly)
            {
                return
                    (targetCodeBehind.CreateMethod(
                         modifier:
                         string.Empty,
                         returnTypeFullName:
                         method.ReturnType.GetOriginalFullNameWithGlobal(),
                         methodName:
                         mw.ImplementationDetails.ExplicitInterfaceImplementationType
                         .GetOriginalFullNameWithGlobal() +
                         "." + method.Name,
                         parameters:
                         method.Parameters.ToKeyValuePair(),
                         methodBody:
                         string.Format(
                             "{0} (({1}){2}).{3}({4});",
                             (mw.Member.ReturnType.Kind == TypeKind.Void)
                                ? string.Empty : "return",

                             mw.ImplementationDetails.ExplicitInterfaceImplementationType
                             .GetOriginalFullNameWithGlobal(),
                             masterWrapperVariableName,

                             method.GetOriginalName(),

                             string.Join(",", method.Parameters.Select(x => x.Name))),
                         constraingClause:
                         method.GetGenericMethodConstraints(compilation)));
            }
            else
            {
                return
                    (targetCodeBehind.CreateMethod(
                         modifier:
                         method.GetModifiersString(
                             overrideModifiers:
                             mw.ImplementationDetails.ImplementInTargetAsAbstract
                                    ? "abstract" : null),
                         returnTypeFullName:
                         method.ReturnType.GetOriginalFullNameWithGlobal(),
                         methodName:
                         method.GetOriginalName(),
                         parameters:
                         method.Parameters.ToKeyValuePair(),
                         methodBody:
                         mw.ImplementationDetails.ImplementInTargetAsAbstract
                                ? string.Empty
                                : string.Format(
                             "{0} {1}.{2}({3});",
                             (method.ReturnType.Kind == TypeKind.Void)
                                        ? string.Empty
                                        : "return",
                             masterWrapperVariableName,
                             method.GetOriginalName(),
                             string.Join(",", method.Parameters.Select(x => x.Name))),
                         constraingClause:
                         method.GetGenericMethodConstraints(compilation)));
            }
        }
        /// <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
            }
        }