/// <summary> /// Initializes the generated type declaration /// </summary> /// <param name="input">The input model element</param> /// <param name="generatedType">The generated class declaration</param> /// <param name="context">The transformation context</param> /// <remarks>Can be overridden to refine code generation</remarks> public override void Transform(T input, CodeTypeDeclaration generatedType, ITransformationContext context) { HashSet <CodeTypeMember> shadows; var ownShadows = generatedType.Shadows(false); if (ownShadows != null) { shadows = new HashSet <CodeTypeMember>(ownShadows); } else { shadows = new HashSet <CodeTypeMember>(); } var constructor = CodeDomHelper.GetOrCreateDefaultConstructor(generatedType, () => new CodeConstructor() { Attributes = MemberAttributes.Public }); var dependends = generatedType.DependentMembers(false); if (dependends != null) { foreach (var member in dependends) { RecursivelyAddDependentMembers(generatedType.Members, constructor.Statements, member, shadows); } } var interfaceDecl = CreateSeparatePublicInterface(input, generatedType); if (interfaceDecl != null) { CodeDomHelper.SetUserItem(generatedType, CodeDomHelper.InterfaceKey, interfaceDecl); var dependentTypes = CodeDomHelper.DependentTypes(generatedType, true); dependentTypes.Add(interfaceDecl); var typeReference = generatedType.GetReferenceForType(); typeReference.BaseType = interfaceDecl.Name; CreateInterfaceMembers(generatedType, interfaceDecl); for (int i = generatedType.BaseTypes.Count - 1; i >= 0; i--) { var baseTypeRef = generatedType.BaseTypes[i]; var baseType = CodeDomHelper.GetOrCreateUserItem <CodeTypeDeclaration>(baseTypeRef, CodeDomHelper.ClassKey); if (baseType == null) { continue; } interfaceDecl.BaseTypes.Add(baseTypeRef); generatedType.BaseTypes.RemoveAt(i); } generatedType.BaseTypes.Add(typeReference); ResolveMultipleInheritanceMembers(generatedType, shadows, constructor); } if (constructor.Statements.Count > 0) { CodeDomHelper.SetUserItem(generatedType, CodeDomHelper.ConstructorKey, constructor); generatedType.Members.Add(constructor); } }