/// <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 ); }
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 } }
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 } }