<div dir="ltr">I miss the menu options to inspect and explore class variables.<div>This change makes it much harder to inspect values stored in class variables </div><div><br></div><div>Cheers,</div><div>Karl</div><div><br>
</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, May 3, 2011 at 1:36 AM, <span dir="ltr"><<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Chris Muller uploaded a new version of Tools to project The Trunk:<br>
<a href="http://source.squeak.org/trunk/Tools-cmm.347.mcz" target="_blank">http://source.squeak.org/trunk/Tools-cmm.347.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: Tools-cmm.347<br>
Author: cmm<br>
Time: 2 May 2011, 6:36:40.244 pm<br>
UUID: 977c180b-7c15-4200-9ceb-319d2e850364<br>
Ancestors: Tools-fbs.346, Tools-fbs.345<br>
<br>
- Update menu "inst var defs" to "assignments..." and "inst var refs" to "references...". Each option now includes a selection of the available class-variables, enabling "class var refs" to be removed. Each option also has an appropriate hot-key assignment.<br>
- Removed "class vars" because one could simply explore the class' classPool.<br>
<br>
=============== Diff against Tools-fbs.346 ===============<br>
<br>
Item was changed:<br>
----- Method: Browser>>classListMenu:shifted: (in category 'class functions') -----<br>
classListMenu: aMenu shifted: shifted<br>
"Set up the menu to apply to the receiver's class list, honoring the #shifted boolean"<br>
self<br>
menuHook: aMenu<br>
named: #classListMenu<br>
shifted: shifted.<br>
Preferences useOnlyServicesInMenu ifTrue:[^aMenu].<br>
shifted ifTrue:[^ self shiftedClassListMenu: aMenu].<br>
aMenu addList: #(<br>
-<br>
('browse full (b)' browseMethodFull)<br>
('browse hierarchy (h)' spawnHierarchy)<br>
('browse protocol (p)' browseFullProtocol)<br>
-<br>
('printOut' printOutClass)<br>
('fileOut' fileOutClass)<br>
-<br>
('show hierarchy' hierarchy)<br>
('show definition' editClass)<br>
('show comment' editComment)<br>
-<br>
+ ('references... (r)' browseVariableReferences)<br>
+ ('assignments... (a)' browseVariableAssignments)<br>
- ('inst var refs...' browseInstVarRefs)<br>
- ('inst var defs...' browseInstVarDefs)<br>
- -<br>
- ('class var refs...' browseClassVarRefs)<br>
- ('class vars' browseClassVariables)<br>
('class refs (N)' browseClassRefs)<br>
-<br>
('rename class ...' renameClass)<br>
('copy class' copyClass)<br>
('remove class (x)' removeClass)<br>
-<br>
('find method...' findMethod)<br>
-<br>
('more...' offerShiftedClassListMenu)).<br>
^ aMenu<br>
!<br>
<br>
Item was changed:<br>
----- Method: Browser>>messageListMenu:shifted: (in category 'message functions') -----<br>
messageListMenu: aMenu shifted: shifted<br>
"Answer the message-list menu"<br>
self<br>
menuHook: aMenu<br>
named: #messageListMenu<br>
shifted: shifted.<br>
Preferences useOnlyServicesInMenu ifTrue:[^aMenu].<br>
shifted ifTrue: [^ self shiftedMessageListMenu: aMenu].<br>
aMenu addList: #(<br>
('what to show...' offerWhatToShowMenu)<br>
('toggle break on entry' toggleBreakOnEntry)<br>
-<br>
('browse full (b)' browseMethodFull)<br>
('browse hierarchy (h)' classHierarchy)<br>
('browse method (O)' openSingleMessageBrowser)<br>
('browse protocol (p)' browseFullProtocol)<br>
-<br>
('fileOut' fileOutMessage)<br>
('printOut' printOutMessage)<br>
('copy selector (c)' copySelector)<br>
('copy reference' copyReference)<br>
-<br>
('senders of... (n)' browseSendersOfMessages)<br>
('implementors of... (m)' browseMessages)<br>
('inheritance (i)' methodHierarchy)<br>
('versions (v)' browseVersions)<br>
-<br>
+ ('references... (r)' browseVariableReferences)<br>
+ ('assignments... (a)' browseVariableAssignments)<br>
- ('inst var refs...' browseInstVarRefs)<br>
- ('inst var defs...' browseInstVarDefs)<br>
- ('class var refs...' browseClassVarRefs)<br>
- ('class variables' browseClassVariables)<br>
('class refs (N)' browseClassRefs)<br>
-<br>
('remove method (x)' removeMessage)<br>
('explore method' exploreMethod)<br>
('inspect method' inspectMethod)<br>
-<br>
('more...' shiftedYellowButtonActivity)).<br>
^ aMenu!<br>
<br>
Item was changed:<br>
----- Method: Browser>>reformulateList (in category 'message list') -----<br>
reformulateList<br>
"If the receiver has a way of reformulating its message list, here is a chance for it to do so"<br>
super reformulateList.<br>
(self messageList includes: self selectedMessageName)<br>
+ ifFalse: [ self messageList<br>
+ ifEmpty: [ self selectMessageNamed: nil ]<br>
+ ifNotEmpty: [ self selectMessageNamed: self lastMessageName ]].!<br>
- ifFalse: [ self selectMessageNamed: self lastMessageName ].!<br>
<br>
Item was changed:<br>
----- Method: ChangeSorter>>classListMenu:shifted: (in category 'class list') -----<br>
classListMenu: aMenu shifted: shifted<br>
"Fill aMenu with items appropriate for the class list"<br>
<br>
aMenu title: 'class list'.<br>
aMenu addStayUpItemSpecial.<br>
(parent notNil and: [shifted not])<br>
ifTrue: [aMenu addList: #( "These two only apply to dual change sorters"<br>
('copy class chgs to other side' copyClassToOther)<br>
('move class chgs to other side' moveClassToOther))].<br>
<br>
aMenu addList: (shifted<br>
ifFalse: [#(<br>
-<br>
('delete class from change set (d)' forgetClass)<br>
('remove class from system (x)' removeClass)<br>
-<br>
('browse full (b)' browseMethodFull)<br>
('browse hierarchy (h)' spawnHierarchy)<br>
('browse protocol (p)' browseFullProtocol)<br>
-<br>
('printOut' printOutClass)<br>
('fileOut' fileOutClass)<br>
-<br>
+ ('references... (r)' browseVariableReferences)<br>
+ ('assignments... (a)' browseVariableAssignments)<br>
- ('inst var refs...' browseInstVarRefs)<br>
- ('inst var defs...' browseInstVarDefs)<br>
- ('class var refs...' browseClassVarRefs)<br>
- ('class vars' browseClassVariables)<br>
('class refs (N)' browseClassRefs)<br>
-<br>
('more...' offerShiftedClassListMenu))]<br>
<br>
ifTrue: [#(<br>
-<br>
('unsent methods' browseUnusedMethods)<br>
('unreferenced inst vars' showUnreferencedInstVars)<br>
('unreferenced class vars' showUnreferencedClassVars)<br>
-<br>
('sample instance' makeSampleInstance)<br>
('inspect instances' inspectInstances)<br>
('inspect subinstances' inspectSubInstances)<br>
-<br>
('more...' offerUnshiftedClassListMenu ))]).<br>
^ aMenu!<br>
<br>
Item was changed:<br>
----- Method: CodeHolder>>abbreviatedWordingFor: (in category 'commands') -----<br>
abbreviatedWordingFor: aButtonSelector<br>
+ "Answer the abbreviated form of wording, from a static table. Answer nil if there is no entry -- in which case the long form will be used on the corresponding browser button."<br>
- "Answer the abbreviated form of wording, from a static table which you're welcome to edit. Answer nil if there is no entry -- in which case the long firm will be used on the corresponding browser button."<br>
<br>
#(<br>
(browseMethodFull 'browse')<br>
(browseSendersOfMessages 'senders')<br>
(browseMessages 'impl')<br>
(browseVersions 'vers')<br>
(methodHierarchy 'inher')<br>
(classHierarchy 'hier')<br>
+ (browseVariableReferences 'refs')<br>
- (browseInstVarRefs 'iVar')<br>
- (browseClassVarRefs 'cVar')<br>
(offerMenu 'menu')) do:<br>
<br>
[:pair | pair first == aButtonSelector ifTrue: [^ pair second]].<br>
^ nil!<br>
<br>
Item was changed:<br>
----- Method: CodeHolder>>messageListKey:from: (in category 'message list menu') -----<br>
messageListKey: aChar from: view<br>
"Respond to a Command key. I am a model with a code pane, and I also<br>
have a listView that has a list of methods. The view knows how to get<br>
the list and selection."<br>
<br>
| sel class |<br>
aChar == $D ifTrue: [^ self toggleDiffing].<br>
<br>
sel := self selectedMessageName.<br>
aChar == $m ifTrue: "These next two put up a type in if no message selected"<br>
[^ self useSelector: sel orGetSelectorAndSendQuery: #browseAllImplementorsOf: to: self ].<br>
aChar == $n ifTrue:<br>
[^ self useSelector: sel orGetSelectorAndSendQuery: #browseAllCallsOn: to: self ].<br>
<br>
"The following require a class selection"<br>
(class := self selectedClassOrMetaClass) ifNil: [^ self arrowKey: aChar from: view].<br>
aChar == $b ifTrue: [^ Browser fullOnClass: class selector: sel].<br>
aChar == $N ifTrue: [^ self browseClassRefs].<br>
aChar == $i ifTrue: [^ self methodHierarchy].<br>
aChar == $h ifTrue: [^ self classHierarchy].<br>
aChar == $p ifTrue: [^ self browseFullProtocol].<br>
+ aChar == $r ifTrue: [^ self browseVariableReferences].<br>
+ aChar == $a ifTrue: [^ self browseVariableAssignments].<br>
<br>
+<br>
"The following require a method selection"<br>
sel ifNotNil:<br>
[aChar == $o ifTrue: [^ self fileOutMessage].<br>
aChar == $c ifTrue: [^ self copySelector].<br>
aChar == $v ifTrue: [^ self browseVersions].<br>
aChar == $O ifTrue: [^ self openSingleMessageBrowser].<br>
aChar == $x ifTrue: [^ self removeMessage].<br>
aChar == $d ifTrue: [^ self removeMessageFromBrowser].<br>
<br>
(aChar == $C and: [self canShowMultipleMessageCategories])<br>
ifTrue: [^ self showHomeCategory]].<br>
<br>
^ self arrowKey: aChar from: view!<br>
<br>
Item was changed:<br>
----- Method: CodeHolder>>optionalButtonPairs (in category 'controls') -----<br>
optionalButtonPairs<br>
"Answer a tuple (formerly pairs) defining buttons, in the format:<br>
button label<br>
selector to send<br>
help message"<br>
<br>
| aList |<br>
<br>
aList := #(<br>
('browse' browseMethodFull 'view this method in a browser')<br>
('senders' browseSendersOfMessages 'browse senders of...')<br>
('implementors' browseMessages 'browse implementors of...')<br>
('versions' browseVersions 'browse versions')),<br>
<br>
(Preferences decorateBrowserButtons<br>
ifTrue:<br>
[{#('inheritance' methodHierarchy 'browse method inheritance<br>
green: sends to super<br>
tan: has override(s)<br>
mauve: both of the above<br>
pink: is an override but doesn''t call super<br>
pinkish tan: has override(s), also is an override but doesn''t call super' )}]<br>
ifFalse:<br>
[{#('inheritance' methodHierarchy 'browse method inheritance')}]),<br>
<br>
#(<br>
('hierarchy' classHierarchy 'browse class hierarchy')<br>
+ ('vars' browseVariableReferences 'references...')).<br>
- ('inst vars' browseInstVarRefs 'inst var refs...')<br>
- ('class vars' browseClassVarRefs 'class var refs...')).<br>
<br>
^ aList!<br>
<br>
Item was added:<br>
+ ----- Method: CodeHolder>>receiverClass (in category 'toolbuilder') -----<br>
+ receiverClass<br>
+ ^ self selectedClassOrMetaClass !<br>
<br>
Item was added:<br>
+ ----- Method: Debugger>>classHierarchy (in category 'toolbuilder') -----<br>
+ classHierarchy<br>
+ "Create and schedule a class list browser on the receiver's hierarchy."<br>
+ (self selectedMessageName = #doesNotUnderstand: and: [ self selectedClassOrMetaClass = Object ])<br>
+ ifTrue:<br>
+ [ self systemNavigation<br>
+ spawnHierarchyForClass: self receiverClass<br>
+ selector: self selectedMessageName ]<br>
+ ifFalse: [ super classHierarchy ]!<br>
<br>
Item was changed:<br>
----- Method: Debugger>>contextStackMenu:shifted: (in category 'context stack menu') -----<br>
contextStackMenu: aMenu shifted: shifted<br>
"Set up the menu appropriately for the context-stack-list, either shifted or unshifted as per the parameter provided"<br>
<br>
^ shifted ifFalse:[<br>
aMenu addList: {<br>
{'fullStack (f)'. #fullStack}.<br>
{'restart (r)'. #restart}.<br>
{'proceed (p)'. #proceed}.<br>
{'step (t)'. #doStep}.<br>
{'step through (T)'. #stepIntoBlock}.<br>
{'send (e)'. #send}.<br>
{'where (w)'. #where}.<br>
{'peel to first like this'. #peelToFirst}.<br>
#-.<br>
{'return entered value'. #returnValue}.<br>
#-.<br>
{'toggle break on entry'. #toggleBreakOnEntry}.<br>
{'senders of... (n)'. #browseSendersOfMessages}.<br>
{'implementors of... (m)'. #browseMessages}.<br>
{'inheritance (i)'. #methodHierarchy}.<br>
#-.<br>
{'versions (v)'. #browseVersions}.<br>
- {'inst var refs...'. #browseInstVarRefs}.<br>
#-.<br>
+ {'references... (r)'. #browseVariableReferences}.<br>
+ {'assignments... (a)'. #browseVariableAssignments}.<br>
- {'inst var defs...'. #browseInstVarDefs}.<br>
- {'class var refs...'. #browseClassVarRefs}.<br>
- {'class variables'. #browseClassVariables}.<br>
#-.<br>
{'class refs (N)'. #browseClassRefs}.<br>
{'browse full (b)'. #browseMethodFull}.<br>
{'file out '. #fileOutMessage}.<br>
#-.<br>
{'mail out bug report'. #mailOutBugReport}.<br>
{'more...'. #shiftedYellowButtonActivity}.<br>
}.<br>
] ifTrue: [<br>
aMenu addList: {<br>
{'browse class hierarchy'. #classHierarchy}.<br>
{'browse class'. #browseClass}.<br>
{'browse method (O)'. #openSingleMessageBrowser}.<br>
{'implementors of sent messages'. #browseAllMessages}.<br>
{'change sets with this method'. #findMethodInChangeSets}.<br>
#-.<br>
{'inspect instances'. #inspectInstances}.<br>
{'inspect subinstances'. #inspectSubInstances}.<br>
#-.<br>
{'revert to previous version'. #revertToPreviousVersion}.<br>
{'remove from current change set'. #removeFromCurrentChanges}.<br>
{'revert & remove from changes'. #revertAndForget}.<br>
#-.<br>
{'more...'. #unshiftedYellowButtonActivity}.<br>
}<br>
].!<br>
<br>
Item was added:<br>
+ ----- Method: Debugger>>receiverClass (in category 'toolbuilder') -----<br>
+ receiverClass<br>
+ ^ self selectedContext receiver class!<br>
<br>
Item was removed:<br>
- ----- Method: Inspector>>classVarRefs (in category 'menu commands') -----<br>
- classVarRefs<br>
- "Request a browser of methods that store into a chosen instance variable"<br>
-<br>
- | aClass |<br>
- (aClass := self classOfSelection) ifNotNil:<br>
- [self systemNavigation browseClassVarRefs: aClass].<br>
- !<br>
<br>
Item was changed:<br>
----- Method: Inspector>>fieldListMenu: (in category 'menu commands') -----<br>
fieldListMenu: aMenu<br>
"Arm the supplied menu with items for the field-list of the receiver"<br>
<br>
aMenu addStayUpItemSpecial.<br>
<br>
aMenu addList: #(<br>
('inspect (i)' inspectSelection)<br>
('explore (I)' exploreSelection)).<br>
<br>
self addCollectionItemsTo: aMenu.<br>
<br>
aMenu addList: #(<br>
-<br>
('method refs to this inst var' referencesToSelection)<br>
('methods storing into this inst var' defsOfSelection)<br>
('objects pointing to this value' objectReferencesToSelection)<br>
('chase pointers' chasePointers)<br>
('explore pointers' explorePointers)<br>
-<br>
('browse full (b)' browseMethodFull)<br>
('browse class' browseClass)<br>
('browse hierarchy (h)' classHierarchy)<br>
('browse protocol (p)' browseFullProtocol)<br>
-<br>
+ ('references... (r)' browseVariableReferences)<br>
+ ('assignments... (a)' browseVariableAssignments)<br>
- ('inst var refs...' browseInstVarRefs)<br>
- ('inst var defs...' browseInstVarDefs)<br>
- ('class var refs...' classVarRefs)<br>
- ('class variables' browseClassVariables)<br>
('class refs (N)' browseClassRefs)<br>
-<br>
('copy name (c)' copyName)<br>
('basic inspect' inspectBasic)).<br>
<br>
Smalltalk isMorphic ifTrue:<br>
[aMenu addList: #(<br>
-<br>
('tile for this value (t)' tearOffTile)<br>
('viewer for this value (v)' viewerForValue))].<br>
<br>
^ aMenu<br>
<br>
<br>
" -<br>
('alias for this value' aliasForValue)<br>
('watcher for this slot' watcherForSlot)"<br>
<br>
!<br>
<br>
Item was changed:<br>
----- Method: RecentMessageSet>>messageListMenu:shifted: (in category 'message functions') -----<br>
messageListMenu: aMenu shifted: shifted<br>
"Answer the message-list menu"<br>
<br>
shifted ifTrue: [^ self shiftedMessageListMenu: aMenu].<br>
aMenu addList:#(<br>
('what to show...' offerWhatToShowMenu)<br>
-<br>
('browse full (b)' browseMethodFull)<br>
('browse hierarchy (h)' classHierarchy)<br>
('browse method (O)' openSingleMessageBrowser)<br>
('browse protocol (p)' browseFullProtocol)<br>
-<br>
('fileOut (o)' fileOutMessage)<br>
('printOut' printOutMessage)<br>
('copy selector (c)' copySelector)<br>
('copy reference' copyReference)<br>
-<br>
('senders of... (n)' browseSendersOfMessages)<br>
('implementors of... (m)' browseMessages)<br>
('inheritance (i)' methodHierarchy)<br>
('versions (v)' browseVersions)<br>
-<br>
+ ('references... (r)' browseVariableReferences)<br>
+ ('assignments... (a)' browseVariableAssignments)<br>
- ('inst var refs...' browseInstVarRefs)<br>
- ('inst var defs...' browseInstVarDefs)<br>
- ('class var refs...' browseClassVarRefs)<br>
- ('class variables' browseClassVariables)<br>
('class refs (N)' browseClassRefs)<br>
-<br>
('remove method (x)' removeMessage)<br>
('remove from RecentSubmissions' removeFromRecentSubmissions)<br>
-<br>
('more...' shiftedYellowButtonActivity)).<br>
^ aMenu!<br>
<br>
Item was removed:<br>
- ----- Method: StringHolder>>browseClassVarRefs (in category '*Tools-traits') -----<br>
- browseClassVarRefs<br>
- "1/17/96 sw: devolve responsibility to the class, so that the code that does the real work can be shared"<br>
-<br>
- | cls |<br>
- cls := self selectedClass.<br>
- (cls notNil and: [cls isTrait not])<br>
- ifTrue: [self systemNavigation browseClassVarRefs: cls]!<br>
<br>
Item was removed:<br>
- ----- Method: StringHolder>>browseClassVariables (in category '*Tools-traits') -----<br>
- browseClassVariables<br>
- "Browse the class variables of the selected class. 2/5/96 sw"<br>
- | cls |<br>
- cls := self selectedClass.<br>
- (cls notNil and: [cls isTrait not])<br>
- ifTrue: [self systemNavigation browseClassVariables: cls]<br>
- !<br>
<br>
Item was removed:<br>
- ----- Method: StringHolder>>browseInstVarDefs (in category '*Tools-traits') -----<br>
- browseInstVarDefs<br>
-<br>
- | cls |<br>
- cls := self selectedClassOrMetaClass.<br>
- (cls notNil and: [cls isTrait not])<br>
- ifTrue: [self systemNavigation browseInstVarDefs: cls]!<br>
<br>
Item was removed:<br>
- ----- Method: StringHolder>>browseInstVarRefs (in category '*Tools-traits') -----<br>
- browseInstVarRefs<br>
- "1/26/96 sw: real work moved to class, so it can be shared"<br>
- | cls |<br>
- cls := self selectedClassOrMetaClass.<br>
- (cls notNil and: [cls isTrait not])<br>
- ifTrue: [self systemNavigation browseInstVarRefs: cls]!<br>
<br>
Item was added:<br>
+ ----- Method: StringHolder>>browseVariableAssignments (in category '*Tools-traits') -----<br>
+ browseVariableAssignments<br>
+ | cls |<br>
+ cls := self selectedClassOrMetaClass.<br>
+ (cls notNil and: [ cls isTrait not ]) ifTrue: [ self systemNavigation browseVariableAssignments: cls ]!<br>
<br>
Item was added:<br>
+ ----- Method: StringHolder>>browseVariableReferences (in category '*Tools-traits') -----<br>
+ browseVariableReferences<br>
+ | cls |<br>
+ cls := self selectedClassOrMetaClass.<br>
+ (cls notNil and: [cls isTrait not])<br>
+ ifTrue: [self systemNavigation browseVariableReferences: cls]!<br>
<br>
Item was changed:<br>
----- Method: StringHolder>>classListKey:from: (in category '*Tools') -----<br>
classListKey: aChar from: view<br>
"Respond to a Command key. I am a model with a list of classes and a<br>
code pane, and I also have a listView that has a list of methods. The<br>
view knows how to get the list and selection."<br>
<br>
aChar == $f ifTrue: [^ self findMethod].<br>
+ aChar == $r ifTrue: [^ self browseVariableReferences].<br>
+ aChar == $a ifTrue: [^ self browseVariableAssignments].<br>
- aChar == $r ifTrue: [^ self browseInstVarRefs].<br>
- aChar == $d ifTrue: [^ self browseInstVarDefs].<br>
aChar == $h ifTrue: [^ self spawnHierarchy].<br>
aChar == $x ifTrue: [^ self removeClass].<br>
^ self messageListKey: aChar from: view!<br>
<br>
<br>
</blockquote></div><br></div>