test local identifier renaming (DCD#324)

This commit is contained in:
Basile Burg 2016-04-26 03:23:17 +02:00
parent 32d4521e3f
commit 989effb422
4 changed files with 104 additions and 11 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 --------------------------------------------------------}