IdeDebugger: ValueFormatter "Ordinal to name"

This commit is contained in:
Martin 2024-04-28 00:10:03 +02:00
parent ee125ebe32
commit 85652d22ca
29 changed files with 512 additions and 2 deletions

View File

@ -111,7 +111,7 @@ type
procedure DoFree; virtual;
procedure ILazDbgIdeValueFormatterIntf.Free = DoFree;
public
constructor Create; // only call init, if overridden can be skipped if init is called directly
constructor Create; // inherited Create may not be called => use init
function FormatValue(AWatchValue: IWatchResultDataIntf;
ADisplayFormat: TWatchDisplayFormat;
AWatchResultPrinter: IWatchResultPrinter;

View File

@ -304,6 +304,10 @@
<ResourceBaseClass Value="Frame"/>
<ResourceBaseClassname Value=""/>
</Item>
<Item>
<Filename Value="idedebuggervalueformatterordinaltoname.pas"/>
<UnitName Value="IdeDebuggerValueFormatterOrdinalToName"/>
</Item>
</Files>
<i18n>
<EnableI18N Value="True"/>

View File

@ -22,7 +22,8 @@ uses
IdeDebuggerValueFormatterSetup, IdeDebuggerValueFormatterCurrency, DisplayFormatConfigFrame,
DisplayFormatDefaultsConfigFrame, IdeDebuggerDisplayFormats, IdeDebugger_DisplayFormat_Options,
ProjectDebugLink, IdeDebuggerValueFormatterArrayOfCharToString,
IdeDebuggerValueFormatterDisplayFormat, LazarusPackageIntf;
IdeDebuggerValueFormatterDisplayFormat, IdeDebuggerValueFormatterOrdinalToName,
LazarusPackageIntf;
implementation

View File

@ -504,6 +504,7 @@ resourcestring
dbgDoNotShowThisMessageAgain = 'Do not ask again';
optDispGutterCustomDisplayformat = 'Custom Display Format';
dbgConvertOrdinalToName = 'Convert ordinal to name';
implementation

View File

@ -0,0 +1,34 @@
object IdeDebuggerValueFormatterOrdinalToNameFrame: TIdeDebuggerValueFormatterOrdinalToNameFrame
Left = 0
Height = 240
Top = 0
Width = 320
AutoSize = True
ClientHeight = 240
ClientWidth = 320
TabOrder = 0
DesignLeft = 327
DesignTop = 67
object Label1: TLabel
Left = 3
Height = 15
Top = 3
Width = 314
Align = alTop
BorderSpacing.Around = 3
Caption = 'Label1'
end
object Memo1: TMemo
Left = 3
Height = 300
Top = 21
Width = 314
Align = alClient
BorderSpacing.Around = 3
Constraints.MinHeight = 300
Lines.Strings = (
'Memo1'
)
TabOrder = 0
end
end

View File

@ -0,0 +1,378 @@
unit IdeDebuggerValueFormatterOrdinalToName;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, fgl, Forms, Controls, StdCtrls,
// DebuggerIntf
DbgIntfDebuggerBase, DbgIntfBaseTypes,
// IdeIntf
IdeDebuggerValueFormatterIntf, IdeDebuggerWatchValueIntf,
// IdeDebugger
IdeDebuggerStringConstants;
type
{ TIdeDebuggerValueFormatterOrdinalToNameFrame }
TIdeDebuggerValueFormatterOrdinalToNameFrame = class(TFrame, ILazDbgIdeValueFormatterSettingsFrameIntf)
Label1: TLabel;
Memo1: TMemo;
private
protected
procedure ReadFrom(AFormatter: ILazDbgIdeValueFormatterIntf);
function WriteTo(AFormatter: ILazDbgIdeValueFormatterIntf): Boolean;
public
constructor Create(TheOwner: TComponent); override;
end;
{ TIdeDbgValueFormatterOrdinalToName }
TIdeDbgValueFormatterOrdinalToName = class( specialize TLazDbgIdeValueFormatterGeneric<TObject> )
private type
TNameMap = specialize TFPGMap<int64, AnsiString>;
private
FMapData: String;
FNameMap: TNameMap;
procedure SetMapData(AValue: String);
protected
procedure Init; override;
procedure Assign(AnOther: TObject); override;
public
destructor Destroy; override;
class function GetRegisteredDisplayName: String;
function FormatValue(AWatchValue: IWatchResultDataIntf;
ADisplayFormat: TWatchDisplayFormat;
AWatchResultPrinter: IWatchResultPrinter; out APrintedValue: String
): Boolean; override;
function FormatValue(aDBGType: TDBGType;
aValue: string;
ADisplayFormat: TWatchDisplayFormat;
out APrintedValue: String
): boolean; override;
function SupportedFeatures: TLazDbgIdeValFormatterFeatures; override;
// function SupportedDataKinds: TWatchResultDataKinds; override;
published
property MapData: String read FMapData write SetMapData;
end;
TIdeDbgValueFormatterRegistryOrdinalToName =
specialize TLazDbgIdeValueFormatterFrameRegistryEntryGeneric<TIdeDbgValueFormatterOrdinalToName, TIdeDebuggerValueFormatterOrdinalToNameFrame>;
implementation
{$R *.lfm}
{ TIdeDebuggerValueFormatterOrdinalToNameFrame }
procedure TIdeDebuggerValueFormatterOrdinalToNameFrame.ReadFrom(
AFormatter: ILazDbgIdeValueFormatterIntf);
var
df: TIdeDbgValueFormatterOrdinalToName;
begin
df := TIdeDbgValueFormatterOrdinalToName(AFormatter.GetObject);
Memo1.Text := df.MapData;
end;
function TIdeDebuggerValueFormatterOrdinalToNameFrame.WriteTo(
AFormatter: ILazDbgIdeValueFormatterIntf): Boolean;
var
df: TIdeDbgValueFormatterOrdinalToName;
begin
df := TIdeDbgValueFormatterOrdinalToName(AFormatter.GetObject);
Result := TrimRight(df.MapData) <> TrimRight(Memo1.Text);
df.MapData := TrimRight(Memo1.Text);
end;
constructor TIdeDebuggerValueFormatterOrdinalToNameFrame.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
Label1.Caption := 'Enter mappings "name=123;"';
end;
{ TIdeDbgValueFormatterOrdinalToName }
procedure TIdeDbgValueFormatterOrdinalToName.SetMapData(AValue: String);
var
p: PChar;
l, i: integer;
tk, tk2: String;
add, n: Int64;
function SkipSpaceAndComment: boolean;
begin
while (l > 0) do begin
while (l > 0) and ( (p^ = ' ') or (p^ = #9) ) do begin
inc(p);
dec(l);
end;
if (p^ = '/') and (p[1] = '/') then begin
while (l > 0) and (p^ <> #10) and (p^ <> #13) do begin
inc(p);
dec(l);
end;
exit(l>0);
end;
if (p^ = '{') then begin
while (l > 0) and (p^ <> '}') do begin
inc(p);
dec(l);
end;
if l > 0 then begin
inc(p);
dec(l);
end;
continue;
end;
if (p^ = '(') and (p[1] = '*') then begin
while (l > 0) and (p^ <> '*') and (p[1] <> ')') do begin
inc(p);
dec(l);
end;
if l > 0 then begin
inc(p);
dec(l);
end;
if l > 0 then begin
inc(p);
dec(l);
end;
continue;
end;
break;
end;
Result := l>0;
end;
function AtNewLine: boolean; inline;
begin
result := (l > 0) and ((p^ = #10) or (p^ = #13));
while (l > 0) and ((p^ = #10) or (p^ = #13)) do begin
inc(p);
dec(l);
end;
end;
function SkipToNextLine: boolean;
begin
repeat
if not SkipSpaceAndComment then
break;
while (l > 0) and
not ( (p^ in [' ', #9, #10, #13, '{']) or ( (p^ = '/') and (p[1] = '/') ) or ((p^ = '(') and (p[1] = '*')) )
do begin
inc(p);
dec(l);
end;
until (l=0) or AtNewLine;
Result := l>0;
end;
function AtEqual: boolean; inline;
begin
result := (l > 0) and (p^ = '=');
if result then begin
inc(p);
dec(l);
end;
end;
function GetIdent: string;
var
s: PChar;
begin
result := '';
if (l = 0) or not (p^ in ['a'..'z', 'A'..'Z', '_']) then
exit;
s := p;
while (l > 0) and (p^ in ['a'..'z', 'A'..'Z', '_', '0'..'9']) do begin
inc(p);
dec(l);
end;
SetString(Result, s, p-s);
end;
function GetNum(out ANum: Int64): boolean;
var
s: PChar;
t: string;
begin
result := False;
if (l > 0) and (p^ = '#') then begin
inc(p);
dec(l);
end;
s := p;
if (l > 0) and (p^ = '-') then begin
inc(p);
dec(l);
end;
if (l > 0) and (p^ in ['$', '%', '&']) then begin
inc(p);
dec(l);
end;
result := (l > 0) and (p^ in ['0'..'9', 'a'..'f', 'A'..'F']);
if not Result then
exit;
while (l > 0) and (p^ in ['0'..'9']) do begin
inc(p);
dec(l);
end;
SetString(t, s, p-s);
Result := TryStrToInt64(t, ANum);
end;
begin
if FMapData = AValue then Exit;
FMapData := AValue;
FNameMap.Clear;
p := PChar(FMapData);
l := Length(FMapData);
while l > 0 do begin
if not SkipSpaceAndComment then
break;
if AtNewLine then
continue;
tk := GetIdent;
if tk = '' then begin
SkipToNextLine;
continue;
end;
SkipSpaceAndComment;
if not AtEqual then begin
SkipToNextLine;
continue;
end;
SkipSpaceAndComment;
tk2 := GetIdent;
SkipSpaceAndComment;
add := 0;
if tk2 <> '' then begin
if (l > 0) and (P^ = '+') then begin
i := FNameMap.IndexOfData(tk2);
if i < 0 then begin
SkipToNextLine;
continue;
end;
add := FNameMap.Keys[i];
end
else
if (l = 0) or (P^ <> '(') then begin // not typecast
SkipToNextLine;
continue;
end;
inc(p);
dec(l);
if not SkipSpaceAndComment then
continue;
end;
if not GetNum(n) then begin
SkipToNextLine;
continue;
end;
n := n + add;
FNameMap.Add(n, tk);
SkipToNextLine;
end;
end;
procedure TIdeDbgValueFormatterOrdinalToName.Init;
begin
FNameMap := TNameMap.Create;
inherited Init;
end;
procedure TIdeDbgValueFormatterOrdinalToName.Assign(AnOther: TObject);
var
df: TIdeDbgValueFormatterOrdinalToName absolute AnOther;
begin
inherited Assign(AnOther);
if AnOther is TIdeDbgValueFormatterOrdinalToName then begin
MapData := df.FMapData;
end;
end;
destructor TIdeDbgValueFormatterOrdinalToName.Destroy;
begin
inherited Destroy;
FNameMap.Destroy;
end;
class function TIdeDbgValueFormatterOrdinalToName.GetRegisteredDisplayName: String;
begin
Result := dbgConvertOrdinalToName;
end;
function TIdeDbgValueFormatterOrdinalToName.FormatValue(AWatchValue: IWatchResultDataIntf;
ADisplayFormat: TWatchDisplayFormat; AWatchResultPrinter: IWatchResultPrinter; out
APrintedValue: String): Boolean;
var
c: Int64;
i: Integer;
begin
Result := (AWatchValue.ValueKind in [rdkSignedNumVal, rdkUnsignedNumVal]);
if not Result then
exit;
c := AWatchValue.AsInt64;
i := FNameMap.IndexOf(c);
if i < 0 then
APrintedValue := IntToStr(c)
else
APrintedValue := FNameMap[c];
end;
function TIdeDbgValueFormatterOrdinalToName.FormatValue(aDBGType: TDBGType; aValue: string;
ADisplayFormat: TWatchDisplayFormat; out APrintedValue: String): boolean;
var
c: int64;
i: Integer;
begin
Result := (aDBGType <> nil) and
(aDBGType.Kind in [skSimple, skInteger, skCardinal]);
if not Result then
exit;
if not TryStrToInt64(aValue, c) then
exit(False);
i := FNameMap.IndexOf(c);
if i < 0 then
APrintedValue := IntToStr(c)
else
APrintedValue := FNameMap[c];
end;
function TIdeDbgValueFormatterOrdinalToName.SupportedFeatures: TLazDbgIdeValFormatterFeatures;
begin
Result := [vffFormatValue, vffFormatOldValue, vffValueData];
end;
initialization
ValueFormatterRegistry.Add(TIdeDbgValueFormatterRegistryOrdinalToName);
end.

View File

@ -30,6 +30,10 @@ msgstr ""
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr ""
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -31,6 +31,10 @@ msgstr "اختر المجموعات الّتي تفعّل عند نقطة ايق
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "بعض المجموعات في قائمة تفعيل/تعطيل غير موجودة.%0:sعل يتم إنشاؤها؟%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -30,6 +30,10 @@ msgstr ""
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr ""
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -31,6 +31,10 @@ msgstr "Vybrat skupiny, které se mají povolit při dosáhnutí bodu přerušen
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "Některé skupiny v seznamu Povolené/Zakázané neexistují.%0:sMají se vytvořit?%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -31,6 +31,10 @@ msgstr "Gruppen auswählen zum Aktivieren bei Haltepunkt"
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "Einige Gruppen in der Aktivierungsliste existieren nicht.%0:sErzeugen?%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -31,6 +31,10 @@ msgstr "Seleccionar grupos para activar cuando salte punto de interrupción"
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "Algunos grupos en la lista Activar/Desactivar no existen.%0:s¿Crearlos?%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -31,6 +31,10 @@ msgstr "Valitse sallittavat ryhmät, kun keskeytyskohta aktivoituu"
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "Joitain Salli/Estä listan ryhmiä ei ole.%0:sLuodaanko ne?%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -31,6 +31,10 @@ msgstr "Sélectionner les groupes à activer dès le point d'arrêt atteint"
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "Certains groupes de la liste Activer/désactiver n'existent pas.%0:sFaut-il les créer ?%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -30,6 +30,10 @@ msgstr ""
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr ""
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -31,6 +31,10 @@ msgstr "Csoportok kijelölése, amelyek engedélyezve lesznek a töréspont elé
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "Néhány csoport az Engedélyezés/Letiltás listában nem létezik.%0:sLétre legyenek hozva?%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -30,6 +30,10 @@ msgstr ""
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr ""
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -31,6 +31,10 @@ msgstr "Gruppi da abilitare quando è raggiunto il breakpoint"
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "Alcuni gruppi nella lista Abilita/Disabilita non esistono.%0:sCrearli?%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -31,6 +31,10 @@ msgstr "ブレークポイントのヒットを有効にするグループを選
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "有効/無効リストのグループのいくつかが存在しません。%0:s作成しますか%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -31,6 +31,10 @@ msgstr "Pažymėti grupes, kurios aktyvinamos pasiekus stabdos tašką"
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "Aktyvinimo/pasyvinimo sąraše yra neegzistuojančių grupių.%0:sJas sukurti?%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -30,6 +30,10 @@ msgstr ""
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr ""
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -31,6 +31,10 @@ msgstr "Wybierz grupy do włączenia, gdy punkt przerwania zostanie osiągnięty
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr ""
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -27,6 +27,10 @@ msgstr ""
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr ""
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -38,6 +38,10 @@ msgstr "Selecionar grupos à habilitar quando o ponto de parada for atingido"
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "Alguns grupos na lista Habilitar/Desabilitar não existem.%0:sCriá-los?%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -37,6 +37,10 @@ msgstr "Выберите группы для включения при дост
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "Некоторые группы в списке включения/отключения не существуют.%0:sСоздать их?%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr "Больше не спрашивать"

View File

@ -37,6 +37,10 @@ msgstr ""
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr ""
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -37,6 +37,10 @@ msgstr "Kesme noktasına gelindiğinde etkinleştirilecek grupları seç"
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "Etkin/Devre dışı listesindeki bazı gruplar mevcut değil.%0:sOluşturulsun mu?%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -39,6 +39,10 @@ msgstr "Виберіть групи для ввімкнення при заді
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "Деякі групи в списку ввімкнення/вимкнення не існують.%0:sСтворити їх?%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""

View File

@ -38,6 +38,10 @@ msgstr "选择组来启用 当断点被命中时"
msgid "Some groups in the Enable/Disable list do not exist.%0:sCreate them?%0:s%0:s%1:s"
msgstr "一些组在启用/禁用列表中不存在。%0:s创建它们吗%0:s%0:s%1:s"
#: idedebuggerstringconstants.dbgconvertordinaltoname
msgid "Convert ordinal to name"
msgstr ""
#: idedebuggerstringconstants.dbgdonotshowthismessageagain
msgid "Do not ask again"
msgstr ""