mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-05 08:38:14 +02:00

function pointers using {$modeswitch nestedprocvars} functionality, activate this for LLVM and also activate that modeswitch for a test that uses this o also convert the IDE units to use this functionality o requires extra typecasts because implicit type conversions from procvar(p: psometype) to procvar(p: pointer) are not supported; on the plus side, even those type conversions are checked for validity o note: requires {$modeswitch nestedprocvars} in all programs/units that rely on this functionality git-svn-id: trunk@40598 -
228 lines
6.2 KiB
PHP
228 lines
6.2 KiB
PHP
{
|
|
This file is part of the Free Pascal Integrated Development Environment
|
|
Copyright (c) 1998 by Berczi Gabor
|
|
|
|
Search menu entries
|
|
|
|
See the file COPYING.FPC, included in this distribution,
|
|
for details about the copyright.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
**********************************************************************}
|
|
|
|
function ProcedureDialog(S : string) : PDialog;
|
|
var D: PDialog;
|
|
R,R1,R2: TRect;
|
|
IL: PEditorInputLine;
|
|
begin
|
|
R.Assign(0,0,40,8);
|
|
New(D, Init(R, dialog_proceduredialog));
|
|
with D^ do
|
|
begin
|
|
Options:=Options or ofCentered;
|
|
GetExtent(R); R.Grow(-3,-2); R.B.Y:=R.A.Y+1;
|
|
R1.Copy(R);
|
|
R2.Copy(R); Inc(R2.A.Y);Inc(R2.B.Y);
|
|
New(IL, Init(R2,255));
|
|
Insert(IL);
|
|
IL^.SetData(S);
|
|
Insert(New(PLabel, Init(R1, label_enterproceduretofind, IL)));
|
|
GetExtent(R); R.Grow(-8,-1); R.A.Y:=R.B.Y-2; R.B.X:=R.A.X+10;
|
|
Insert(New(PButton, Init(R, button_OK, cmOK, bfDefault)));
|
|
R.Move(15,0);
|
|
Insert(New(PButton, Init(R, button_Cancel, cmCancel, bfNormal)));
|
|
end;
|
|
IL^.Select;
|
|
ProcedureDialog:=D;
|
|
end;
|
|
|
|
|
|
procedure TIDEApp.FindProcedure;
|
|
var R: TRect;
|
|
S: PSortedSymbolCollection;
|
|
Overflow: boolean;
|
|
ProcS : string;
|
|
Level : longint;
|
|
|
|
function NameMatches(const St : string) : boolean;
|
|
begin
|
|
NameMatches:=(ProcS='') or (Pos(ProcS,UpcaseStr(St)) > 0);
|
|
end;
|
|
|
|
procedure InsertInS(P: PSymbol);
|
|
|
|
procedure InsertItemsInS(P: PSymbolCollection);
|
|
var I: Sw_integer;
|
|
begin
|
|
for I:=0 to P^.Count-1 do
|
|
InsertInS(P^.At(I));
|
|
end;
|
|
|
|
begin
|
|
Inc(level);
|
|
if S^.Count=MaxCollectionSize then
|
|
begin Overflow:=true; Exit; end;
|
|
if {(P^.typ = procsym) this needs symconst unit which I prefer to avoid }
|
|
((P^.GetTypeName='proc') or (P^.GetTypeName='func'))
|
|
and NameMatches(P^.GetName) then
|
|
S^.Insert(P);
|
|
{ this is wrong because it inserted args or locals of proc
|
|
in the globals list !! PM}
|
|
if (P^.Items<>nil) and (level=1) then
|
|
InsertItemsInS(P^.Items);
|
|
Dec(level);
|
|
end;
|
|
|
|
var
|
|
EditorWindow : PSourceWindow;
|
|
begin
|
|
level:=0;
|
|
if BrowCol.Modules=nil then
|
|
begin ErrorBox(msg_nodebuginfoavailable,nil); Exit; end;
|
|
EditorWindow:=FirstEditorWindow;
|
|
If assigned(EditorWindow) then
|
|
ProcS:=LowerCaseStr(EditorWindow^.Editor^.GetCurrentWord)
|
|
else
|
|
ProcS:='';
|
|
if ExecuteDialog(ProcedureDialog(ProcS),@ProcS)=cmCancel then
|
|
exit;
|
|
ProcS:=UpcaseStr(ProcS);
|
|
Overflow:=false;
|
|
if assigned(ProcedureCollection) then
|
|
begin
|
|
ProcedureCollection^.deleteAll;
|
|
Dispose(ProcedureCollection,done);
|
|
end;
|
|
New(S, Init(500,500));
|
|
ProcedureCollection:=S;
|
|
BrowCol.Modules^.ForEach(TCallbackProcParam(@InsertInS));
|
|
if Overflow then
|
|
WarningBox(msg_toomanysymbolscantdisplayall,nil);
|
|
Desktop^.GetExtent(R); R.A.X:=R.B.X-35;
|
|
Desktop^.Insert(New(PBrowserWindow, Init(R,
|
|
label_sym_findprocedure,SearchFreeWindowNo,nil,label_sym_findprocedure2+ProcS,'',S,nil,nil,nil)));
|
|
end;
|
|
|
|
procedure TIDEApp.Objects;
|
|
begin
|
|
if ObjectTree=nil then
|
|
begin ErrorBox(msg_nodebuginfoavailable,nil); Exit; end;
|
|
|
|
OpenSymbolBrowser(0,0,label_sym_objects,label_sym_globalscope,nil,nil,nil,nil,ObjectTree,nil);
|
|
end;
|
|
|
|
procedure TIDEApp.Globals;
|
|
var R: TRect;
|
|
S: PSortedSymbolCollection;
|
|
Overflow: boolean;
|
|
Level : longint;
|
|
|
|
procedure InsertInS(P: PSymbol);
|
|
|
|
procedure InsertItemsInS(P: PSymbolCollection);
|
|
var I: Sw_integer;
|
|
begin
|
|
for I:=0 to P^.Count-1 do
|
|
InsertInS(P^.At(I));
|
|
end;
|
|
|
|
begin
|
|
Inc(level);
|
|
if S^.Count=MaxCollectionSize then
|
|
begin Overflow:=true; Exit; end;
|
|
S^.Insert(P);
|
|
{ this is wrong because it inserted args or locals of proc
|
|
in the globals list !! PM}
|
|
if (P^.Items<>nil) and (level=1) then
|
|
InsertItemsInS(P^.Items);
|
|
Dec(level);
|
|
end;
|
|
|
|
begin
|
|
level:=0;
|
|
if BrowCol.Modules=nil then
|
|
begin ErrorBox(msg_nodebuginfoavailable,nil); Exit; end;
|
|
Overflow:=false;
|
|
if assigned(GlobalsCollection) then
|
|
begin
|
|
GlobalsCollection^.deleteAll;
|
|
Dispose(GlobalsCollection,done);
|
|
end;
|
|
New(S, Init(500,500));
|
|
GlobalsCollection:=S;
|
|
BrowCol.Modules^.ForEach(TCallbackProcParam(@InsertInS));
|
|
if Overflow then
|
|
WarningBox(msg_toomanysymbolscantdisplayall,nil);
|
|
Desktop^.GetExtent(R); R.A.X:=R.B.X-35;
|
|
Desktop^.Insert(New(PBrowserWindow, Init(R,
|
|
label_sym_globals,SearchFreeWindowNo,nil,label_sym_globalscope,'',S,nil,nil,nil)));
|
|
end;
|
|
|
|
procedure TIDEApp.Modules;
|
|
var
|
|
R: TRect;
|
|
S: PSortedSymbolCollection;
|
|
procedure InsertInS(P: PSymbol);
|
|
begin
|
|
S^.Insert(P);
|
|
end;
|
|
begin
|
|
if BrowCol.Modules=nil then
|
|
begin ErrorBox(msg_nodebuginfoavailable,nil); Exit; end;
|
|
if assigned(ModulesCollection) then
|
|
begin
|
|
ModulesCollection^.deleteAll;
|
|
Dispose(ModulesCollection,done);
|
|
end;
|
|
New(S, Init(500,500));
|
|
ModulesCollection:=S;
|
|
BrowCol.Modules^.ForEach(TCallbackProcParam(@InsertInS));
|
|
Desktop^.GetExtent(R); R.A.X:=R.B.X-35;
|
|
Desktop^.Insert(New(PBrowserWindow, Init(R,
|
|
dialog_units,SearchFreeWindowNo,nil,label_sym_globalscope,'',S,nil,nil,nil)));
|
|
end;
|
|
|
|
function SymbolDialog(S : string) : PDialog;
|
|
var D: PDialog;
|
|
R,R1,R2: TRect;
|
|
IL: PEditorInputLine;
|
|
begin
|
|
R.Assign(0,0,40,8);
|
|
New(D, Init(R, dialog_browsesymbol));
|
|
with D^ do
|
|
begin
|
|
Options:=Options or ofCentered;
|
|
GetExtent(R); R.Grow(-3,-2); R.B.Y:=R.A.Y+1;
|
|
R1.Copy(R);
|
|
R2.Copy(R); Inc(R2.A.Y);Inc(R2.B.Y);
|
|
New(IL, Init(R2,255));
|
|
Insert(IL);
|
|
IL^.SetData(S);
|
|
Insert(New(PLabel, Init(R1, label_entersymboltobrowse, IL)));
|
|
GetExtent(R); R.Grow(-8,-1); R.A.Y:=R.B.Y-2; R.B.X:=R.A.X+10;
|
|
Insert(New(PButton, Init(R, button_OK, cmOK, bfDefault)));
|
|
R.Move(15,0);
|
|
Insert(New(PButton, Init(R, button_Cancel, cmCancel, bfNormal)));
|
|
end;
|
|
IL^.Select;
|
|
SymbolDialog:=D;
|
|
end;
|
|
|
|
procedure TIDEApp.SearchSymbol;
|
|
var
|
|
EditorWindow : PSourceWindow;
|
|
S : string;
|
|
begin
|
|
EditorWindow:=FirstEditorWindow;
|
|
If assigned(EditorWindow) then
|
|
S:=LowerCaseStr(EditorWindow^.Editor^.GetCurrentWord)
|
|
else
|
|
S:='';
|
|
if ExecuteDialog(SymbolDialog(S),@S)<>cmCancel then
|
|
OpenOneSymbolBrowser(S);
|
|
end;
|
|
|