unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Buttons, StdCtrls, pparser, pastree, pscanner, strutils;
type
// maybe better / different example https://github.com/fpc/FPCSource/blob/fd677978e7661b22a15fb3a9bce3f5c4b2ae8134/utils/fpdoc/unitdiff.pp#L61
{ TForm1 }
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
procedure BitBtn1Click(Sender: TObject);
private
public
end;
TSimpleEngine = class(TPasTreeContainer)
public
function CreateElement(AClass: TPTreeElement; const AName: String;
AParent: TPasElement; AVisibility: TPasMemberVisibility;
const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement;
override;
function FindElement(const AName: String): TPasElement; override;
end;
var
Form1: TForm1;
procedure ParseFile(const FileName: string);
implementation
function TSimpleEngine.CreateElement(AClass: TPTreeElement; const AName: String;
AParent: TPasElement; AVisibility: TPasMemberVisibility;
const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement;
begin
Result := AClass.Create(AName, AParent);
Result.Visibility := AVisibility;
Result.SourceFilename := ASourceFilename;
Result.SourceLinenumber := ASourceLinenumber;
end;
function TSimpleEngine.FindElement(const AName: String): TPasElement;
begin
{ dummy implementation, see TFPDocEngine.FindElement for a real example }
Result := nil;
end;
procedure ParseFile(const FileName: string);
var
I: Integer;
Var
R : TStreamResolver;
S : TPascalScanner;
P : TPasParser;
M : TPasModule;
C : TPasTreeContainer;
ms: TMemoryStream;
begin
R:= TStreamResolver.Create;
try
ms:= Tmemorystream.create();
ms.LoadFromFile(filename);
r.BaseDirectory:= ExtractFilePath(filename);
r.AddIncludePath( ExtractFilePath(filename) );
R.AddStream(ExtractFileName(filename), ms);
S:=TPascalScanner.Create(R);
try
S.OpenFile(ExtractFileName(filename));
C:= TPasTreeContainer.Create();
try
C.InterfaceOnly:=True;
P:=TPasParser.Create(S, R, C);
try
P.ParseUnit(M);
finally
P.Free;
end;
finally
C.Free;
end;
finally
S.Free;
end;
finally
R.Free;
end;
end;
{$R *.lfm}
{ TForm1 }
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if opendialog1.execute = false then exit;
ParseFile(opendialog1.FileName);
end;
end.