Debugger: start moving value-converters to LazDebuggerIntf.

This commit is contained in:
Martin 2022-08-22 17:45:51 +02:00
parent 85f94e62fe
commit 99b40ac097
5 changed files with 139 additions and 54 deletions

View File

@ -321,8 +321,24 @@ begin
end;
end;
type
{ TFpDbgValueConverterJsonForDebugRegistryEntry }
TFpDbgValueConverterJsonForDebugRegistryEntry = class(TFpDbgValueConverterRegistryEntry)
public
class function GetConvertorClass: TClass; override;
end;
{ TFpDbgValueConverterJsonForDebugRegistryEntry }
class function TFpDbgValueConverterJsonForDebugRegistryEntry.GetConvertorClass: TClass;
begin
Result := TFpDbgValueConverterJsonForDebug;
end;
initialization
ValueConverterClassList.Add(TFpDbgValueConverterJsonForDebug);
ValueConverterRegistry.Add(TFpDbgValueConverterJsonForDebugRegistryEntry);
end.

View File

@ -42,13 +42,6 @@ type
end;
TFpDbgValueConverterClass = class of TFpDbgValueConverter;
{ TFpDbgValueConverterClassList }
TFpDbgValueConverterClassList = class(specialize TFPGList<TFpDbgValueConverterClass>)
function FindByClassName(AName: String): TFpDbgValueConverterClass;
end;
{ TFpDbgConverterConfig }
TFpDbgConverterConfig = class(TFreeNotifyingObject, TLazDbgValueConvertSelectorIntf)
@ -88,6 +81,16 @@ type
procedure Unlock;
end;
{ TFpDbgValueConverterRegistryEntry }
TFpDbgValueConverterRegistryEntry = class(TLazDbgValueConvertRegistryEntry)
public
class function CreateValueConvertorIntf: TLazDbgValueConverterIntf; override;
class function GetName: String; override;
class function GetDebuggerClass: TClass; override;
end;
{ TFpDbgValueConverterVariantToLStr }
TFpDbgValueConverterVariantToLStr = class(TFpDbgValueConverter)
@ -102,22 +105,13 @@ type
): TFpValue; override;
end;
function ValueConverterClassList: TFpDbgValueConverterClassList;
function ValueConverterConfigList: TFpDbgConverterConfigList;
implementation
var
TheValueConverterClassList: TFpDbgValueConverterClassList = nil;
TheValueConverterList: TFpDbgConverterConfigList = nil;
function ValueConverterClassList: TFpDbgValueConverterClassList;
begin
if TheValueConverterClassList = nil then
TheValueConverterClassList := TFpDbgValueConverterClassList.Create;
Result := TheValueConverterClassList;
end;
function ValueConverterConfigList: TFpDbgConverterConfigList;
begin
if TheValueConverterList = nil then
@ -125,19 +119,6 @@ begin
Result := TheValueConverterList;
end;
{ TFpDbgValueConverterClassList }
function TFpDbgValueConverterClassList.FindByClassName(AName: String
): TFpDbgValueConverterClass;
var
i: Integer;
begin
Result := nil;
for i := 0 to Count -1 do
if Items[i].ClassName = AName then
exit(Items[i]);
end;
{ TFpDbgValueConverter }
function TFpDbgValueConverter.CreateCopy: TFpDbgValueConverter;
@ -391,6 +372,23 @@ begin
FLock.Leave;
end;
{ TFpDbgValueConverterRegistryEntry }
class function TFpDbgValueConverterRegistryEntry.CreateValueConvertorIntf: TLazDbgValueConverterIntf;
begin
Result := TFpDbgValueConverterClass(GetConvertorClass).Create;
end;
class function TFpDbgValueConverterRegistryEntry.GetName: String;
begin
Result := TFpDbgValueConverterClass(GetConvertorClass).GetName;
end;
class function TFpDbgValueConverterRegistryEntry.GetDebuggerClass: TClass;
begin
Result := TFpDebugDebuggerBase;
end;
{ TFpDbgValueConverterVariantToLStr }
function TFpDbgValueConverterVariantToLStr.GetProcAddrFromMgr(
@ -570,11 +568,26 @@ begin
end;
end;
type
{ TFpDbgValueConverterVariantToLStrRegistryEntry }
TFpDbgValueConverterVariantToLStrRegistryEntry = class(TFpDbgValueConverterRegistryEntry)
public
class function GetConvertorClass: TClass; override;
end;
{ TFpDbgValueConverterVariantToLStrRegistryEntry }
class function TFpDbgValueConverterVariantToLStrRegistryEntry.GetConvertorClass: TClass;
begin
Result := TFpDbgValueConverterVariantToLStr;
end;
initialization
ValueConverterClassList.Add(TFpDbgValueConverterVariantToLStr);
ValueConverterRegistry.Add(TFpDbgValueConverterVariantToLStrRegistryEntry);
finalization;
FreeAndNil(TheValueConverterClassList);
FreeAndNil(TheValueConverterList);
end.

View File

@ -6,7 +6,7 @@ unit LazDebuggerValueConverter;
interface
uses
Classes, SysUtils;
Classes, SysUtils, fgl;
type
TLazDbgValueConverterIntf = interface;
@ -33,8 +33,63 @@ type
function GetBackendSpecificObject: TObject; deprecated;
end;
{ TLazDbgValueConvertRegistryEntry }
TLazDbgValueConvertRegistryEntry = class
public
class function CreateValueConvertorIntf: TLazDbgValueConverterIntf; virtual; abstract;
class function GetName: String; virtual; abstract;
class function GetConvertorClass: TClass; virtual; abstract;
class function GetDebuggerClass: TClass; virtual; abstract; // class of TDebuggerIntf
end;
TLazDbgValueConvertRegistryEntryClass = class of TLazDbgValueConvertRegistryEntry;
{ TLazDbgValueConvertRegistry }
TLazDbgValueConvertRegistry = class(specialize TFPGList<TLazDbgValueConvertRegistryEntryClass>)
function FindByConvertorClassName(AName: String): TLazDbgValueConvertRegistryEntryClass;
function IndexOfConvertorClass(AClass: TClass): integer;
end;
function ValueConverterRegistry: TLazDbgValueConvertRegistry;
implementation
var
TheValueConverterRegistry: TLazDbgValueConvertRegistry;
function ValueConverterRegistry: TLazDbgValueConvertRegistry;
begin
if TheValueConverterRegistry = nil then
TheValueConverterRegistry := TLazDbgValueConvertRegistry.Create;
Result := TheValueConverterRegistry;
end;
{ TLazDbgValueConvertRegistry }
function TLazDbgValueConvertRegistry.FindByConvertorClassName(AName: String
): TLazDbgValueConvertRegistryEntryClass;
var
i: Integer;
begin
Result := nil;
for i := 0 to Count -1 do
if Items[i].GetConvertorClass.ClassName = AName then
exit(Items[i]);
end;
function TLazDbgValueConvertRegistry.IndexOfConvertorClass(AClass: TClass
): integer;
begin
Result := Count - 1;
while Result >= 0 do begin
if Items[Result].GetConvertorClass = AClass then
exit;
dec(Result);
end;
end;
finalization
FreeAndNil(TheValueConverterRegistry);
end.

View File

@ -5,7 +5,8 @@ unit IdeDebuggerFpDbgValueConv;
interface
uses
Classes, SysUtils, Laz2_XMLCfg, FpDebugValueConvertors;
Classes, SysUtils, Laz2_XMLCfg, FpDebugValueConvertors,
LazDebuggerValueConverter;
type
@ -64,18 +65,18 @@ procedure TIdeFpDbgConverterConfig.LoadDataFromXMLConfig(
const AConfig: TRttiXMLConfig; const APath: string);
var
s: String;
c: TFpDbgValueConverterClass;
obj: TFpDbgValueConverter;
RegEntry: TLazDbgValueConvertRegistryEntryClass;
begin
AConfig.ReadObject(APath + 'Filter/', Self);
MatchTypeNames.CommaText := AConfig.GetValue(APath + 'Filter/MatchTypeNames', '');
s := AConfig.GetValue(APath + 'ConvClass', '');
c := ValueConverterClassList.FindByClassName(s);
if c = nil then
RegEntry := ValueConverterRegistry.FindByConvertorClassName(s);
if RegEntry = nil then
exit;
obj := c.Create;
obj := RegEntry.CreateValueConvertorIntf.GetObject as TFpDbgValueConverter;
AConfig.ReadObject(APath + 'Conv/', obj);
Converter := obj;
end;

View File

@ -68,7 +68,7 @@ implementation
procedure TFpDbgValConvFrame.btnAddClick(Sender: TObject);
var
AvailClass: TFpDbgValueConverterClassList;
AvailClass: TLazDbgValueConvertRegistry;
AName: String;
obj: TIdeFpDbgConverterConfig;
begin
@ -79,8 +79,8 @@ begin
SaveCurrent;
FCurConvConf := nil;
AvailClass := ValueConverterClassList;
obj := TIdeFpDbgConverterConfig.Create(AvailClass[0].Create);
AvailClass := ValueConverterRegistry;
obj := TIdeFpDbgConverterConfig.Create(AvailClass[0].CreateValueConvertorIntf.GetObject as TFpDbgValueConverter);
obj.Enabled := True;
obj.Name := AName;
obj.MatchKinds := obj.Converter.GetSupportedKinds;
@ -115,7 +115,7 @@ end;
procedure TFpDbgValConvFrame.lstConvertersClick(Sender: TObject);
var
AvailClass: TFpDbgValueConverterClassList;
AvailClass: TLazDbgValueConvertRegistry;
begin
SaveCurrent;
pnlCurrentConv.Enabled := lstConverters.Count > 0;
@ -135,8 +135,8 @@ begin
EdName.Text := FCurConvConf.Name;
memoTypeNames.Text := FCurConvConf.MatchTypeNames.Text;
AvailClass := ValueConverterClassList;
dropAction.ItemIndex := AvailClass.IndexOf(TFpDbgValueConverterClass(FCurConvConf.Converter.ClassType));
AvailClass := ValueConverterRegistry;
dropAction.ItemIndex := AvailClass.IndexOfConvertorClass(FCurConvConf.Converter.ClassType);
lstConvertersItemClick(nil, FCurIdx);
end;
@ -172,14 +172,14 @@ end;
procedure TFpDbgValConvFrame.UpdateConvForClass;
var
AvailClass: TFpDbgValueConverterClassList;
AvailClass: TLazDbgValueConvertRegistry;
begin
if FCurConvConf = nil then
exit;
AvailClass := ValueConverterClassList;
if (dropAction.ItemIndex <> AvailClass.IndexOf(TFpDbgValueConverterClass(FCurConv.GetObject.ClassType))) then begin
FCurConv := AvailClass[dropAction.ItemIndex].Create;
AvailClass := ValueConverterRegistry;
if (dropAction.ItemIndex <> AvailClass.IndexOfConvertorClass(FCurConv.GetObject.ClassType)) then begin
FCurConv := AvailClass[dropAction.ItemIndex].CreateValueConvertorIntf;
UpdateConvPanel;
end;
end;
@ -217,7 +217,7 @@ end;
procedure TFpDbgValConvFrame.UpdateButtons;
begin
btnAdd.Enabled := ValueConverterClassList.Count > 0;
btnAdd.Enabled := ValueConverterRegistry.Count > 0;
btnRemove.Enabled := (lstConverters.Count > 0) and (lstConverters.ItemIndex >= 0);
pnlCurrentConv.Enabled := FCurConvConf <> nil;
end;
@ -239,12 +239,12 @@ end;
procedure TFpDbgValConvFrame.SaveCurrent;
var
AvailClass: TFpDbgValueConverterClassList;
AvailClass: TLazDbgValueConvertRegistry;
begin
if FCurConvConf = nil then
exit;
AvailClass := ValueConverterClassList;
AvailClass := ValueConverterRegistry;
if ( (FCurConv = nil) or (FCurConvSettings = nil) or FCurConvSettings.WriteTo(FCurConv) ) or
(TrimSet(FCurConvConf.MatchTypeNames.Text, [#1..#32]) <> TrimSet(memoTypeNames.Text, [#1..#32])) or
(FCurConvConf.Converter <> FCurConv) or
@ -260,7 +260,7 @@ end;
procedure TFpDbgValConvFrame.Setup;
var
AvailClass: TFpDbgValueConverterClassList;
AvailClass: TLazDbgValueConvertRegistry;
i: Integer;
begin
btnAdd.Caption := dlgFpConvOptAddNew;
@ -273,8 +273,8 @@ begin
lblDesc.Caption := '-';
dropAction.Clear;
AvailClass := ValueConverterClassList;
for i := 0 to ValueConverterClassList.Count - 1 do
AvailClass := ValueConverterRegistry;
for i := 0 to ValueConverterRegistry.Count - 1 do
dropAction.AddItem(AvailClass[i].GetName, nil);
UpdateButtons;