[lazarus] Notes about Export Proc

Mattias Gaertner nc-gaertnma at netcologne.de
Wed Oct 15 17:09:00 EDT 2003


Hi all,

I have implemented the first refactoring tool for lazarus: 
Edit -> Export Proc.

Abstract:
Export Proc takes some selected pascal statements and creates a new
procedure/method from this code.
This tool is useful to split big procedures or to easily create a new
procedure from some code.


Basic example:

procedure DoSomething;
begin
  CallSomething;
end;

Select the line "CallSomething;" and do Extract Proc. A dialog popup ups and
you can select the type and name of the procedure to create. For example:
procedure, "NewProc". Result:

procedure NewProc;
begin
  CallSomething;
end;

procedure DoSomething;
begin
  NewProc;
end;

You can see, that the new procedure "NewProc" was created with the selection
as body and the old code was replaced by a call.


Local Variables and Parameters:

"Extract Proc" scans for used variables and automatically creates the
parameter list and local variables. Example:

procedure TForm1.DoSomething(var Erni, Bert: integer);
var
  i: Integer; // Comment
begin
  Erni:=Erni+Bert;
  for i:=Erni to 5 do begin

  end;
end;

Select the for loop and create a new Procedure "NewProc". The local variable
i is only used in the selection, so it will be moved to the new procedure.
Erni is also used in the remaining code, so it will become a parameter.
Result:

procedure NewProc(const Erni: integer);
var
  i: Integer; // Comment
begin
  for i:=Erni to 5 do begin

  end;
end;

procedure TForm1.DoSomething(var Erni, Bert: integer);
begin
  Erni:=Erni+Bert;
  NewProc(Erni);
end;

You can see "i" was moved to the new procedure (Note: including its comment)
and Erni .


Limitations:
Pascal is a very powerful language, so don't expect it will work with every
code. Current limits/ToDos:
- check if selection bounds on statement bounds
- heuristic for parameter specifiers 'var'. 
  At the moment all parameters are "const". 
  If you need "var", you have to edit it manually.
- "with" statements
 
I think, even with these limits, the tool will be useful.


Mattias






More information about the Lazarus mailing list