Debugger: more moving value-converters to LazDebuggerIntf.

This commit is contained in:
Martin 2022-08-23 02:17:12 +02:00
parent 99b40ac097
commit d98c10ac7d
14 changed files with 257 additions and 246 deletions

View File

@ -46,7 +46,6 @@ type
procedure Init; override; procedure Init; override;
public public
class function GetName: String; override; class function GetName: String; override;
class function GetSupportedKinds: TDbgSymbolKinds; override;
procedure Assign(ASource: TFpDbgValueConverter); override; procedure Assign(ASource: TFpDbgValueConverter); override;
function ConvertValue(ASourceValue: TFpValue; function ConvertValue(ASourceValue: TFpValue;
AnFpDebugger: TFpDebugDebuggerBase; AnFpDebugger: TFpDebugDebuggerBase;
@ -185,11 +184,6 @@ begin
Result := drsCallJsonForDebug; Result := drsCallJsonForDebug;
end; end;
class function TFpDbgValueConverterJsonForDebug.GetSupportedKinds: TDbgSymbolKinds;
begin
Result := [low(Result)..high(Result)];
end;
procedure TFpDbgValueConverterJsonForDebug.Assign(ASource: TFpDbgValueConverter); procedure TFpDbgValueConverterJsonForDebug.Assign(ASource: TFpDbgValueConverter);
begin begin
inherited Assign(ASource); inherited Assign(ASource);

View File

@ -49,8 +49,8 @@ uses
DbgIntfBaseTypes, FpDbgClasses, FpDbgUtil, FPDbgController, FpPascalBuilder, DbgIntfBaseTypes, FpDbgClasses, FpDbgUtil, FPDbgController, FpPascalBuilder,
FpdMemoryTools, FpDbgInfo, FpPascalParser, FpErrorMessages, FpdMemoryTools, FpDbgInfo, FpPascalParser, FpErrorMessages,
FpDebugDebuggerBase, FpDebuggerResultData, FpDbgCallContextInfo, FpDbgDwarf, FpDebugDebuggerBase, FpDebuggerResultData, FpDbgCallContextInfo, FpDbgDwarf,
FpDbgDwarfDataClasses, FpWatchResultData, LazDebuggerIntf, Forms, fgl, math, FpDbgDwarfDataClasses, FpWatchResultData, LazDebuggerIntf,
Classes, sysutils, LazClasses, LazDebuggerValueConverter, Forms, fgl, math, Classes, sysutils, LazClasses,
{$ifdef FORCE_LAZLOGGER_DUMMY} LazLoggerDummy {$else} LazLoggerBase {$endif}; {$ifdef FORCE_LAZLOGGER_DUMMY} LazLoggerDummy {$else} LazLoggerBase {$endif};
type type
@ -1179,9 +1179,9 @@ begin
WatchResConv.FirstIndexOffs := FWatchValue.FirstIndexOffs; WatchResConv.FirstIndexOffs := FWatchValue.FirstIndexOffs;
if not (defSkipValConv in AnEvalFlags) then begin if not (defSkipValConv in AnEvalFlags) then begin
if (FWatchValue.GetFpDbgConverter <> nil) and if (FWatchValue.GetFpDbgConverter <> nil) and
(FWatchValue.GetFpDbgConverter.GetBackendSpecificObject is TFpDbgConverterConfig) (FWatchValue.GetFpDbgConverter.GetConverter.GetObject is TFpDbgValueConverter)
then then
WatchResConv.ValConfig := TFpDbgConverterConfig(FWatchValue.GetFpDbgConverter.GetBackendSpecificObject) WatchResConv.ValConfig := FWatchValue.GetFpDbgConverter
else else
WatchResConv.ValConvList := ValueConverterConfigList; WatchResConv.ValConvList := ValueConverterConfigList;
WatchResConv.Debugger := FDebugger; WatchResConv.Debugger := FDebugger;

View File

@ -7,7 +7,7 @@ interface
uses uses
Classes, SysUtils, FpWatchResultData, FpDbgInfo, FpdMemoryTools, Classes, SysUtils, FpWatchResultData, FpDbgInfo, FpdMemoryTools,
FpErrorMessages, DbgIntfBaseTypes, LazClasses, FpDebugValueConvertors, FpErrorMessages, DbgIntfBaseTypes, LazClasses, FpDebugValueConvertors,
FpDebugDebuggerBase, LazDebuggerIntf; FpDebugDebuggerBase, LazDebuggerIntf, LazDebuggerValueConverter;
type type
@ -17,8 +17,9 @@ type
private private
FDebugger: TFpDebugDebuggerBase; FDebugger: TFpDebugDebuggerBase;
FExpressionScope: TFpDbgSymbolScope; FExpressionScope: TFpDbgSymbolScope;
FValConvList: TFpDbgConverterConfigList; //FValConvList: TFpDbgConverterConfigList;
FValConfig: TFpDbgConverterConfig; FValConvList: TLazDbgValueConvertSelectorListIntf;
FValConfig: TLazDbgValueConvertSelectorIntf;
FExtraDephtLevelIsArray: Boolean; // defExtraDepth / RecurseCnt=-1 FExtraDephtLevelIsArray: Boolean; // defExtraDepth / RecurseCnt=-1
FExtraDephtLevelItemConv: TFpDbgValueConverter; FExtraDephtLevelItemConv: TFpDbgValueConverter;
@ -36,8 +37,9 @@ type
function DoValueToResData(AnFpValue: TFpValue; function DoValueToResData(AnFpValue: TFpValue;
AnResData: TLzDbgWatchDataIntf): Boolean; override; AnResData: TLzDbgWatchDataIntf): Boolean; override;
property ValConvList: TFpDbgConverterConfigList read FValConvList write FValConvList; //property ValConvList: TFpDbgConverterConfigList read FValConvList write FValConvList;
property ValConfig: TFpDbgConverterConfig read FValConfig write FValConfig; property ValConvList: TLazDbgValueConvertSelectorListIntf read FValConvList write FValConvList;
property ValConfig: TLazDbgValueConvertSelectorIntf read FValConfig write FValConfig;
property Debugger: TFpDebugDebuggerBase read FDebugger write FDebugger; property Debugger: TFpDebugDebuggerBase read FDebugger write FDebugger;
property ExpressionScope: TFpDbgSymbolScope read FExpressionScope write FExpressionScope; property ExpressionScope: TFpDbgSymbolScope read FExpressionScope write FExpressionScope;
property MaxArrayConv: Integer read FMaxArrayConv write SetMaxArrayConv; property MaxArrayConv: Integer read FMaxArrayConv write SetMaxArrayConv;
@ -61,7 +63,7 @@ begin
if (ValConfig <> nil) then begin if (ValConfig <> nil) then begin
if ValConfig.CheckMatch(AnFpValue) then if ValConfig.CheckMatch(AnFpValue) then
Result := ValConfig.Converter; Result := ValConfig.GetConverter.GetObject as TFpDbgValueConverter;
if Result <> nil then if Result <> nil then
Result.AddReference; Result.AddReference;
end end
@ -73,7 +75,7 @@ begin
while (i >= 0) and (not ValConvList[i].CheckMatch(AnFpValue)) do while (i >= 0) and (not ValConvList[i].CheckMatch(AnFpValue)) do
dec(i); dec(i);
if i >= 0 then if i >= 0 then
Result := ValConvList[i].Converter; Result := ValConvList[i].GetConverter.GetObject as TFpDbgValueConverter;
if Result <> nil then if Result <> nil then
Result.AddReference; Result.AddReference;
finally finally

View File

@ -1,18 +1,17 @@
unit FpDebugValueConvertors; unit FpDebugValueConvertors;
{$mode objfpc}{$H+} {$mode objfpc}{$H+}
{$ModeSwitch typehelpers}
interface interface
uses uses
Classes, SysUtils, fgl, FpDbgInfo, FpdMemoryTools, FpDbgCallContextInfo, Classes, SysUtils, FpDbgInfo, FpdMemoryTools, FpDbgCallContextInfo,
FpPascalBuilder, FpErrorMessages, FpDbgClasses, FpDbgUtil, DbgIntfBaseTypes, FpPascalBuilder, FpErrorMessages, FpDbgClasses, FpDbgUtil, DbgIntfBaseTypes,
lazCollections, LazClasses, LCLProc, StrUtils, FpDebugDebuggerBase, FpDebugStringConstants, LazClasses, LCLProc, StrUtils, FpDebugDebuggerBase, FpDebugStringConstants,
LazDebuggerValueConverter, LazDebuggerIntfBaseTypes; LazDebuggerValueConverter, LazDebuggerIntfBaseTypes;
type type
TDbgSymbolKinds = set of TDbgSymbolKind;
(* TFpDbgValueConverter and descendants (* TFpDbgValueConverter and descendants
- A TFpDbgValueConverter should be immutable, once in the list. - A TFpDbgValueConverter should be immutable, once in the list.
To change settings a new instance can be set to TFpDbgConverterConfig To change settings a new instance can be set to TFpDbgConverterConfig
@ -29,7 +28,6 @@ type
procedure Init; virtual; procedure Init; virtual;
public public
class function GetName: String; virtual; abstract; class function GetName: String; virtual; abstract;
class function GetSupportedKinds: TDbgSymbolKinds; virtual;
constructor Create; virtual; constructor Create; virtual;
procedure Assign(ASource: TFpDbgValueConverter); virtual; procedure Assign(ASource: TFpDbgValueConverter); virtual;
function CreateCopy: TFpDbgValueConverter; virtual; function CreateCopy: TFpDbgValueConverter; virtual;
@ -42,43 +40,12 @@ type
end; end;
TFpDbgValueConverterClass = class of TFpDbgValueConverter; TFpDbgValueConverterClass = class of TFpDbgValueConverter;
{ TFpDbgConverterConfig }
TFpDbgConverterConfig = class(TFreeNotifyingObject, TLazDbgValueConvertSelectorIntf) { TFpDbgValueConvertSelectorIntfHelper }
private
FConverter: TFpDbgValueConverter;
FMatchKinds: TDbgSymbolKinds;
FMatchTypeNames: TStrings;
procedure SetConverter(AValue: TFpDbgValueConverter);
protected
function GetBackendSpecificObject: TObject; deprecated;
function GetConverter: TLazDbgValueConverterIntf;
public
constructor Create(AConverter: TFpDbgValueConverter);
destructor Destroy; override;
function CreateCopy: TFpDbgConverterConfig; virtual;
procedure Assign(ASource: TFpDbgConverterConfig); virtual;
TFpDbgValueConvertSelectorIntfHelper = type helper for TLazDbgValueConvertSelectorIntf
function CheckMatch(AValue: TFpValue): Boolean; function CheckMatch(AValue: TFpValue): Boolean;
function CheckTypeMatch(AValue: TFpValue): Boolean; function CheckTypeMatch(AValue: TFpValue): Boolean;
property Converter: TFpDbgValueConverter read FConverter write SetConverter;
property MatchKinds: TDbgSymbolKinds read FMatchKinds write FMatchKinds;
property MatchTypeNames: TStrings read FMatchTypeNames;
end;
TFpDbgConverterConfigClass = class of TFpDbgConverterConfig;
{ TFpDbgConverterConfigList }
TFpDbgConverterConfigList = class(specialize TFPGObjectList<TFpDbgConverterConfig>)
private
FLock: TLazMonitor;
public
constructor Create;
destructor Destroy; override;
procedure Assign(ASource: TFpDbgConverterConfigList);
procedure Lock;
procedure Unlock;
end; end;
{ TFpDbgValueConverterRegistryEntry } { TFpDbgValueConverterRegistryEntry }
@ -98,26 +65,14 @@ type
function GetProcAddrFromMgr(AnFpDebugger: TFpDebugDebuggerBase; AnExpressionScope: TFpDbgSymbolScope): TDbgPtr; function GetProcAddrFromMgr(AnFpDebugger: TFpDebugDebuggerBase; AnExpressionScope: TFpDbgSymbolScope): TDbgPtr;
public public
class function GetName: String; override; class function GetName: String; override;
class function GetSupportedKinds: TDbgSymbolKinds; override;
function ConvertValue(ASourceValue: TFpValue; function ConvertValue(ASourceValue: TFpValue;
AnFpDebugger: TFpDebugDebuggerBase; AnFpDebugger: TFpDebugDebuggerBase;
AnExpressionScope: TFpDbgSymbolScope AnExpressionScope: TFpDbgSymbolScope
): TFpValue; override; ): TFpValue; override;
end; end;
function ValueConverterConfigList: TFpDbgConverterConfigList;
implementation implementation
var
TheValueConverterList: TFpDbgConverterConfigList = nil;
function ValueConverterConfigList: TFpDbgConverterConfigList;
begin
if TheValueConverterList = nil then
TheValueConverterList := TFpDbgConverterConfigList.Create;
Result := TheValueConverterList;
end;
{ TFpDbgValueConverter } { TFpDbgValueConverter }
@ -147,11 +102,6 @@ begin
// //
end; end;
class function TFpDbgValueConverter.GetSupportedKinds: TDbgSymbolKinds;
begin
Result := [low(TDbgSymbolKinds)..high(TDbgSymbolKinds)];
end;
constructor TFpDbgValueConverter.Create; constructor TFpDbgValueConverter.Create;
begin begin
inherited Create; inherited Create;
@ -163,63 +113,17 @@ begin
// //
end; end;
{ TFpDbgConverterConfig } { TFpDbgValueConvertSelectorIntfHelper }
procedure TFpDbgConverterConfig.SetConverter(AValue: TFpDbgValueConverter); function TFpDbgValueConvertSelectorIntfHelper.CheckMatch(AValue: TFpValue
): Boolean;
begin begin
if FConverter = AValue then Exit; Result := //(AValue.Kind in (MatchKinds * GetConverter.GetSupportedKinds)) and
FConverter.ReleaseReference;
FConverter := AValue;
if FConverter <> nil then
FConverter.AddReference;
end;
function TFpDbgConverterConfig.GetBackendSpecificObject: TObject;
begin
Result := Self;
end;
function TFpDbgConverterConfig.GetConverter: TLazDbgValueConverterIntf;
begin
Result := FConverter;
end;
function TFpDbgConverterConfig.CreateCopy: TFpDbgConverterConfig;
begin
Result := TFpDbgConverterConfigClass(ClassType).Create(nil);
Result.Assign(Self);
end;
constructor TFpDbgConverterConfig.Create(AConverter: TFpDbgValueConverter);
begin
inherited Create;
Converter := AConverter;
FMatchTypeNames := TStringList.Create;
TStringList(FMatchTypeNames).CaseSensitive := False;
TStringList(FMatchTypeNames).Sorted := True;
end;
destructor TFpDbgConverterConfig.Destroy;
begin
inherited Destroy;
FMatchTypeNames.Free;
FConverter.ReleaseReference;
end;
procedure TFpDbgConverterConfig.Assign(ASource: TFpDbgConverterConfig);
begin
FMatchKinds := ASource.FMatchKinds;
FMatchTypeNames.Assign(ASource.FMatchTypeNames);
Converter := ASource.FConverter.CreateCopy;
end;
function TFpDbgConverterConfig.CheckMatch(AValue: TFpValue): Boolean;
begin
Result := (AValue.Kind in (FMatchKinds * Converter.GetSupportedKinds)) and
CheckTypeMatch(AValue); CheckTypeMatch(AValue);
end; end;
function TFpDbgConverterConfig.CheckTypeMatch(AValue: TFpValue): Boolean; function TFpDbgValueConvertSelectorIntfHelper.CheckTypeMatch(AValue: TFpValue
): Boolean;
function MatchPattern(const AName, APattern: String): Boolean; function MatchPattern(const AName, APattern: String): Boolean;
var var
NamePos, PatternPos, p: Integer; NamePos, PatternPos, p: Integer;
@ -265,6 +169,7 @@ var
TpName, Pattern, ValClassName, ValUnitName: String; TpName, Pattern, ValClassName, ValUnitName: String;
t: TFpSymbol; t: TFpSymbol;
HasMaybeUnitDot: Boolean; HasMaybeUnitDot: Boolean;
MatchTypeNames: TStrings;
begin begin
t := AValue.TypeInfo; t := AValue.TypeInfo;
Result := (t <> nil) and GetTypeName(TpName, t, [tnfNoSubstitute]); Result := (t <> nil) and GetTypeName(TpName, t, [tnfNoSubstitute]);
@ -272,10 +177,11 @@ begin
exit; exit;
TpName := LowerCase(TpName); TpName := LowerCase(TpName);
i := FMatchTypeNames.Count; MatchTypeNames := AllowedTypeNames;
i := MatchTypeNames.Count;
while i > 0 do begin while i > 0 do begin
dec(i); dec(i);
Pattern := LowerCase(trim(FMatchTypeNames[i])); Pattern := LowerCase(trim(MatchTypeNames[i]));
HasMaybeUnitDot := (pos('.', Pattern) > 1) and HasMaybeUnitDot := (pos('.', Pattern) > 1) and
(AValue.Kind in [skClass]); // only class supports unitnames (via rtti) (AValue.Kind in [skClass]); // only class supports unitnames (via rtti)
@ -338,40 +244,6 @@ begin
end; end;
end; end;
{ TFpDbgConverterConfigList }
constructor TFpDbgConverterConfigList.Create;
begin
inherited Create(True);
FLock := TLazMonitor.create;
end;
destructor TFpDbgConverterConfigList.Destroy;
begin
inherited Destroy;
FLock.Free;
end;
procedure TFpDbgConverterConfigList.Assign(ASource: TFpDbgConverterConfigList);
var
i: Integer;
begin
Clear;
Count := ASource.Count;
for i := 0 to Count - 1 do
Items[i] := ASource[i].CreateCopy;
end;
procedure TFpDbgConverterConfigList.Lock;
begin
FLock.Acquire;
end;
procedure TFpDbgConverterConfigList.Unlock;
begin
FLock.Leave;
end;
{ TFpDbgValueConverterRegistryEntry } { TFpDbgValueConverterRegistryEntry }
class function TFpDbgValueConverterRegistryEntry.CreateValueConvertorIntf: TLazDbgValueConverterIntf; class function TFpDbgValueConverterRegistryEntry.CreateValueConvertorIntf: TLazDbgValueConverterIntf;
@ -443,11 +315,6 @@ begin
Result := drsCallSysVarToLStr; Result := drsCallSysVarToLStr;
end; end;
class function TFpDbgValueConverterVariantToLStr.GetSupportedKinds: TDbgSymbolKinds;
begin
Result := [skRecord];
end;
function TFpDbgValueConverterVariantToLStr.ConvertValue(ASourceValue: TFpValue; function TFpDbgValueConverterVariantToLStr.ConvertValue(ASourceValue: TFpValue;
AnFpDebugger: TFpDebugDebuggerBase; AnExpressionScope: TFpDbgSymbolScope AnFpDebugger: TFpDebugDebuggerBase; AnExpressionScope: TFpDbgSymbolScope
): TFpValue; ): TFpValue;
@ -587,8 +454,5 @@ end;
initialization initialization
ValueConverterRegistry.Add(TFpDbgValueConverterVariantToLStrRegistryEntry); ValueConverterRegistry.Add(TFpDbgValueConverterVariantToLStrRegistryEntry);
finalization;
FreeAndNil(TheValueConverterList);
end. end.

View File

@ -8,8 +8,9 @@ uses
Classes, SysUtils, fpcunit, testregistry, TestBase, FpDebugValueConvertors, Classes, SysUtils, fpcunit, testregistry, TestBase, FpDebugValueConvertors,
FpDebugDebugger, TestDbgControl, TestDbgTestSuites, TestOutputLogger, FpDebugDebugger, TestDbgControl, TestDbgTestSuites, TestOutputLogger,
TTestWatchUtilities, TestCommonSources, TestDbgConfig, LazDebuggerIntf, TTestWatchUtilities, TestCommonSources, TestDbgConfig, LazDebuggerIntf,
LazDebuggerIntfBaseTypes, DbgIntfDebuggerBase, DbgIntfBaseTypes, FpDbgInfo, LazDebuggerIntfBaseTypes, LazDebuggerValueConverter, DbgIntfDebuggerBase,
FpPascalParser, FpDbgCommon, Forms, IdeDebuggerBase, IdeDebuggerWatchResult; DbgIntfBaseTypes, FpDbgInfo, FpPascalParser, FpDbgCommon, Forms,
IdeDebuggerBase, IdeDebuggerWatchResult, IdeDebuggerFpDbgValueConv;
type type
@ -2066,7 +2067,8 @@ var
t: TWatchExpectationList; t: TWatchExpectationList;
Src: TCommonSource; Src: TCommonSource;
BrkPrg: TDBGBreakPoint; BrkPrg: TDBGBreakPoint;
obj: TFpDbgConverterConfig; ValueConverterSelectorList: TIdeDbgValueConvertSelectorList;
obj: TIdeDbgValueConvertSelector;
i, c: Integer; i, c: Integer;
begin begin
if SkipTest then exit; if SkipTest then exit;
@ -2078,6 +2080,8 @@ begin
AssertTrue('Start debugger', Debugger.StartDebugger(AppDir, ExeName)); AssertTrue('Start debugger', Debugger.StartDebugger(AppDir, ExeName));
ValueConverterSelectorList := TIdeDbgValueConvertSelectorList.Create;
ValueConverterConfigList := ValueConverterSelectorList;
try try
t := TWatchExpectationList.Create(Self); t := TWatchExpectationList.Create(Self);
t.AcceptSkSimple := [skInteger, skCardinal, skBoolean, skChar, skFloat, t.AcceptSkSimple := [skInteger, skCardinal, skBoolean, skChar, skFloat,
@ -2096,10 +2100,10 @@ begin
RunToPause(BrkPrg); RunToPause(BrkPrg);
obj := TFpDbgConverterConfig.Create(TFpDbgValueConverterVariantToLStr.Create); obj := TIdeDbgValueConvertSelector.Create(TFpDbgValueConverterVariantToLStr.Create);
obj.MatchKinds := [skRecord]; //obj.MatchKinds := [skRecord];
obj.MatchTypeNames.Add('variant'); obj.MatchTypeNames.Add('variant');
ValueConverterConfigList.Add(obj); ValueConverterSelectorList.Add(obj);
t.Clear; t.Clear;
t.Add('variant1 to lstr', 'variant1', weAnsiStr('102')); t.Add('variant1 to lstr', 'variant1', weAnsiStr('102'));
@ -2142,7 +2146,8 @@ begin
finally finally
ValueConverterConfigList.Clear; ValueConverterConfigList := nil;
FreeAndNil(ValueConverterSelectorList);
Debugger.RunToNextPause(dcStop); Debugger.RunToNextPause(dcStop);
t.Free; t.Free;

View File

@ -31,6 +31,23 @@ type
procedure RemoveFreeNotification(ANotification: TNotifyEvent); procedure RemoveFreeNotification(ANotification: TNotifyEvent);
function GetConverter: TLazDbgValueConverterIntf; function GetConverter: TLazDbgValueConverterIntf;
function GetBackendSpecificObject: TObject; deprecated; function GetBackendSpecificObject: TObject; deprecated;
function AllowedTypeNames: TStrings;
end;
{ TLazDbgValueConvertSelectorListIntf }
TLazDbgValueConvertSelectorListIntf = interface
function Count: Integer;
function Get(Index: Integer): TLazDbgValueConvertSelectorIntf;
property Items[Index: Integer]: TLazDbgValueConvertSelectorIntf read Get; default;
procedure Lock;
procedure Unlock;
//function CreateCopy: TLazDbgValueConvertSelectorListIntf;
//procedure Assign(ASource: TLazDbgValueConvertSelectorListIntf);
//procedure Free;
end; end;
{ TLazDbgValueConvertRegistryEntry } { TLazDbgValueConvertRegistryEntry }
@ -53,6 +70,9 @@ type
function ValueConverterRegistry: TLazDbgValueConvertRegistry; function ValueConverterRegistry: TLazDbgValueConvertRegistry;
var
ValueConverterConfigList: TLazDbgValueConvertSelectorListIntf;
implementation implementation
var var
TheValueConverterRegistry: TLazDbgValueConvertRegistry; TheValueConverterRegistry: TLazDbgValueConvertRegistry;

View File

@ -103,7 +103,7 @@ uses
LazDebuggerGdbmi, GDBMIDebugger, RunParamsOpts, BaseDebugManager, LazDebuggerGdbmi, GDBMIDebugger, RunParamsOpts, BaseDebugManager,
DebugManager, debugger, DebuggerDlg, DebugAttachDialog, DebuggerStrConst, DebugManager, debugger, DebuggerDlg, DebugAttachDialog, DebuggerStrConst,
DbgIntfDebuggerBase, LazDebuggerIntf, LazDebuggerIntfBaseTypes, DbgIntfDebuggerBase, LazDebuggerIntf, LazDebuggerIntfBaseTypes,
idedebuggerpackage, FpDebugValueConvertors, idedebuggerpackage, FpDebugValueConvertors, IdeDebuggerFpDbgValueConv,
// packager // packager
PackageSystem, PkgManager, BasePkgManager, LPKCache, PackageSystem, PkgManager, BasePkgManager, LPKCache,
// source editing // source editing
@ -1390,11 +1390,11 @@ begin
DebuggerOptions.PrimaryConfigPath := GetPrimaryConfigPath; DebuggerOptions.PrimaryConfigPath := GetPrimaryConfigPath;
DebuggerOptions.CreateConfig; DebuggerOptions.CreateConfig;
DebuggerOptions.Load; DebuggerOptions.Load;
ValueConverterConfigList.Lock; ValueConverterSelectorList.Lock;
try try
DebuggerOptions.FpDbgConverterConfig.AssignEnabledTo(ValueConverterConfigList); DebuggerOptions.FpDbgConverterConfig.AssignEnabledTo(ValueConverterSelectorList);
finally finally
ValueConverterConfigList.Unlock; ValueConverterSelectorList.Unlock;
end; end;
Assert(InputHistories = nil, 'TMainIDE.LoadGlobalOptions: InputHistories is already assigned.'); Assert(InputHistories = nil, 'TMainIDE.LoadGlobalOptions: InputHistories is already assigned.');

View File

@ -754,7 +754,7 @@ type
FCurrentBackEndExpression: String; FCurrentBackEndExpression: String;
FUpdateCount: Integer; FUpdateCount: Integer;
FEvents: array [TWatcheEvaluateEvent] of TMethodList; FEvents: array [TWatcheEvaluateEvent] of TMethodList;
FFpDbgConverter: TIdeFpDbgConverterConfig; FFpDbgConverter: TIdeDbgValueConvertSelector;
(* TWatchValueIntf *) (* TWatchValueIntf *)
procedure BeginUpdate; procedure BeginUpdate;
@ -4044,7 +4044,7 @@ procedure TCurrentWatchValue.RequestData;
begin begin
FreeAndNil(FFpDbgConverter); FreeAndNil(FFpDbgConverter);
if Watch.FpDbgConverter <> nil then if Watch.FpDbgConverter <> nil then
FFpDbgConverter := TIdeFpDbgConverterConfig(Watch.FpDbgConverter.CreateCopy); FFpDbgConverter := TIdeDbgValueConvertSelector(Watch.FpDbgConverter.CreateCopy);
if (Watch.ParentWatch <> nil) and (Watch.ParentWatch.FpDbgConverter = Watch.FpDbgConverter) then if (Watch.ParentWatch <> nil) and (Watch.ParentWatch.FpDbgConverter = Watch.FpDbgConverter) then
if MaybeCopyResult(Watch.ParentWatch) then if MaybeCopyResult(Watch.ParentWatch) then

View File

@ -17,7 +17,7 @@ type
TIdeDbgFpValConvOptionsFrame = class(TAbstractIDEOptionsEditor) TIdeDbgFpValConvOptionsFrame = class(TAbstractIDEOptionsEditor)
FpDbgValConvFrame1: TFpDbgValConvFrame; FpDbgValConvFrame1: TFpDbgValConvFrame;
private private
FValConvList: TIdeFpDbgConverterConfigList; FValConvList: TIdeDbgValueConvertSelectorList;
public public
destructor Destroy; override; destructor Destroy; override;
function GetTitle: String; override; function GetTitle: String; override;
@ -62,7 +62,7 @@ procedure TIdeDbgFpValConvOptionsFrame.ReadSettings(
AOptions: TAbstractIDEOptions); AOptions: TAbstractIDEOptions);
begin begin
if FValConvList = nil then if FValConvList = nil then
FValConvList := TIdeFpDbgConverterConfigList.Create; FValConvList := TIdeDbgValueConvertSelectorList.Create;
FValConvList.Assign(DebuggerOptions.FpDbgConverterConfig); FValConvList.Assign(DebuggerOptions.FpDbgConverterConfig);
FValConvList.Changed := False; FValConvList.Changed := False;
FpDbgValConvFrame1.ValConvList := FValConvList; FpDbgValConvFrame1.ValConvList := FValConvList;
@ -76,11 +76,11 @@ begin
DebuggerOptions.FpDbgConverterConfig.Assign(FValConvList); DebuggerOptions.FpDbgConverterConfig.Assign(FValConvList);
DebuggerOptions.FpDbgConverterConfig.Changed := True; DebuggerOptions.FpDbgConverterConfig.Changed := True;
ValueConverterConfigList.Lock; ValueConverterSelectorList.Lock;
try try
DebuggerOptions.FpDbgConverterConfig.AssignEnabledTo(ValueConverterConfigList); DebuggerOptions.FpDbgConverterConfig.AssignEnabledTo(ValueConverterSelectorList);
finally finally
ValueConverterConfigList.Unlock; ValueConverterSelectorList.Unlock;
end; end;
end; end;
end; end;

View File

@ -641,7 +641,7 @@ end;
procedure TWatchInspectNav.InitWatch(AWatch: TIdeWatch); procedure TWatchInspectNav.InitWatch(AWatch: TIdeWatch);
var var
Opts: TWatcheEvaluateFlags; Opts: TWatcheEvaluateFlags;
Conv: TIdeFpDbgConverterConfig; Conv: TIdeDbgValueConvertSelector;
begin begin
Opts := AWatch.EvaluateFlags; Opts := AWatch.EvaluateFlags;
if btnUseInstance.Down then if btnUseInstance.Down then
@ -769,7 +769,7 @@ var
tid, idx: Integer; tid, idx: Integer;
stack: TIdeCallStack; stack: TIdeCallStack;
expr: String; expr: String;
Conv: TIdeFpDbgConverterConfig; Conv: TIdeDbgValueConvertSelector;
begin begin
if FUpdateCount > 0 then begin if FUpdateCount > 0 then begin
FExecAfterUpdate := True; FExecAfterUpdate := True;

View File

@ -114,7 +114,7 @@ type
TWatch = class(TDelayedUdateItem) TWatch = class(TDelayedUdateItem)
private private
FFirstIndexOffs: Int64; FFirstIndexOffs: Int64;
FFpDbgConverter: TIdeFpDbgConverterConfig; FFpDbgConverter: TIdeDbgValueConvertSelector;
procedure FFpDbgConverterFreed(Sender: TObject); procedure FFpDbgConverterFreed(Sender: TObject);
procedure SetDisplayFormat(AValue: TWatchDisplayFormat); procedure SetDisplayFormat(AValue: TWatchDisplayFormat);
@ -122,7 +122,7 @@ type
procedure SetEvaluateFlags(AValue: TWatcheEvaluateFlags); procedure SetEvaluateFlags(AValue: TWatcheEvaluateFlags);
procedure SetExpression(AValue: String); procedure SetExpression(AValue: String);
procedure SetFirstIndexOffs(AValue: Int64); procedure SetFirstIndexOffs(AValue: Int64);
procedure SetFpDbgConverter(AValue: TIdeFpDbgConverterConfig); procedure SetFpDbgConverter(AValue: TIdeDbgValueConvertSelector);
procedure SetRepeatCount(AValue: Integer); procedure SetRepeatCount(AValue: Integer);
function GetValue(const AThreadId: Integer; const AStackFrame: Integer): TWatchValue; function GetValue(const AThreadId: Integer; const AStackFrame: Integer): TWatchValue;
protected protected
@ -154,7 +154,7 @@ type
property EvaluateFlags: TWatcheEvaluateFlags read FEvaluateFlags write SetEvaluateFlags; property EvaluateFlags: TWatcheEvaluateFlags read FEvaluateFlags write SetEvaluateFlags;
property FirstIndexOffs: Int64 read FFirstIndexOffs write SetFirstIndexOffs; property FirstIndexOffs: Int64 read FFirstIndexOffs write SetFirstIndexOffs;
property RepeatCount: Integer read FRepeatCount write SetRepeatCount; property RepeatCount: Integer read FRepeatCount write SetRepeatCount;
property FpDbgConverter: TIdeFpDbgConverterConfig read FFpDbgConverter write SetFpDbgConverter; property FpDbgConverter: TIdeDbgValueConvertSelector read FFpDbgConverter write SetFpDbgConverter;
property Values[const AThreadId: Integer; const AStackFrame: Integer]: TWatchValue property Values[const AThreadId: Integer; const AStackFrame: Integer]: TWatchValue
read GetValue; read GetValue;
property ValueList: TWatchValueList read FValueList; property ValueList: TWatchValueList read FValueList;
@ -501,7 +501,7 @@ begin
DoModified; DoModified;
end; end;
procedure TWatch.SetFpDbgConverter(AValue: TIdeFpDbgConverterConfig); procedure TWatch.SetFpDbgConverter(AValue: TIdeDbgValueConvertSelector);
begin begin
if FFpDbgConverter = AValue then Exit; if FFpDbgConverter = AValue then Exit;
FValueList.Clear; FValueList.Clear;

View File

@ -5,63 +5,137 @@ unit IdeDebuggerFpDbgValueConv;
interface interface
uses uses
Classes, SysUtils, Laz2_XMLCfg, FpDebugValueConvertors, Classes, SysUtils, fgl, Laz2_XMLCfg, LazClasses, lazCollections,
LazDebuggerValueConverter; FpDebugValueConvertors, LazDebuggerValueConverter;
type type
{ TIdeFpDbgConverterConfig } { TIdeDbgValueConvertSelector }
TIdeFpDbgConverterConfig = class(TFpDbgConverterConfig) TIdeDbgValueConvertSelector = class(TFreeNotifyingObject, TLazDbgValueConvertSelectorIntf)
private private
FConverter: TFpDbgValueConverter;
FMatchTypeNames: TStrings;
FEnabled: Boolean; FEnabled: Boolean;
FName: String; FName: String;
procedure SetConverter(AValue: TFpDbgValueConverter);
protected
function GetBackendSpecificObject: TObject; deprecated;
function GetConverter: TLazDbgValueConverterIntf;
function AllowedTypeNames: TStrings;
public public
procedure Assign(ASource: TFpDbgConverterConfig); override; constructor Create(AConverter: TFpDbgValueConverter);
destructor Destroy; override;
function CreateCopy: TIdeDbgValueConvertSelector;
procedure Assign(ASource: TIdeDbgValueConvertSelector);
procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string); procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string); procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
published published
property Converter: TFpDbgValueConverter read FConverter write SetConverter;
property Enabled: Boolean read FEnabled write FEnabled; property Enabled: Boolean read FEnabled write FEnabled;
property Name: String read FName write FName; property Name: String read FName write FName;
property MatchKinds; property MatchTypeNames: TStrings read FMatchTypeNames;
end; end;
TIdeDbgValueConvertSelectorClass = class of TIdeDbgValueConvertSelector;
{ TIdeFpDbgConverterConfigList } { TIdeDbgValueConvertSelectorList }
TIdeFpDbgConverterConfigList = class(TFpDbgConverterConfigList) TIdeDbgValueConvertSelectorList = class(
specialize TFPGObjectList<TIdeDbgValueConvertSelector>,
TLazDbgValueConvertSelectorListIntf
)
private private
FLock: TLazMonitor;
FChanged: Boolean; FChanged: Boolean;
function GetIdeItems(Index: Integer): TIdeFpDbgConverterConfig; function Count: Integer;
procedure PutIdeItems(Index: Integer; AValue: TIdeFpDbgConverterConfig); function Get(Index: Integer): TLazDbgValueConvertSelectorIntf;
function GetIdeItems(Index: Integer): TIdeDbgValueConvertSelector;
procedure PutIdeItems(Index: Integer; AValue: TIdeDbgValueConvertSelector);
public public
procedure AssignEnabledTo(ADest: TFpDbgConverterConfigList); constructor Create;
destructor Destroy; override;
procedure Assign(ASource: TIdeDbgValueConvertSelectorList);
procedure Lock;
procedure Unlock;
procedure AssignEnabledTo(ADest: TIdeDbgValueConvertSelectorList);
procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string); procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string); procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
function IdeItemByName(AName: String): TIdeFpDbgConverterConfig; function IdeItemByName(AName: String): TIdeDbgValueConvertSelector;
property IdeItems[Index: Integer]: TIdeFpDbgConverterConfig read GetIdeItems write PutIdeItems; default; property IdeItems[Index: Integer]: TIdeDbgValueConvertSelector read GetIdeItems write PutIdeItems; default;
property Changed: Boolean read FChanged write FChanged; property Changed: Boolean read FChanged write FChanged;
end; end;
var
ValueConverterSelectorList: TIdeDbgValueConvertSelectorList;
implementation implementation
{ TIdeFpDbgConverterConfig } { TIdeDbgValueConvertSelector }
procedure TIdeFpDbgConverterConfig.Assign(ASource: TFpDbgConverterConfig); procedure TIdeDbgValueConvertSelector.SetConverter(AValue: TFpDbgValueConverter);
var
Src: TIdeFpDbgConverterConfig absolute ASource;
begin begin
inherited Assign(ASource); if FConverter = AValue then Exit;
if ASource is TIdeFpDbgConverterConfig then begin FConverter.ReleaseReference;
FName := Src.FName; FConverter := AValue;
FEnabled := Src.FEnabled; if FConverter <> nil then
end; FConverter.AddReference;
end; end;
procedure TIdeFpDbgConverterConfig.LoadDataFromXMLConfig( function TIdeDbgValueConvertSelector.GetBackendSpecificObject: TObject;
begin
Result := Self;
end;
function TIdeDbgValueConvertSelector.GetConverter: TLazDbgValueConverterIntf;
begin
Result := FConverter;
end;
function TIdeDbgValueConvertSelector.AllowedTypeNames: TStrings;
begin
Result := FMatchTypeNames;
end;
constructor TIdeDbgValueConvertSelector.Create(AConverter: TFpDbgValueConverter);
begin
inherited Create;
Converter := AConverter;
FMatchTypeNames := TStringList.Create;
TStringList(FMatchTypeNames).CaseSensitive := False;
TStringList(FMatchTypeNames).Sorted := True;
end;
destructor TIdeDbgValueConvertSelector.Destroy;
begin
inherited Destroy;
FMatchTypeNames.Free;
FConverter.ReleaseReference;
end;
function TIdeDbgValueConvertSelector.CreateCopy: TIdeDbgValueConvertSelector;
begin
Result := TIdeDbgValueConvertSelectorClass(ClassType).Create(nil);
Result.Assign(Self);
end;
procedure TIdeDbgValueConvertSelector.Assign(ASource: TIdeDbgValueConvertSelector);
begin
Converter := ASource.FConverter.CreateCopy;
FMatchTypeNames.Assign(ASource.FMatchTypeNames);
FName := ASource.FName;
FEnabled := ASource.FEnabled;
end;
procedure TIdeDbgValueConvertSelector.LoadDataFromXMLConfig(
const AConfig: TRttiXMLConfig; const APath: string); const AConfig: TRttiXMLConfig; const APath: string);
var var
s: String; s: String;
@ -81,7 +155,7 @@ begin
Converter := obj; Converter := obj;
end; end;
procedure TIdeFpDbgConverterConfig.SaveDataToXMLConfig( procedure TIdeDbgValueConvertSelector.SaveDataToXMLConfig(
const AConfig: TRttiXMLConfig; const APath: string); const AConfig: TRttiXMLConfig; const APath: string);
begin begin
AConfig.WriteObject(APath + 'Filter/', Self); AConfig.WriteObject(APath + 'Filter/', Self);
@ -91,23 +165,67 @@ begin
AConfig.WriteObject(APath + 'Conv/', Converter); AConfig.WriteObject(APath + 'Conv/', Converter);
end; end;
{ TIdeFpDbgConverterConfigList } { TIdeDbgValueConvertSelectorList }
function TIdeFpDbgConverterConfigList.GetIdeItems(Index: Integer function TIdeDbgValueConvertSelectorList.Count: Integer;
): TIdeFpDbgConverterConfig;
begin begin
Result := TIdeFpDbgConverterConfig(Items[Index]); Result := inherited Count;
assert(Result is TIdeFpDbgConverterConfig, 'TIdeFpDbgConverterConfigList.GetIdeItems: Result is TIdeFpDbgConverterConfig');
end; end;
procedure TIdeFpDbgConverterConfigList.PutIdeItems(Index: Integer; function TIdeDbgValueConvertSelectorList.Get(Index: Integer
AValue: TIdeFpDbgConverterConfig); ): TLazDbgValueConvertSelectorIntf;
begin
Result := Items[Index];
end;
function TIdeDbgValueConvertSelectorList.GetIdeItems(Index: Integer
): TIdeDbgValueConvertSelector;
begin
Result := TIdeDbgValueConvertSelector(Items[Index]);
assert(Result is TIdeDbgValueConvertSelector, 'TIdeDbgValueConvertSelectorList.GetIdeItems: Result is TIdeDbgValueConvertSelector');
end;
procedure TIdeDbgValueConvertSelectorList.PutIdeItems(Index: Integer;
AValue: TIdeDbgValueConvertSelector);
begin begin
Items[Index] := AValue; Items[Index] := AValue;
end; end;
procedure TIdeFpDbgConverterConfigList.AssignEnabledTo( constructor TIdeDbgValueConvertSelectorList.Create;
ADest: TFpDbgConverterConfigList); begin
inherited Create(True);
FLock := TLazMonitor.create;
end;
destructor TIdeDbgValueConvertSelectorList.Destroy;
begin
inherited Destroy;
FLock.Free;
end;
procedure TIdeDbgValueConvertSelectorList.Assign(
ASource: TIdeDbgValueConvertSelectorList);
var
i: Integer;
begin
Clear;
inherited Count := ASource.Count;
for i := 0 to Count - 1 do
Items[i] := ASource[i].CreateCopy;
end;
procedure TIdeDbgValueConvertSelectorList.Lock;
begin
FLock.Acquire;
end;
procedure TIdeDbgValueConvertSelectorList.Unlock;
begin
FLock.Leave;
end;
procedure TIdeDbgValueConvertSelectorList.AssignEnabledTo(
ADest: TIdeDbgValueConvertSelectorList);
var var
i: Integer; i: Integer;
begin begin
@ -117,16 +235,16 @@ begin
ADest.Add(Items[i].CreateCopy); ADest.Add(Items[i].CreateCopy);
end; end;
procedure TIdeFpDbgConverterConfigList.LoadDataFromXMLConfig( procedure TIdeDbgValueConvertSelectorList.LoadDataFromXMLConfig(
const AConfig: TRttiXMLConfig; const APath: string); const AConfig: TRttiXMLConfig; const APath: string);
var var
i, c: Integer; i, c: Integer;
obj: TIdeFpDbgConverterConfig; obj: TIdeDbgValueConvertSelector;
begin begin
clear; clear;
c := AConfig.GetChildCount(APath); c := AConfig.GetChildCount(APath);
for i := 0 to c - 1 do begin for i := 0 to c - 1 do begin
obj := TIdeFpDbgConverterConfig.Create(nil); obj := TIdeDbgValueConvertSelector.Create(nil);
obj.LoadDataFromXMLConfig(AConfig, APath + 'Entry[' + IntToStr(i+1) + ']/'); obj.LoadDataFromXMLConfig(AConfig, APath + 'Entry[' + IntToStr(i+1) + ']/');
if obj.Converter <> nil then if obj.Converter <> nil then
Add(obj) Add(obj)
@ -135,7 +253,7 @@ begin
end end
end; end;
procedure TIdeFpDbgConverterConfigList.SaveDataToXMLConfig( procedure TIdeDbgValueConvertSelectorList.SaveDataToXMLConfig(
const AConfig: TRttiXMLConfig; const APath: string); const AConfig: TRttiXMLConfig; const APath: string);
var var
i: Integer; i: Integer;
@ -145,8 +263,8 @@ begin
IdeItems[i].SaveDataToXMLConfig(AConfig, APath + 'Entry[' + IntToStr(i+1) + ']/'); IdeItems[i].SaveDataToXMLConfig(AConfig, APath + 'Entry[' + IntToStr(i+1) + ']/');
end; end;
function TIdeFpDbgConverterConfigList.IdeItemByName(AName: String function TIdeDbgValueConvertSelectorList.IdeItemByName(AName: String
): TIdeFpDbgConverterConfig; ): TIdeDbgValueConvertSelector;
var var
i: Integer; i: Integer;
begin begin
@ -158,5 +276,13 @@ begin
Result := IdeItems[i]; Result := IdeItems[i];
end; end;
initialization
ValueConverterSelectorList := TIdeDbgValueConvertSelectorList.Create;
ValueConverterConfigList := ValueConverterSelectorList;
finalization
ValueConverterConfigList := nil;
FreeAndNil(ValueConverterSelectorList);
end. end.

View File

@ -15,7 +15,7 @@ type
TDebuggerOptions = class(TAbstractIDEEnvironmentOptions) TDebuggerOptions = class(TAbstractIDEEnvironmentOptions)
private private
FFilename: string; FFilename: string;
FFpDbgConverterConfig: TIdeFpDbgConverterConfigList; FFpDbgConverterConfig: TIdeDbgValueConvertSelectorList;
FPrimaryConfigPath: String; FPrimaryConfigPath: String;
FXMLCfg: TRttiXMLConfig; FXMLCfg: TRttiXMLConfig;
protected protected
@ -34,7 +34,7 @@ type
property Filename: string read FFilename; property Filename: string read FFilename;
property PrimaryConfigPath: String read FPrimaryConfigPath write FPrimaryConfigPath; property PrimaryConfigPath: String read FPrimaryConfigPath write FPrimaryConfigPath;
property FpDbgConverterConfig: TIdeFpDbgConverterConfigList read FFpDbgConverterConfig write FFpDbgConverterConfig; property FpDbgConverterConfig: TIdeDbgValueConvertSelectorList read FFpDbgConverterConfig write FFpDbgConverterConfig;
end; end;
function GetDebuggerOptions: TDebuggerOptions; function GetDebuggerOptions: TDebuggerOptions;
@ -79,7 +79,7 @@ end;
constructor TDebuggerOptions.Create; constructor TDebuggerOptions.Create;
begin begin
inherited Create; inherited Create;
FpDbgConverterConfig := TIdeFpDbgConverterConfigList.Create; FpDbgConverterConfig := TIdeDbgValueConvertSelectorList.Create;
end; end;
destructor TDebuggerOptions.Destroy; destructor TDebuggerOptions.Destroy;

View File

@ -39,25 +39,25 @@ type
procedure Splitter1CanOffset(Sender: TObject; var NewOffset: Integer; procedure Splitter1CanOffset(Sender: TObject; var NewOffset: Integer;
var Accept: Boolean); var Accept: Boolean);
private private
FValConvList: TIdeFpDbgConverterConfigList; FValConvList: TIdeDbgValueConvertSelectorList;
FCurIdx: Integer; FCurIdx: Integer;
FCurConvConf: TIdeFpDbgConverterConfig; FCurConvConf: TIdeDbgValueConvertSelector;
FCurConv: TLazDbgValueConverterIntf; FCurConv: TLazDbgValueConverterIntf;
FCurConvSettings: TLazDbgValueConverterSettingsFrameIntf; FCurConvSettings: TLazDbgValueConverterSettingsFrameIntf;
procedure SetCurConv(AValConv: TIdeFpDbgConverterConfig); procedure SetCurConv(AValConv: TIdeDbgValueConvertSelector);
procedure UpdateConvForClass; procedure UpdateConvForClass;
procedure UpdateConvPanel; procedure UpdateConvPanel;
procedure FillList; procedure FillList;
procedure UpdateButtons; procedure UpdateButtons;
procedure SetValConvList(AValue: TIdeFpDbgConverterConfigList); procedure SetValConvList(AValue: TIdeDbgValueConvertSelectorList);
public public
constructor Create(TheOwner: TComponent); override; constructor Create(TheOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
procedure SaveCurrent; procedure SaveCurrent;
procedure Setup; procedure Setup;
property ValConvList: TIdeFpDbgConverterConfigList read FValConvList write SetValConvList; property ValConvList: TIdeDbgValueConvertSelectorList read FValConvList write SetValConvList;
end; end;
implementation implementation
@ -70,7 +70,7 @@ procedure TFpDbgValConvFrame.btnAddClick(Sender: TObject);
var var
AvailClass: TLazDbgValueConvertRegistry; AvailClass: TLazDbgValueConvertRegistry;
AName: String; AName: String;
obj: TIdeFpDbgConverterConfig; obj: TIdeDbgValueConvertSelector;
begin begin
AName := InputBox(dlgIdeDbgNewItem, dlgIdeDbgEnterName, ''); AName := InputBox(dlgIdeDbgNewItem, dlgIdeDbgEnterName, '');
if AName = '' then if AName = '' then
@ -80,10 +80,10 @@ begin
FCurConvConf := nil; FCurConvConf := nil;
AvailClass := ValueConverterRegistry; AvailClass := ValueConverterRegistry;
obj := TIdeFpDbgConverterConfig.Create(AvailClass[0].CreateValueConvertorIntf.GetObject as TFpDbgValueConverter); obj := TIdeDbgValueConvertSelector.Create(AvailClass[0].CreateValueConvertorIntf.GetObject as TFpDbgValueConverter);
obj.Enabled := True; obj.Enabled := True;
obj.Name := AName; obj.Name := AName;
obj.MatchKinds := obj.Converter.GetSupportedKinds; // obj.MatchKinds := obj.Converter.GetSupportedKinds;
FValConvList.Add(obj); FValConvList.Add(obj);
FillList; FillList;
@ -163,7 +163,7 @@ begin
end; end;
procedure TFpDbgValConvFrame.SetCurConv(AValConv: TIdeFpDbgConverterConfig); procedure TFpDbgValConvFrame.SetCurConv(AValConv: TIdeDbgValueConvertSelector);
begin begin
FCurConvConf := AValConv; FCurConvConf := AValConv;
FCurConv := TLazDbgValueConvertSelectorIntf(FCurConvConf).GetConverter; FCurConv := TLazDbgValueConvertSelectorIntf(FCurConvConf).GetConverter;
@ -203,7 +203,7 @@ end;
procedure TFpDbgValConvFrame.FillList; procedure TFpDbgValConvFrame.FillList;
var var
i: Integer; i: Integer;
obj: TIdeFpDbgConverterConfig; obj: TIdeDbgValueConvertSelector;
begin begin
FCurConvConf := nil; FCurConvConf := nil;
@ -222,7 +222,7 @@ begin
pnlCurrentConv.Enabled := FCurConvConf <> nil; pnlCurrentConv.Enabled := FCurConvConf <> nil;
end; end;
procedure TFpDbgValConvFrame.SetValConvList(AValue: TIdeFpDbgConverterConfigList); procedure TFpDbgValConvFrame.SetValConvList(AValue: TIdeDbgValueConvertSelectorList);
begin begin
if FValConvList = AValue then Exit; if FValConvList = AValue then Exit;
FValConvList := AValue; FValConvList := AValue;
@ -252,7 +252,7 @@ begin
then begin then begin
FValConvList.Changed := True; FValConvList.Changed := True;
FCurConvConf.Converter := TFpDbgValueConverter(FCurConv.GetObject); FCurConvConf.Converter := TFpDbgValueConverter(FCurConv.GetObject);
FCurConvConf.MatchKinds := FCurConvConf.Converter.GetSupportedKinds; // FCurConvConf.MatchKinds := FCurConvConf.Converter.GetSupportedKinds;
FCurConvConf.MatchTypeNames.Text := memoTypeNames.Text; FCurConvConf.MatchTypeNames.Text := memoTypeNames.Text;
FCurConvConf.Name := EdName.Text FCurConvConf.Name := EdName.Text
end; end;