Esempio n. 1
0
        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();
        }