IDE Lazarus. "Hint from comment" по другому.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

IDE Lazarus. "Hint from comment" по другому.

Сообщение iN0k » 22.02.2013 22:30:30

Преамбула: "Hint from comment", для меня, мощная и востребованная функция IDE.

Недовольство: коробочная версия, по моему мнению, имеет ряд недостатков в реализации. Во первых, для отображения текста в окне Hint из "внешних" модулей приходится писать в разделе interface, что приводит к его "засорению" излишними комментариями. А так же, "текстовка" окна Hint внутри модуля, берется из раздела implementation.

Идея: для методов и функций искать "комментарий-описание" в разделе implementation в любом случае.

Решение: изменить реализацию метода TCodeHelpManager.GetPasDocCommentsAsHTML (...lazarus/ide/CodeHelp.pas)

Недостатки: глобальная переменная CodeHelpBoss(TCodeHelpManager), реализующая интересующий функционал, инициализируется в методе Create класса TIDEHelpManager (...lazarus/ide/IDEHelpManager.pas) прямым указанием типа. В свою очередь, глобальная переменная HelpBoss(TIDEHelpManager) инициализируетя в TMainIDE.Create(...lazarus/ide/main.pp) тоже прямым указанием типа. То есть, при переустановки IDE, приходится лезть в исходники и "исправлять".

Вопрос: точнее их два. Первый: где я пропустил возможность использования *.lpk и ideintf. Второй: у кого можно попросить (кто может помочь оформить заявку) реализацию данного функционала.

ЗЫ: по идее, комментарии можно оформлять в виде pasDoc (или любых других видах) и "красиво" отображать в "подсказке".
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Re: IDE Lazarus. "Hint from comment" по другому.

Сообщение iN0k » 05.03.2013 23:48:25

то ли этим никто кроме меня не пользуется, или написал путано ... то ли еще как :|
попробую с другой стороны :D

все выше изложенное на данный момент у меня решается кодом
Код: Выделить всё
unit ink_codehelp;

{$mode objfpc}{$H+}

{off $DEFINE VerboseCodeHelp}
{off $DEFINE VerboseCodeHelpFails}
{off $DEFINE VerboseHints}

{$IFDEF VerboseCodeHelp}
  {$DEFINE VerboseCodeHelpFails}
{$ENDIF}

interface

uses Classes, CodeTree, FindDeclarationTool, BasicCodeTools, CodeCache, CodeHelp;

type

  TinkCodeHelpManager = class(TCodeHelpManager)
  protected
    function _ink_getComment(const Tool: TFindDeclarationTool; const Node:TCodeTreeNode):string;
    function _ink_getComments(const Tool:TFindDeclarationTool; const NodeInterface,NodeImplementation:TCodeTreeNode):string;
    function _inc_getNodePlace(const Tool:TFindDeclarationTool; const Node:TCodeTreeNode):TCodeTreeNodeDesc;
  public
    function GetPasDocCommentsAsHTML(Tool:TFindDeclarationTool; Node:TCodeTreeNode):string; override;
  end;


implementation

{найти и сформировать строку HintFromComment для узла. ворованно из пародителя}
function TinkCodeHelpManager._ink_getComment(const Tool: TFindDeclarationTool; const Node:TCodeTreeNode):string;
var ListOfPCodeXYPosition: TFPList;
    NestedComments: Boolean;
    i: Integer;
    CommentCode: TCodeBuffer;
    CommentStart: integer;
    CodeXYPos: PCodeXYPosition;
    CommentStr: String;
begin
    try
        result:='';
        if not Tool.GetPasDocComments(Node,ListOfPCodeXYPosition) then exit;
        if ListOfPCodeXYPosition=nil then exit;
        NestedComments := Tool.Scanner.NestedComments;
        //---
        for i:= 0 to ListOfPCodeXYPosition.Count - 1 do begin
            CodeXYPos := PCodeXYPosition(ListOfPCodeXYPosition[i]);
            CommentCode := CodeXYPos^.Code;
            CommentCode.LineColToPosition(CodeXYPos^.Y,CodeXYPos^.X,CommentStart);
            if (CommentStart<1) or (CommentStart>CommentCode.SourceLength) then continue;
            Result:=Result+ExtractCommentContent(CommentCode.Source,CommentStart,
                                         NestedComments,true,true,true)+LineEnding;
        end;
    finally
        FreeListOfPCodeXYPosition(ListOfPCodeXYPosition);
    end;
end;

{ найти и сформировать строку HintFromComment для узлов из раздела Interface и Implementation}
function TinkCodeHelpManager._ink_getComments(const Tool:TFindDeclarationTool; const NodeInterface,NodeImplementation:TCodeTreeNode):string;
begin
    result:='';
    if NodeInterface     <>nil then result:=result+_ink_getComment(Tool,NodeInterface);
    if NodeImplementation<>nil then result:=result+_ink_getComment(Tool,NodeImplementation);
    //--- а вот тут, наверно, можно попробовать "распарсить" pasDoc или аналоги
    if Result<>'' then Result:='<span class="comment">'+TextToHTML(Result)+'</span><br>'+LineEnding;
end;

{ определить местоположение Узла в разделах Модуля }
function TinkCodeHelpManager._inc_getNodePlace(const Tool:TFindDeclarationTool; const Node:TCodeTreeNode):TCodeTreeNodeDesc;
begin
    result:=ctnNone;
    if tool.NodeHasParentOfType(Node,ctnInterface) then result:=ctnInterface
   else
    if tool.NodeHasParentOfType(Node,ctnImplementation) then result:=ctnImplementation
end;

function TinkCodeHelpManager.GetPasDocCommentsAsHTML(Tool: TFindDeclarationTool; Node: TCodeTreeNode): string;
begin
    Result:='';
    if (Tool=nil)or(Node=nil) then exit;
    if node.Desc<>ctnProcedureHead
    then begin
        // тут все вопросы к Папе, он за нас ответит.
        result:=inherited GetPasDocCommentsAsHTML(Tool,Node);
    end
    else begin
         node:=node.Parent;
         if node.Desc<>ctnProcedure then exit; //< а нужна ли проверка?
         //---
         case _inc_getNodePlace(Tool,node) of
           ctnInterface:
                result:=_ink_getComments(Tool,node,Tool.FindCorrespondingProcNode(node));
           ctnImplementation:
                result:=_ink_getComments(Tool,Tool.FindCorrespondingProcNode(node),node);
           else begin //< к ТАКОМУ повороту мы не готовы, попросим Папу
                result:=inherited GetPasDocCommentsAsHTML(Tool,Node);
           end
         end;
    end;
end;

end.



однако, при переустановке IDE приходится проделывать следующие действия:
1: положить файл ink_codehelp.pas в директорию ...lazarus/ide/
2: отредактировать файл ...lazarus/ide/CodeHelp.pas обозначив метод TCodeHelpManager.GetPasDocCommentsAsHTML как virtual
3: отредактировать файл ...lazarus/ide/IDEHelpManager.pas добавив в раздел uses модуль ink_codehelp и в конструкторе TIDEHelpManager.Create заменить строку "CodeHelpBoss:=TCodeHelpManager.Create(Self);" на " CodeHelpBoss:=TinkCodeHelpManager.Create(Self);"

Вопросs те же: где я пропустил возможность использования *.lpk и ideintf? кто может помочь оформить заявку на реализацию аналогичного функционала в коробочной версии?
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 251

Рейтинг@Mail.ru