Преамбула: "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 (или любых других видах) и "красиво" отображать в "подсказке".
IDE Lazarus. "Hint from comment" по другому.
Модератор: Модераторы
то ли этим никто кроме меня не пользуется, или написал путано ... то ли еще как
попробую с другой стороны
все выше изложенное на данный момент у меня решается кодом
однако, при переустановке 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? кто может помочь оформить заявку на реализацию аналогичного функционала в коробочной версии?
попробую с другой стороны
все выше изложенное на данный момент у меня решается кодом
Код: Выделить всё
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? кто может помочь оформить заявку на реализацию аналогичного функционала в коробочной версии?
