Мне удобно делать extract method прямо в дебагере. Опять же не надо в браузер перходить и метод искать. Сейчас я могу в дебагере выделить код и в popup меню указать extract method. Будет выполнен рефакторинг а текущий метод (из которого был вызван extract method) будет перезапущен. Вот что я сделал чтобы этот рефакторинг работал в дебагере.
Debugger>>extractMethod
| start stop |
start := (self widgetAt: #text) startBlock stringIndex.
stop := (self widgetAt: #text) stopBlock stringIndex - 1.
[(Refactory.Browser.ExtractMethodRefactoring
extract: (start to: stop)
from: self currentContext selector
in: self currentContext receiver class) execute]
on: Refactory.Browser.RefactoringError
do:
[:ex |
Dialog warn: ex messageText.
^self].
self restartCurrentMethod
Debugger>>restartCurrentMethod
self resetContext: self currentContext sender.
self send.
self restart
Теперь чтобы появилось в меню:
FullSystemBrowser>>textMenu
...
"я расширил меню"
addPart:
(MenuBuilder new
add: 'ExtractMethod' -> #extractMethod;
menu);
...
----------------------------------------------------------
(Евгений Бесчастнов) А ты какую реализацию St используешь? А то что-то у меня в VW7.2.1 ничего не получилось добавить. Т.е. методы-то я, естественно, добавил/изменил нормально, а вот результата нет. Хотя структура классов/методов очень похожа на правильную - есть Debugger, есть FullSystemBrowser?, в последнем есть textMenu с похожими посыланиями сообщений addPart:. Может, надо какую-то дополнительную инициализацию чего-нибудь сделать, чтобы меню обновилось (хотя с чего бы)? А что самое интересное, при попытке добавить Add Instance Variable в меню (как описано в соседней статье) я обнаружил, что меню, описанное в DebugContextsBrowserHelper class>>baseListMenu совершенно не совпадает ни с одним меню в дебаггере. Может, я не тем дебаггером пользуюсь? Так вроде стандартным, который можно вызвать при выскакивании исключения, либо через "Debug It". (Евгений Бесчастнов) Ага, разобрался в чем дело. В VW всё надо делать несколько по другому :-). Вот мой вариант:
DebuggerClient class>>refactoringsMenu
"Tools.MenuEditor new openOnClass: self andSelector: #refactoringsMenu"
<resource: #menu>
^#(#{UI.Menu} #(
#(#{UI.MenuItem}
#rawLabel: 'Extract Method'
#nameKey: #extractMethod
#value: #extractMethod )
#(#{UI.MenuItem}
#rawLabel: 'Add instance variable'
#nameKey: #addInstanceVariable
#value: #addInstanceVariable ) ) #(2 ) nil ) decodeAsLiteralArray
DebuggerClient>>textMenu
...
"я расширил меню"
addPart: self class refactoringsMenu;
...
DebuggerClient>>extractMethod
| start stop |
start := (self widgetAt: #text) startBlock stringIndex.
stop := (self widgetAt: #text) stopBlock stringIndex - 1.
[(Refactory.Browser.ExtractMethodRefactoring
extract: (start to: stop)
from: service context selector
in: service context receiver class) execute]
on: Refactory.Browser.RefactoringError
do:
[:ex |
Dialog warn: ex messageText.
^self].
self reenter
DebuggerClient>>addInstanceVariable
| varName |
varName := Dialog request: 'Enter instance variable name:'.
varName isNil | (varName = '') ifTrue: [^self].
(Refactory.Browser.AddInstanceVariableRefactoring variable: varName
class: service context receiver class) execute.
self reenter
А вообще хотелось бы как-нибудь добавить редактору в Debugger'е все возможности редактора в SystemBrowser?'е.