protected virtual void EmitClassHeader() { WriteTopInitMethods(); var typeDef = Emitter.GetTypeDefinition(); string name = Emitter.Validator.GetCustomTypeName(typeDef, Emitter, false); IsGeneric = typeDef.GenericParameters.Count > 0 && !Helpers.IsIgnoreGeneric(TypeInfo.Type, Emitter); if (name.IsEmpty()) { name = H5Types.ToJsName(TypeInfo.Type, Emitter, asDefinition: true, nomodule: true, ignoreLiteralName: false); } if (typeDef.IsInterface && typeDef.HasGenericParameters) { Write(JS.Types.H5.DEFINE_I); } else { Write(JS.Types.H5.DEFINE); } WriteOpenParentheses(); WriteScript(name); StartPosition = Emitter.Output.Length; Write(", "); if (IsGeneric) { if (TypeInfo.Module != null) { Write(TypeInfo.Module.Name); Write(", "); } WriteFunction(); WriteOpenParentheses(); foreach (var p in typeDef.GenericParameters) { if (typeDef.GenericParameters.Count(gp => gp.FullName == p.FullName) > 1) { throw new EmitterException(TypeInfo.TypeDeclaration, $"Type parameter '{p.FullName}' has the same name as the type parameter from outer type."); } EnsureComma(false); Write(p.Name); Emitter.Comma = true; } Emitter.Comma = false; WriteCloseParentheses(); Write(" { return "); } BeginBlock(); string extend = Emitter.GetTypeHierarchy(); if (extend.IsNotEmpty() && !TypeInfo.IsEnum) { var h5Type = Emitter.H5Types.Get(Emitter.TypeInfo); if (TypeInfo.InstanceMethods.Any(m => m.Value.Any(subm => Emitter.GetEntityName(subm) == JS.Fields.INHERITS)) || TypeInfo.InstanceConfig.Fields.Any(m => m.GetName(Emitter) == JS.Fields.INHERITS)) { Write(JS.Vars.D); } Write(JS.Fields.INHERITS); WriteColon(); if (Helpers.IsTypeArgInSubclass(h5Type.TypeDefinition, h5Type.TypeDefinition, Emitter, false)) { WriteFunction(); WriteOpenCloseParentheses(true); WriteOpenBrace(true); WriteReturn(true); Write(extend); WriteSemiColon(); WriteCloseBrace(true); } else { Write(extend); } Emitter.Comma = true; } WriteKind(); EmitMetadata(); WriteObjectLiteral(); if (TypeInfo.Module != null) { WriteScope(); WriteModule(); } WriteVariance(); }