From 989effb4228e1cdc70c292eb0a805193a7b4bbff Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Tue, 26 Apr 2016 03:23:17 +0200 Subject: [PATCH] test local identifier renaming (DCD#324) --- src/ce_dcd.pas | 36 ++++++++++++++++++++++++++++++++++++ src/ce_editor.lfm | 12 ++++++++---- src/ce_editor.pas | 21 +++++++++++++++------ src/ce_synmemo.pas | 46 +++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 104 insertions(+), 11 deletions(-) diff --git a/src/ce_dcd.pas b/src/ce_dcd.pas index 4a41a1d7..a0aad393 100644 --- a/src/ce_dcd.pas +++ b/src/ce_dcd.pas @@ -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 diff --git a/src/ce_editor.lfm b/src/ce_editor.lfm index 3cceaa24..15f7397b 100644 --- a/src/ce_editor.lfm +++ b/src/ce_editor.lfm @@ -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 diff --git a/src/ce_editor.pas b/src/ce_editor.pas index 00641d88..2b6b6438 100644 --- a/src/ce_editor.pas +++ b/src/ce_editor.pas @@ -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 diff --git a/src/ce_synmemo.pas b/src/ce_synmemo.pas index eba8f6bc..20e94cf4 100644 --- a/src/ce_synmemo.pas +++ b/src/ce_synmemo.pas @@ -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 --------------------------------------------------------}