Информация об изменениях

Сообщение Re: Документирующие комментарии в генерируемом коде от 20.05.2015 17:37

Изменено 20.05.2015 17:46 Mystic Artifact

Здравствуйте, artelk, Вы писали:

В целом, надо править компилятор.
Однако, там, года так 3 назад, можно было это дело сделать приблизительно так:
Суть в том, что мы устанавливаем декларациям Location, и добавляем этот Location в DocComments, и они генерируются.
Как я сказал, дело было очень давно — ничего не помню.
По крайней мере, если в этом направлении порыть — думаю можно что-нибудь придумать.

// module CompileEnv (своё)

        mutable _documentLine : int;

        public SetDescription(typer : Typer, member : ClassMember.TypeDeclaration, summary : string) : void
        {
            when (EmitDescriptions)
            {
                def manager = typer.Manager;
                unless (string.IsNullOrEmpty(manager.Options.XmlDocOutputFileName))
                {
                    _documentLine++;
                    member.Location = Location("_SetDescription_g_", _documentLine, 1, _documentLine, 1);
                    member.td.Location = member.Location;
                    manager.DocComments = manager.DocComments.Add(member.Location, $<#<summary>$summary</summary>#>);
                }
            }
        }

        public SetDescription(typer : Typer, member : ClassMember, summary : string) : void
        {
            when (EmitDescriptions)
            {
                def manager = typer.Manager;
                unless (string.IsNullOrEmpty(manager.Options.XmlDocOutputFileName))
                {
                    unless (EmitDebugSources) {
                        _documentLine++;
                        member.Location = Location(member.Location, _documentLine, 1);
                    }
                    manager.DocComments = manager.DocComments.Add(member.Location, $<#<summary>$summary</summary>#>);
                }
            }
        }


Использовалось как-то так:
// для типа
                    def typeDecl = <[decl: 
                    [System.CodeDom.Compiler.GeneratedCode($(CompileEnv.CompilerName : string), $(CompileEnv.CompilerVersion : string))]
                    public partial class $(@class.CliDeclarationName : usesite)
                    {
                    }]>;
                    CompileEnv.SetDescription(typer, typeDecl, @class.Descrpition);

// для члена
                        def fieldDecl = <[decl: public $(field.Name : usesite) : $(fieldType)
                            {
                                get { this.$(backStoreName : usesite) }
                                set { this.$(backStoreName : usesite) = value; }
                            } ]>;
                        def description = if (string.IsNullOrEmpty(field.NameBySpecification)) field.Description else $<#($(field.NameBySpecification)) $(field.Description)#>;
                        CompileEnv.DefineMember(typeBuilder, fieldDecl);
                        CompileEnv.SetDescription(typer, fieldDecl, description);
Здравствуйте, artelk, Вы писали:

В целом, надо править компилятор.
Однако, там, года так 3 назад, можно было это дело сделать приблизительно так:
Суть в том, что мы устанавливаем декларациям Location, и добавляем этот Location в DocComments, и они генерируются.
Как я сказал, дело было очень давно — ничего не помню.
По крайней мере, если в этом направлении порыть — думаю можно что-нибудь придумать.
UPD: В общем, задача сводится к тому, что-бы https://github.com/rsdn/nemerle/blob/master/ncc/hierarchy/XmlDump.n в компиляторе генерировал нужное.

// module CompileEnv (своё)

        mutable _documentLine : int;

        public SetDescription(typer : Typer, member : ClassMember.TypeDeclaration, summary : string) : void
        {
            when (EmitDescriptions)
            {
                def manager = typer.Manager;
                unless (string.IsNullOrEmpty(manager.Options.XmlDocOutputFileName))
                {
                    _documentLine++;
                    member.Location = Location("_SetDescription_g_", _documentLine, 1, _documentLine, 1);
                    member.td.Location = member.Location;
                    manager.DocComments = manager.DocComments.Add(member.Location, $<#<summary>$summary</summary>#>);
                }
            }
        }

        public SetDescription(typer : Typer, member : ClassMember, summary : string) : void
        {
            when (EmitDescriptions)
            {
                def manager = typer.Manager;
                unless (string.IsNullOrEmpty(manager.Options.XmlDocOutputFileName))
                {
                    unless (EmitDebugSources) {
                        _documentLine++;
                        member.Location = Location(member.Location, _documentLine, 1);
                    }
                    manager.DocComments = manager.DocComments.Add(member.Location, $<#<summary>$summary</summary>#>);
                }
            }
        }


Использовалось как-то так:
// для типа
                    def typeDecl = <[decl: 
                    [System.CodeDom.Compiler.GeneratedCode($(CompileEnv.CompilerName : string), $(CompileEnv.CompilerVersion : string))]
                    public partial class $(@class.CliDeclarationName : usesite)
                    {
                    }]>;
                    CompileEnv.SetDescription(typer, typeDecl, @class.Descrpition);

// для члена
                        def fieldDecl = <[decl: public $(field.Name : usesite) : $(fieldType)
                            {
                                get { this.$(backStoreName : usesite) }
                                set { this.$(backStoreName : usesite) = value; }
                            } ]>;
                        def description = if (string.IsNullOrEmpty(field.NameBySpecification)) field.Description else $<#($(field.NameBySpecification)) $(field.Description)#>;
                        CompileEnv.DefineMember(typeBuilder, fieldDecl);
                        CompileEnv.SetDescription(typer, fieldDecl, description);