paxCompiler for Delphi. Code explorer.


Code explorer
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, PaxCompilerExplorer, PaxCompiler, StdCtrls, ExtCtrls, ComCtrls,
  IMPORT_Classes;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Memo1: TMemo;
    Button1: TButton;
    PaxCompiler1: TPaxCompiler;
    PaxPascalLanguage1: TPaxPascalLanguage;
    PaxCompilerExplorer1: TPaxCompilerExplorer;
    TreeView1: TTreeView;
    procedure Button1Click(Sender: TObject);
    procedure TreeView1DblClick(Sender: TObject);
  private
    { Private declarations }
    L: TList;
  public
    { Public declarations }
    procedure BuildTree;
    procedure EnumProc(Id: Integer;
                       Host: Boolean;
                       Kind: TMemberKind;
                       Data: Pointer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  PaxCompiler1.Reset;
  PaxCompiler1.RegisterLanguage(PaxPascalLanguage1);
  PaxCompiler1.AddModule('1', 'Pascal');
  PaxCompiler1.AddCode('1', Memo1.Lines.Text);
  if PaxCompiler1.Compile then
  begin
    PaxCompilerExplorer1.RegisterCompiler(PaxCompiler1);
    BuildTree;
  end
  else
    for I:=0 to PaxCompiler1.ErrorCount - 1 do
      ShowMessage(PaxCompiler1.ErrorMessage[I]);
end;

procedure TForm1.BuildTree;
var
  N, N2: TTreeNode;
  I: Integer;
begin
  L := TList.Create;
  try
    TreeView1.Items.Clear;

    N := TreeView1.Items.Add(nil, 'Used namespaces');
    L.Add(N);
    PaxCompilerExplorer1.EnumMembers(0, true, mkNamespace, EnumProc, N);
    PaxCompilerExplorer1.EnumMembers(0, false, mkNamespace, EnumProc, N);

    N := TreeView1.Items.Add(nil, 'Noname namespace');

    N2 := TreeView1.Items.AddChild(N, 'Types');
    L.Add(N2);
    PaxCompilerExplorer1.EnumMembers(0, false, mkType, EnumProc, N2);

    N2 := TreeView1.Items.AddChild(N, 'Procedures');
    L.Add(N2);
    PaxCompilerExplorer1.EnumMembers(0, false, mkProcedure, EnumProc, N2);

    N2 := TreeView1.Items.AddChild(N, 'Functions');
    L.Add(N2);
    PaxCompilerExplorer1.EnumMembers(0, false, mkFunction, EnumProc, N2);

    N2 := TreeView1.Items.AddChild(N, 'Constants');
    L.Add(N2);
    PaxCompilerExplorer1.EnumMembers(0, false, mkConst, EnumProc, N2);

    N2 := TreeView1.Items.AddChild(N, 'Variables');
    L.Add(N2);
    PaxCompilerExplorer1.EnumMembers(0, false, mkVar, EnumProc, N2);

  finally
    for I := L.Count - 1 downto 0 do
    begin
      N2 := TTreeNode(L[I]);
      if N2.Count = 0 then
        N2.Delete;
    end;

    L.Free;
  end;
end;

procedure TForm1.EnumProc(Id: Integer;
                          Host: Boolean;
                          Kind: TMemberKind;
                          Data: Pointer);
var
  N, N2, N3: TTreeNode;
  Name: String;
  TypeName: String;
begin
  N := TTreeNode(Data);

  Name := PaxCompilerExplorer1.Names[Id];
  TypeName := PaxCompilerExplorer1.TypeNames[Id];

  with TreeView1.Items do
  case Kind of
    mkProcedure, mkFunction, mkConstructor, mkDestructor:
    begin
      N2 := AddChildObject(N, Name, TObject(Id));

      N3 := AddChild(N2, 'Parameters');
      L.Add(N3);
      PaxCompilerExplorer1.EnumMembers(Id, Host, mkParam, EnumProc, N3);

      N3 := AddChild(N2, 'Local variables');
      L.Add(N3);
      PaxCompilerExplorer1.EnumMembers(Id, Host, mkVar, EnumProc, N3);

      N3 := AddChild(N2, 'Local constants');
      L.Add(N3);
      PaxCompilerExplorer1.EnumMembers(Id, Host, mkConst, EnumProc, N3);

      N3 := AddChild(N2, 'Local types');
      L.Add(N3);
      PaxCompilerExplorer1.EnumMembers(Id, Host, mkType, EnumProc, N3);

      N3 := TreeView1.Items.AddChild(N2, 'Nested procedures');
      L.Add(N3);
      PaxCompilerExplorer1.EnumMembers(Id, false, mkProcedure, EnumProc, N3);

      N3 := TreeView1.Items.AddChild(N2, 'Nested functions');
      L.Add(N3);
      PaxCompilerExplorer1.EnumMembers(Id, false, mkFunction, EnumProc, N3);

    end;
    mkParam: AddChildObject(N, Name + ': ' + TypeName, TObject(Id));
    mkVar: AddChildObject(N, Name + ': ' + TypeName, TObject(Id));
    mkConst: AddChildObject(N, Name + ': ' + TypeName, TObject(Id));
    mkField: AddChildObject(N, Name + ': ' + TypeName, TObject(Id));
    mkProperty: AddChildObject(N, Name + ': ' + TypeName, TObject(Id));
    mkType:
    begin
      N2 := AddChildObject(N, Name, TObject(Id));
      if PaxCompilerExplorer1.IsRecordType(Id) then
      begin
        N3 := AddChild(N2, 'Fields');
        L.Add(N3);
        PaxCompilerExplorer1.EnumMembers(Id, Host, mkField, EnumProc, N3);
      end
      else if PaxCompilerExplorer1.IsClassType(Id) then
      begin
        N3 := AddChild(N2, 'Fields');
        L.Add(N3);
        PaxCompilerExplorer1.EnumMembers(Id, Host, mkField, EnumProc, N3);

        N3 := AddChild(N2, 'Properties');
        L.Add(N3);
        PaxCompilerExplorer1.EnumMembers(Id, Host, mkProperty, EnumProc, N3);

        N3 := TreeView1.Items.AddChild(N2, 'Constructors');
        L.Add(N3);
        PaxCompilerExplorer1.EnumMembers(Id, false, mkConstructor, EnumProc, N3);

        N3 := TreeView1.Items.AddChild(N2, 'Destructor');
        L.Add(N3);
        PaxCompilerExplorer1.EnumMembers(Id, false, mkDestructor, EnumProc, N3);

        N3 := TreeView1.Items.AddChild(N2, 'Class procedures');
        L.Add(N3);
        PaxCompilerExplorer1.EnumMembers(Id, false, mkProcedure, EnumProc, N3);

        N3 := TreeView1.Items.AddChild(N2, 'Class functions');
        L.Add(N3);
        PaxCompilerExplorer1.EnumMembers(Id, false, mkFunction, EnumProc, N3);
      end;
    end;
    mkNamespace:
    begin
      N2 := AddChildObject(N, Name, TObject(Id));

      N3 := AddChild(N2, 'Constants');
      L.Add(N3);
      PaxCompilerExplorer1.EnumMembers(Id, Host, mkConst, EnumProc, N3);

      N3 := AddChild(N2, 'Variables');
      L.Add(N3);
      PaxCompilerExplorer1.EnumMembers(Id, Host, mkVar, EnumProc, N3);

      N3 := AddChild(N2, 'Procedures');
      L.Add(N3);
      PaxCompilerExplorer1.EnumMembers(Id, Host, mkProcedure, EnumProc, N3);

      N3 := AddChild(N2, 'Types');
      L.Add(N3);
      PaxCompilerExplorer1.EnumMembers(Id, Host, mkType, EnumProc, N3);
    end;
  end;
end;

procedure TForm1.TreeView1DblClick(Sender: TObject);
var
  N: TTreeNode;
  Id, Position: Integer;
  S: String;
begin
  N := TTreeView(Sender).Selected;

  if N = nil then
    Exit;

  Id := Integer(N.Data);

  if Id = 0 then
    Exit;

  S := PaxCompilerExplorer1.Names[Id];
  Position := PaxCompilerExplorer1.Positions[Id];

  if Id <> 0 then
    with Memo1 do
    begin
      SetFocus;
      SelStart := Position;
      SelLength := Length(S);
    end;
end;

end.


Copyright © 2006-2009 VIRT Laboratory. All rights reserved.