mirror of https://gitlab.com/basile.b/dexed.git
test local identifier renaming (DCD#324)
This commit is contained in:
parent
32d4521e3f
commit
989effb422
|
|
@ -14,6 +14,7 @@ uses
|
|||
|
||||
type
|
||||
|
||||
TIntOpenArray = array of integer;
|
||||
|
||||
(**
|
||||
* Wrap the dcd-server and dcd-client processes.
|
||||
|
|
@ -64,6 +65,7 @@ type
|
|||
procedure getCallTip(out tips: string);
|
||||
procedure getDdocFromCursor(out aComment: string);
|
||||
procedure getDeclFromCursor(out aFilename: string; out aPosition: Integer);
|
||||
procedure getLocalSymbolUsageFromCursor(var locs: TIntOpenArray);
|
||||
//
|
||||
property available: boolean read fAvailable;
|
||||
end;
|
||||
|
|
@ -540,6 +542,40 @@ begin
|
|||
aPosition := strToIntDef(loc, -1);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCEDcdWrapper.getLocalSymbolUsageFromCursor(var locs: TIntOpenArray);
|
||||
var
|
||||
i: Integer;
|
||||
str: string;
|
||||
begin
|
||||
if not fAvailable then exit;
|
||||
if not fServerListening then exit;
|
||||
if fDoc = nil then exit;
|
||||
//
|
||||
terminateClient;
|
||||
//
|
||||
fClient.Parameters.Clear;
|
||||
fClient.Parameters.Add('-u');
|
||||
fClient.Parameters.Add('-c');
|
||||
fClient.Parameters.Add(intToStr(fDoc.SelStart - 1));
|
||||
fClient.Execute;
|
||||
writeSourceToInput;
|
||||
//
|
||||
setLength(locs, 0);
|
||||
fTempLines.LoadFromStream(fClient.Output);
|
||||
if fTempLines.Count < 2 then
|
||||
exit;
|
||||
str := fTempLines[0];
|
||||
// symbol is not in current module, too complex for now
|
||||
if str.length < 6 then
|
||||
exit;
|
||||
if str[1..5] <> 'stdin' then
|
||||
exit;
|
||||
//
|
||||
setLength(locs, fTempLines.count-1);
|
||||
for i:= 1 to fTempLines.count-1 do
|
||||
locs[i-1] := StrToIntDef(fTempLines[i], -1);
|
||||
end;
|
||||
{$ENDREGION}
|
||||
|
||||
initialization
|
||||
|
|
|
|||
|
|
@ -97,17 +97,21 @@ inherited CEEditorWidget: TCEEditorWidget
|
|||
object MenuItem7: TMenuItem
|
||||
Caption = '-'
|
||||
end
|
||||
object mneEdComm: TMenuItem
|
||||
object mnuedComm: TMenuItem
|
||||
Caption = 'Comment'
|
||||
OnClick = mneEdCommClick
|
||||
OnClick = mnuedCommClick
|
||||
end
|
||||
object mnEdInvAllNone: TMenuItem
|
||||
object mnuedInvAllNone: TMenuItem
|
||||
Caption = 'Invert version all none'
|
||||
OnClick = mnEdInvAllNoneClick
|
||||
OnClick = mnuedInvAllNoneClick
|
||||
end
|
||||
object MenuItem1: TMenuItem
|
||||
Caption = '-'
|
||||
end
|
||||
object mnuedRename: TMenuItem
|
||||
Caption = 'Rename identifier'
|
||||
OnClick = mnuedRenameClick
|
||||
end
|
||||
object mnuedJum2Decl: TMenuItem
|
||||
Caption = 'Jump to declaration'
|
||||
OnClick = mnuedJum2DeclClick
|
||||
|
|
|
|||
|
|
@ -20,8 +20,9 @@ type
|
|||
MenuItem2: TMenuItem;
|
||||
MenuItem3: TMenuItem;
|
||||
MenuItem5: TMenuItem;
|
||||
mnEdInvAllNone: TMenuItem;
|
||||
mneEdComm: TMenuItem;
|
||||
mnuedRename: TMenuItem;
|
||||
mnuedInvAllNone: TMenuItem;
|
||||
mnuedComm: TMenuItem;
|
||||
mnuedPrev: TMenuItem;
|
||||
mnuedNext: TMenuItem;
|
||||
mnuedCallTip: TMenuItem;
|
||||
|
|
@ -38,8 +39,9 @@ type
|
|||
editorStatus: TStatusBar;
|
||||
mnuEditor: TPopupMenu;
|
||||
procedure MenuItem5Click(Sender: TObject);
|
||||
procedure mnEdInvAllNoneClick(Sender: TObject);
|
||||
procedure mneEdCommClick(Sender: TObject);
|
||||
procedure mnuedRenameClick(Sender: TObject);
|
||||
procedure mnuedInvAllNoneClick(Sender: TObject);
|
||||
procedure mnuedCommClick(Sender: TObject);
|
||||
procedure mnuedPrevClick(Sender: TObject);
|
||||
procedure mnuedNextClick(Sender: TObject);
|
||||
procedure mnuedCallTipClick(Sender: TObject);
|
||||
|
|
@ -141,6 +143,7 @@ begin
|
|||
AssignPng(mnuedCopy.Bitmap, 'copy');
|
||||
AssignPng(mnuedNext.Bitmap, 'go_next');
|
||||
AssignPng(mnuedPrev.Bitmap, 'go_previous');
|
||||
AssignPng(mnuedRename.Bitmap, 'pencil');
|
||||
//
|
||||
EntitiesConnector.addObserver(self);
|
||||
EntitiesConnector.addSingleService(self);
|
||||
|
|
@ -577,7 +580,7 @@ begin
|
|||
fDoc.showCallTips;
|
||||
end;
|
||||
|
||||
procedure TCEEditorWidget.mneEdCommClick(Sender: TObject);
|
||||
procedure TCEEditorWidget.mnuedCommClick(Sender: TObject);
|
||||
begin
|
||||
if fDoc.isNotNil then
|
||||
fDoc.CommandProcessor(ecCommentSelection, '', nil);
|
||||
|
|
@ -595,7 +598,7 @@ begin
|
|||
fDoc.CommandProcessor(ecNextLocation, '', nil);
|
||||
end;
|
||||
|
||||
procedure TCEEditorWidget.mnEdInvAllNoneClick(Sender: TObject);
|
||||
procedure TCEEditorWidget.mnuedInvAllNoneClick(Sender: TObject);
|
||||
begin
|
||||
if fDoc.isNotNil then
|
||||
fDoc.CommandProcessor(ecSwapVersionAllNone, '', nil);
|
||||
|
|
@ -619,6 +622,12 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
procedure TCEEditorWidget.mnuedRenameClick(Sender: TObject);
|
||||
begin
|
||||
if fDoc.isNotNil then
|
||||
fDoc.CommandProcessor(ecRenameIdentifier, '', nil);
|
||||
end;
|
||||
|
||||
procedure TCEEditorWidget.mnuedCutClick(Sender: TObject);
|
||||
begin
|
||||
if fDoc.isNotNil then
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ uses
|
|||
Classes, SysUtils, controls,lcltype, Forms, graphics, ExtCtrls, crc,
|
||||
SynEdit, SynPluginSyncroEdit, SynCompletion, SynEditKeyCmds, LazSynEditText,
|
||||
SynHighlighterLFM, SynEditHighlighter, SynEditMouseCmds, SynEditFoldedView,
|
||||
SynEditMarks, SynEditTypes, SynHighlighterJScript,
|
||||
SynEditMarks, SynEditTypes, SynHighlighterJScript, dialogs,
|
||||
ce_common, ce_observer, ce_writableComponent, ce_d2syn, ce_txtsyn, ce_dialogs,
|
||||
ce_sharedres, ce_dlang;
|
||||
|
||||
|
|
@ -195,6 +195,7 @@ type
|
|||
procedure save;
|
||||
procedure saveTempFile;
|
||||
//
|
||||
procedure renameIdentifier;
|
||||
procedure invertVersionAllNone;
|
||||
procedure showCallTips(findOpenParen: boolean = true);
|
||||
procedure hideCallTips;
|
||||
|
|
@ -245,6 +246,7 @@ const
|
|||
ecCurlyBraceClose = ecUserFirst + 9;
|
||||
ecCommentSelection = ecUserFirst + 10;
|
||||
ecSwapVersionAllNone = ecUserFirst + 11;
|
||||
ecRenameIdentifier = ecUserFirst + 12;
|
||||
|
||||
var
|
||||
D2Syn: TSynD2Syn; // used as model to set the options when no editor exists.
|
||||
|
|
@ -732,6 +734,7 @@ begin
|
|||
AddKey(ecCurlyBraceClose, 0, [], 0, []);
|
||||
AddKey(ecCommentSelection, ord('/'), [ssCtrl], 0, []);
|
||||
AddKey(ecSwapVersionAllNone, 0, [], 0, []);
|
||||
AddKey(ecRenameIdentifier, VK_F2, [ssCtrl], 0, []);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
|
@ -749,6 +752,7 @@ begin
|
|||
'ecCurlyBraceClose': begin Int := ecCurlyBraceClose; exit(true); end;
|
||||
'ecCommentSelection': begin Int := ecCommentSelection; exit(true); end;
|
||||
'ecSwapVersionAllNone': begin Int := ecSwapVersionAllNone; exit(true); end;
|
||||
'ecRenameIdentifier': begin Int := ecRenameIdentifier; exit(true); end;
|
||||
else exit(false);
|
||||
end;
|
||||
end;
|
||||
|
|
@ -767,6 +771,7 @@ begin
|
|||
ecCurlyBraceClose: begin Ident := 'ecCurlyBraceClose'; exit(true); end;
|
||||
ecCommentSelection: begin Ident := 'ecCommentSelection'; exit(true); end;
|
||||
ecSwapVersionAllNone: begin Ident := 'ecSwapVersionAllNone'; exit(true); end;
|
||||
ecRenameIdentifier: begin Ident := 'ecRenameIdentifier'; exit(true); end;
|
||||
else exit(false);
|
||||
end;
|
||||
end;
|
||||
|
|
@ -936,6 +941,8 @@ begin
|
|||
commentSelection(self);
|
||||
ecSwapVersionAllNone:
|
||||
invertVersionAllNone;
|
||||
ecRenameIdentifier:
|
||||
renameIdentifier;
|
||||
end;
|
||||
if fOverrideColMode and not SelAvail then
|
||||
begin
|
||||
|
|
@ -1004,6 +1011,43 @@ begin
|
|||
end;
|
||||
CaretXY := cp;
|
||||
end;
|
||||
|
||||
procedure TCESynMemo.renameIdentifier;
|
||||
var
|
||||
locs: TIntOpenArray = nil;
|
||||
old, idt: string;
|
||||
i, j, loc: integer;
|
||||
c: char;
|
||||
begin
|
||||
if not DcdWrapper.available then
|
||||
exit;
|
||||
old := GetWordAtRowCol(LogicalCaretXY);
|
||||
DcdWrapper.getLocalSymbolUsageFromCursor(locs);
|
||||
if length(locs) = 0 then
|
||||
begin
|
||||
dlgOkInfo('Unknown, ambiguous or non-local symbol for "'+ old +'"');
|
||||
exit;
|
||||
end;
|
||||
//
|
||||
idt := 'new identifier for "' + old + '"';
|
||||
idt := InputBox('Local identifier renaming', idt, '');
|
||||
if idt.isEmpty or idt.isBlank then
|
||||
exit;
|
||||
//
|
||||
for i:= high(locs) downto 0 do
|
||||
begin
|
||||
loc := locs[i];
|
||||
if loc = -1 then
|
||||
continue;
|
||||
BeginUndoBlock;
|
||||
SelStart := loc + 1;
|
||||
for j in [0..old.length-1] do
|
||||
ExecuteCommand(ecDeleteChar, '', nil);
|
||||
for c in idt do
|
||||
ExecuteCommand(ecChar, c, nil);
|
||||
EndUndoBlock;
|
||||
end;
|
||||
end;
|
||||
{$ENDREGION}
|
||||
|
||||
{$REGION DDoc & CallTip --------------------------------------------------------}
|
||||
|
|
|
|||
Loading…
Reference in New Issue