Difference between revisions of "fcl-passrc"
From Lazarus wiki
Jump to navigationJump to search (wikitable) |
(In FPC > 2.6.0, Declarations are TFPList, not TList. Also, make the example work for non-units too, by checking is InterfaceSection <> nil, and printing ImplementationSection too.) |
||
Line 59: | Line 59: | ||
E: TPasTreeContainer; | E: TPasTreeContainer; | ||
I: Integer; | I: Integer; | ||
− | Decls: TList; | + | Decls: {$ifdef VER2_6} TList {$else} { for FPC > 2.6.0 } TFPList {$endif}; |
begin | begin | ||
E := TSimpleEngine.Create; | E := TSimpleEngine.Create; | ||
Line 65: | Line 65: | ||
M := ParseSource(E, ParamStr(1), 'linux', 'i386'); | M := ParseSource(E, ParamStr(1), 'linux', 'i386'); | ||
− | { Cool, we successfully parsed the | + | { Cool, we successfully parsed the module. |
Now output some info about it. } | Now output some info about it. } | ||
− | Decls := M.InterfaceSection.Declarations; | + | if M.InterfaceSection <> nil then |
+ | begin | ||
+ | Decls := M.InterfaceSection.Declarations; | ||
+ | for I := 0 to Decls.Count - 1 do | ||
+ | Writeln('Interface item ', I, ': ' + | ||
+ | (TObject(Decls[I]) as TPasElement).Name); | ||
+ | end else | ||
+ | Writeln('No interface section --- this is not a unit, this is a ', M.ClassName); | ||
+ | |||
+ | Decls := M.ImplementationSection.Declarations; | ||
for I := 0 to Decls.Count - 1 do | for I := 0 to Decls.Count - 1 do | ||
− | Writeln(' | + | Writeln('Implementation item ', I, ': ' + |
(TObject(Decls[I]) as TPasElement).Name); | (TObject(Decls[I]) as TPasElement).Name); | ||
Revision as of 01:50, 11 May 2012
This package contains some useful units for dealing with Pascal source files: Parsing, creating structures in memory, and output to files.
Used by: fpdoc
units
Unit | - | Comment |
---|---|---|
pastree | - | Pascal parse tree classes, for storing a complete Pascal module in memory. |
paswrite | - | A class and helper functions for creating Pascal source files from parse trees |
pparser | - | Parser for Pascal source files. Reads files via the pscanner unit and stores all parsed data in a parse tree, as implemented in the pastree unit. |
pscanner | - | Lexical scanner class for Pascal sources |
an example
{$mode objfpc}{$H+}
uses SysUtils, Classes, PParser, PasTree;
type
{ We have to override abstract TPasTreeContainer methods.
See utils/fpdoc/dglobals.pp for an implementation of TFPDocEngine,
a "real" engine. }
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;
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;
var
M: TPasModule;
E: TPasTreeContainer;
I: Integer;
Decls: {$ifdef VER2_6} TList {$else} { for FPC > 2.6.0 } TFPList {$endif};
begin
E := TSimpleEngine.Create;
try
M := ParseSource(E, ParamStr(1), 'linux', 'i386');
{ Cool, we successfully parsed the module.
Now output some info about it. }
if M.InterfaceSection <> nil then
begin
Decls := M.InterfaceSection.Declarations;
for I := 0 to Decls.Count - 1 do
Writeln('Interface item ', I, ': ' +
(TObject(Decls[I]) as TPasElement).Name);
end else
Writeln('No interface section --- this is not a unit, this is a ', M.ClassName);
Decls := M.ImplementationSection.Declarations;
for I := 0 to Decls.Count - 1 do
Writeln('Implementation item ', I, ': ' +
(TObject(Decls[I]) as TPasElement).Name);
FreeAndNil(M);
finally FreeAndNil(E) end;
end.
Go to back Packages List