From ff1657deea4a01333150713ba85b6c573e1ffb7a Mon Sep 17 00:00:00 2001 From: martin Date: Tue, 9 Jul 2019 19:20:08 +0000 Subject: [PATCH] Debugger-Config: Allow individual LRU list for gdb vs lldb git-svn-id: trunk@61554 - --- .../debuggerintf/dbgintfdebuggerbase.pp | 8 ++++- components/lazdebuggergdbmi/gdbmidebugger.pp | 6 ++++ .../lazdebuggerlldb/lldbdebugger.pas | 6 ++++ debugger/frames/debugger_class_options.pas | 33 ++++++++++++++---- ide/environmentopts.pp | 34 +++++++++++++++++-- ide/initialsetupdlgs.pas | 4 ++- 6 files changed, 80 insertions(+), 11 deletions(-) diff --git a/components/debuggerintf/dbgintfdebuggerbase.pp b/components/debuggerintf/dbgintfdebuggerbase.pp index 5ca7f2aec2..edb2c67b82 100644 --- a/components/debuggerintf/dbgintfdebuggerbase.pp +++ b/components/debuggerintf/dbgintfdebuggerbase.pp @@ -200,6 +200,7 @@ type *) TDebuggerIntf = class; + TDebuggerClass = class of TDebuggerIntf; TDebuggerDataSupplier = class; { TDebuggerDataHandler } @@ -1888,6 +1889,7 @@ type public class function Caption: String; virtual; // The name of the debugger as shown in the debuggeroptions class function ExePaths: String; virtual; // The default locations of the exe + class function ExePathsMruGroup: TDebuggerClass; virtual; // The default locations of the exe class function HasExePath: boolean; virtual; deprecated; // use NeedsExePath instead class function NeedsExePath: boolean; virtual; // If the debugger needs to have an exe path class function RequiredCompilerOpts(ATargetCPU, ATargetOS: String): TDebugCompilerRequirements; virtual; @@ -1986,7 +1988,6 @@ type property OnFeedback: TDBGFeedbackEvent read FOnFeedback write FOnFeedback; property OnIdle: TNotifyEvent read FOnIdle write FOnIdle; // Called if all outstanding requests are processed (queue empty) end; - TDebuggerClass = class of TDebuggerIntf; { TBaseDebugManagerIntf } @@ -6050,6 +6051,11 @@ begin Result := ''; end; +class function TDebuggerIntf.ExePathsMruGroup: TDebuggerClass; +begin + Result := Self; +end; + class function TDebuggerIntf.HasExePath: boolean; begin Result := NeedsExePath; diff --git a/components/lazdebuggergdbmi/gdbmidebugger.pp b/components/lazdebuggergdbmi/gdbmidebugger.pp index cd1613a613..335cd733fa 100644 --- a/components/lazdebuggergdbmi/gdbmidebugger.pp +++ b/components/lazdebuggergdbmi/gdbmidebugger.pp @@ -975,6 +975,7 @@ type class function CreateProperties: TDebuggerProperties; override; // Creates debuggerproperties class function Caption: String; override; class function ExePaths: String; override; + class function ExePathsMruGroup: TDebuggerClass; override; constructor Create(const AExternalDebugger: String); override; destructor Destroy; override; @@ -8635,6 +8636,11 @@ begin {$ENDIF} end; +class function TGDBMIDebuggerBase.ExePathsMruGroup: TDebuggerClass; +begin + Result := TGDBMIDebugger; +end; + function TGDBMIDebuggerBase.FindBreakpoint( const ABreakpoint: Integer): TDBGBreakPoint; var diff --git a/components/lazdebuggers/lazdebuggerlldb/lldbdebugger.pas b/components/lazdebuggers/lazdebuggerlldb/lldbdebugger.pas index 657bb3e3f3..e74e287534 100644 --- a/components/lazdebuggers/lazdebuggerlldb/lldbdebugger.pas +++ b/components/lazdebuggers/lazdebuggerlldb/lldbdebugger.pas @@ -371,6 +371,7 @@ type class function CreateProperties: TDebuggerProperties; override; // Creates debuggerproperties class function Caption: String; override; class function ExePaths: String; override; + class function ExePathsMruGroup: TDebuggerClass; override; constructor Create(const AExternalDebugger: String); override; destructor Destroy; override; @@ -3052,6 +3053,11 @@ begin {$ENDIF} end; +class function TLldbDebugger.ExePathsMruGroup: TDebuggerClass; +begin + Result := TLldbDebugger; +end; + constructor TLldbDebugger.Create(const AExternalDebugger: String); begin inherited Create(AExternalDebugger); diff --git a/debugger/frames/debugger_class_options.pas b/debugger/frames/debugger_class_options.pas index 99301ef871..98f37dbff2 100644 --- a/debugger/frames/debugger_class_options.pas +++ b/debugger/frames/debugger_class_options.pas @@ -73,6 +73,7 @@ type procedure tbDeleteClick(Sender: TObject); procedure tbSelectClick(Sender: TObject); private + FDebuggerFileHistory: TStringList; FInOdNameExit: Boolean; PropertyGrid: TOIPropertyGrid; FPropertyEditorHook: TPropertyEditorHook; @@ -125,14 +126,12 @@ begin ParsedFName := EnvironmentOptions.GetParsedValue(eopDebuggerFilename, FLastCheckedDebuggerPath); if ParsedFName = '' then ParsedFName := FLastCheckedDebuggerPath; -DebugLn(['############### ',ParsedFName]); if not CheckExecutable(FSelectedDbgPropertiesConfig.DebuggerFilename, ParsedFName, lisEnvOptDlgInvalidDebuggerFilename, lisEnvOptDlgInvalidDebuggerFilenameMsg) then exit; end; -DebugLn(['<<<<<<<<<< ###### ',FSelectedDbgPropertiesConfig.DebuggerFilename ,' << ', cmbDebuggerPath.Text]); FSelectedDbgPropertiesConfig.DebuggerFilename := cmbDebuggerPath.Text; end; @@ -312,6 +311,7 @@ end; procedure TDebuggerClassOptionsFrame.UpdateDebuggerClass; var c: TDebuggerClass; + i: Integer; begin if FSelectedDbgPropertiesConfig = nil then exit; @@ -319,6 +319,12 @@ begin if SelectedDebuggerClass = c then exit; + i := FDebuggerFileHistory.IndexOf(SelectedDebuggerClass.ExePathsMruGroup.ClassName); + Assert(i>0, 'Missing dbg lru'); + if i > 0 then // should always be + TStringList(FDebuggerFileHistory.Objects[i]).Assign(cmbDebuggerPath.Items); + + FSelectedDbgPropertiesConfig.ChangeDebuggerClass(c, True); // TOOD: Ask user? FSelectedDbgPropertiesConfig.ConfigName := GetUniqueName(FSelectedDbgPropertiesConfig.ConfigName); @@ -359,6 +365,8 @@ procedure TDebuggerClassOptionsFrame.FetchDebuggerSpecificOptions; var S, S2, S3: String; Prop: TDebuggerProperties; + lru: TStringList; + i: Integer; begin PropertyGrid.Selection.Clear; @@ -369,10 +377,19 @@ begin exit; end; + i := FDebuggerFileHistory.IndexOf(SelectedDebuggerClass.ExePathsMruGroup.ClassName); + if i >= 0 then begin + lru := TStringList(FDebuggerFileHistory.Objects[i]); + end + else begin + lru := TStringList.Create; + lru.Assign(EnvironmentOptions.DebuggerFileHistory[SelectedDebuggerClass.ExePathsMruGroup.ClassName]); + FDebuggerFileHistory.AddObject(SelectedDebuggerClass.ExePathsMruGroup.ClassName, lru); + end; with cmbDebuggerPath.Items do begin BeginUpdate; - Assign(EnvironmentOptions.DebuggerFileHistory); + Assign(lru); if (Count = 0) and (SelectedDebuggerClass <> nil) then begin @@ -390,7 +407,6 @@ begin EndUpdate; end; -debugln(['>>>### ',FSelectedDbgPropertiesConfig.DebuggerFilename,cstFilename]); SetComboBoxText(cmbDebuggerPath,FSelectedDbgPropertiesConfig.DebuggerFilename,cstFilename,20); edName.Text := FSelectedDbgPropertiesConfig.ConfigName; @@ -515,6 +531,8 @@ begin FPropertyEditorHook:=TPropertyEditorHook.Create(Self); FPropertyEditorHook.AddHandlerGetCheckboxForBoolean(@HookGetCheckboxForBoolean); + FDebuggerFileHistory := TStringList.Create; + FDebuggerFileHistory.OwnsObjects := True; FCopiedDbgPropertiesConfigList := TDebuggerPropertiesConfigList.Create; FCopiedDbgPropertiesConfigList.CaseSensitive := False; // create the PropertyGrid @@ -543,6 +561,7 @@ begin PropertyGrid.Selection.Clear; FreeAndNil(FPropertyEditorHook); FreeAndNil(FCopiedDbgPropertiesConfigList); + FreeAndNil(FDebuggerFileHistory); inherited Destroy; end; @@ -555,7 +574,6 @@ begin UpdateDebuggerClass; // TODO: might edit the name FLastCheckedDebuggerPath := 'X'+cmbDebuggerPath.Text; // ensure a new check is done cmbDebuggerPathEditingDone(nil); -debugln(['############### >',FSelectedDbgPropertiesConfig.DebuggerFilename, '< ## >', cmbDebuggerPath.Text, '< #']); Result := (FSelectedDbgPropertiesConfig.DebuggerFilename = cmbDebuggerPath.Text); end; @@ -585,6 +603,7 @@ begin begin ObjectInspectorOptions.AssignTo(PropertyGrid); + FDebuggerFileHistory.Clear; FCopiedDbgPropertiesConfigList.ClearAll; for i := 0 to DebuggerPropertiesConfigList.Count - 1 do FCopiedDbgPropertiesConfigList.AddObject(DebuggerPropertiesConfigList[i], @@ -609,7 +628,9 @@ var begin with EnvironmentOptions do begin - DebuggerFileHistory.Assign(cmbDebuggerPath.Items); + for i := 0 to FDebuggerFileHistory.Count - 1 do + DebuggerFileHistory[FDebuggerFileHistory[i]].Assign(TStringList(FDebuggerFileHistory.Objects[i])); + // DebuggerSearchPath := TrimSearchPath(txtAdditionalPath.Text,''); EnvConf := DebuggerPropertiesConfigList; diff --git a/ide/environmentopts.pp b/ide/environmentopts.pp index 0a087ae9b3..9d0b9cebd4 100644 --- a/ide/environmentopts.pp +++ b/ide/environmentopts.pp @@ -727,6 +727,7 @@ type function GetMakeFilename: string; function GetMsgColors(u: TMessageLineUrgency): TColor; function GetMsgViewColors(c: TMsgWndColor): TColor; + function GetNamedDebuggerFileHistory(AnIndex: String): TStringList; function GetSubConfig(Index: Integer): TIDESubOptions; function GetTestBuildDirectory: string; function GetFppkgConfigFile: string; @@ -891,7 +892,7 @@ type property MakeFilename: string read GetMakeFilename write SetMakeFilename; property MakeFileHistory: TStringList read FMakeFileHistory; property DebuggerFilename: string read GetDebuggerFilename; - property DebuggerFileHistory: TStringList read FDebuggerFileHistory; + property DebuggerFileHistory[AnIndex: String]: TStringList read GetNamedDebuggerFileHistory; property DebuggerSearchPath: string read GetDebuggerSearchPath write SetDebuggerSearchPath; property DebuggerShowStopMessage: boolean read FDebuggerShowStopMessage write FDebuggerShowStopMessage; property DebuggerResetAfterRun: boolean read FDebuggerResetAfterRun write FDebuggerResetAfterRun; @@ -2101,6 +2102,7 @@ begin MakeFilename:=DefaultMakefilename; FMakeFileHistory:=TStringList.Create; FDebuggerFileHistory:=TStringList.Create; + FDebuggerFileHistory.OwnsObjects := True; FDebuggerProperties := TDebuggerPropertiesConfigList.Create; FDebuggerEventLogColors:=DebuggerDefaultColors; FppkgConfigFile:=''; @@ -2339,6 +2341,7 @@ procedure TEnvironmentOptions.LoadNonDesktop(Path: String); var EventType: TDBGEventType; + i: Integer; begin // files LazarusDirectory:=FXMLCfg.GetValue(Path+'LazarusDirectory/Value',LazarusDirectory); @@ -2388,7 +2391,10 @@ begin // Debugger // DO not call LoadDebuggerProperties; => not all debuggers are registered when this is first called FDebuggerConfig.Load; - LoadRecentList(FXMLCfg,FDebuggerFileHistory,Path+'DebuggerFilename/History/',rltFile); + if FXMLCfg.HasPath(Path+'DebuggerFilename/History', False) then begin + i := FDebuggerFileHistory.AddObject('', TStringList.Create); + LoadRecentList(FXMLCfg,TStrings(FDebuggerFileHistory.Objects[i]),Path+'DebuggerFilename/History/',rltFile); + end; DebuggerSearchPath:=FXMLCfg.GetValue(Path+'DebuggerSearchPath/Value',''); // Debugger General Options DebuggerShowStopMessage:=FXMLCfg.GetValue(Path+'DebuggerOptions/ShowStopMessage/Value', True); @@ -2726,6 +2732,7 @@ procedure TEnvironmentOptions.SaveNonDesktop(Path: String); var BaseDir, CurLazDir: String; EventType: TDBGEventType; + i: Integer; begin // files CurLazDir:=ChompPathDelim(LazarusDirectory); @@ -2784,7 +2791,12 @@ begin FDebuggerResetAfterRun, False); FXMLCfg.SetDeleteValue(Path+'DebuggerOptions/DebuggerAutoCloseAsm/Value', FDebuggerAutoCloseAsm, False); - SaveRecentList(FXMLCfg,FDebuggerFileHistory,Path+'DebuggerFilename/History/'); + for i := 0 to FDebuggerFileHistory.Count -1 do + if FDebuggerFileHistory[i] = '' then + SaveRecentList(FXMLCfg,TStrings(FDebuggerFileHistory.Objects[i]),Path+'DebuggerFilename/History/') + else + SaveRecentList(FXMLCfg,TStrings(FDebuggerFileHistory.Objects[i]), + Path+'DebuggerFilename/'+FDebuggerFileHistory[i]+'/History/'); FXMLCfg.SetDeleteValue(Path+'DebuggerSearchPath/Value',DebuggerSearchPath,''); FXMLCfg.SetDeleteValue(Path+'Debugger/EventLogClearOnRun',FDebuggerEventLogClearOnRun, True); FXMLCfg.SetDeleteValue(Path+'Debugger/EventLogCheckLineLimit',FDebuggerEventLogCheckLineLimit, False); @@ -3776,6 +3788,22 @@ begin Result:=fMsgViewColors[c]; end; +function TEnvironmentOptions.GetNamedDebuggerFileHistory(AnIndex: String + ): TStringList; +var + i: Integer; +begin + i := FDebuggerFileHistory.IndexOf(AnIndex); + if i < 0 then begin + i := FDebuggerFileHistory.AddObject(AnIndex, TStringList.Create); + if FXMLCfg.HasPath('EnvironmentOptions/DebuggerFilename/'+AnIndex+'/History', False) then + LoadRecentList(FXMLCfg,TStrings(FDebuggerFileHistory.Objects[i]),'EnvironmentOptions/DebuggerFilename/'+AnIndex+'/History/',rltFile) + else + TStrings(FDebuggerFileHistory.Objects[i]).Assign(DebuggerFileHistory['']); // init from old list + end; + Result := TStringList(FDebuggerFileHistory.Objects[i]); +end; + function TEnvironmentOptions.GetSubConfig(Index: Integer): TIDESubOptions; begin Result := TIDESubOptions(fRegisteredSubConfig[Index]); diff --git a/ide/initialsetupdlgs.pas b/ide/initialsetupdlgs.pas index dd9baac645..4f365f9519 100644 --- a/ide/initialsetupdlgs.pas +++ b/ide/initialsetupdlgs.pas @@ -356,7 +356,9 @@ begin end; // check history - Files:=EnvironmentOptions.DebuggerFileHistory; + Files:=EnvironmentOptions.DebuggerFileHistory[CurDbgClassName]; + if (Files=nil) or (Files.Count=0) then + Files:=EnvironmentOptions.DebuggerFileHistory['']; if Files<>nil then for i:=0 to Files.Count-1 do if CheckFile(Files[i],Result) then exit;