Files
lazarus-ccr/wst/trunk/ws_helper/metadata_generator.pas

109 lines
2.1 KiB
ObjectPascal
Raw Normal View History

unit metadata_generator;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils,
parserdefs, binary_streamer;
const
sWST_META = 'WST_METADATA_0.2.2.0';
type
{ TMetadataGenerator }
TMetadataGenerator = class
private
FStream : IDataStore;
FSymbolTable: TSymbolTable;
procedure GenerateHeader();
procedure GenerateIntfMetadata(AIntf : TInterfaceDefinition);
public
constructor Create(
ASymTable : TSymbolTable;
ADstStream : IDataStore
);
procedure Execute();
end;
implementation
{ TMetadataGenerator }
procedure TMetadataGenerator.GenerateHeader();
var
c, i, k : LongInt;
begin
FStream.WriteStr(sWST_META);
FStream.WriteStr(FSymbolTable.Name);
k := 0;
c := FSymbolTable.Count;
for i := 0 to pred(c) do begin
if FSymbolTable.Item[i] is TInterfaceDefinition then
inc(k);
end;
FStream.WriteInt8U(k);
end;
procedure TMetadataGenerator.GenerateIntfMetadata(AIntf: TInterfaceDefinition);
procedure WriteMethod(AMeth:TMethodDefinition);
procedure WriteParam(APrm : TParameterDefinition);
begin
FStream.WriteStr(APrm.Name);
FStream.WriteStr(APrm.DataType.Name);
FStream.WriteEnum(Ord(APrm.Modifier));
end;
var
j, k : LongInt;
begin
k := AMeth.ParameterCount;
FStream.WriteStr(AMeth.Name);
FStream.WriteInt8U(k);
for j := 0 to pred(k) do
WriteParam(AMeth.Parameter[j]);
end;
var
i, c : LongInt;
begin
FStream.WriteStr(AIntf.Name);
c := AIntf.MethodCount;
FStream.WriteInt8U(c);
for i := 0 to pred(c) do
WriteMethod(AIntf.Method[i]);
end;
constructor TMetadataGenerator.Create(ASymTable: TSymbolTable;ADstStream: IDataStore);
begin
Assert(Assigned(ASymTable));
Assert(Assigned(ADstStream));
FSymbolTable := ASymTable;
FStream := ADstStream;
end;
procedure TMetadataGenerator.Execute();
Var
i,c : Integer;
intf : TInterfaceDefinition;
begin
GenerateHeader();
c := Pred(FSymbolTable.Count);
for i := 0 to c do begin
if FSymbolTable.Item[i] is TInterfaceDefinition then begin
intf := FSymbolTable.Item[i] as TInterfaceDefinition;
GenerateIntfMetadata(intf);
end;
end;
end;
end.