[ENH] Method Finder with matching classes marked
Doug Way
dway at mat.net
Sun Apr 30 17:26:56 UTC 2000
Sigh. The changeset I sent last time was missing a method
"markMatchingClasses" (the most important one).
This changeset should actually work.
- Doug Way
EAI/Transom Technologies, Ann Arbor, MI
http://www.transom.com
dway at mat.net, @eai.com
On Wed, 26 Apr 2000, Doug Way wrote:
>
> On Tue, 18 Apr 2000, Michael_Chean wrote:
>
> > > Perhaps the original poster _did_ try "reverse<Cmd-Shift-W>" and was
> > > confused by the fact that "FlippyArray2" does contain a 'reverse' method,
> > > as do quite a number of classes, sometimes meaning "reverse order" and
> > > sometimes meaning "opposite colour".
> >
> > Yep, actually this is what happened. It was more confusing in that I
> > was looking for something to do with the class String - so from my
> > beginners point of view the reversed in OrderedCollection wasn't an
> > immediate match. Thank goodness that the OrederedCollection actually
> > had an example of reversed which clued me into the similiarity.
> > Otherwise the Newbie must try to decipher from the description or code
> > what is going on.
>
> Here is an enhancement to the Method Finder which will hopefully help to
> narrow down the appropriate class in these situations. (I realize that
> you were not using Method Finder here, but if you were, this might have
> helped.)
>
> This is an enhancement to the "example mode" of the Method Finder. When
> an example is given, and one of the found methods is selected from the
> list, the classes in the class list which match the class (or are a
> superclass) of the receiver will be specially marked with an asterisk.
>
> For example, if the example 'abcd'. 'dcba' is given in the top pane,
> the method 'reversed' will appear in the method list. When 'reversed' is
> selected, eight classes will appear in the class list, but now
> SequenceableCollection>>reversed will be asterisked, since that is the
> class/method that is actually being used in this example. (because String
> is a subclass of SequenceableCollection) Generally, the asterisked class
> is really the one we're looking for... the other seven classes are
> basically irrelevant to the example, although it's useful to at least
> leave them in the list.
>
> The asterisk appears before the class/method name, so the asterisked
> classes end up being moved to the top of the list, since they're sorted
> alphabetically. I think this is handy, anyway. (My original plan was to
> make the matching classes appear in bold instead of using an asterisk, but
> that looked like it would be a lot harder to implement.)
>
> Here are some other fun examples to try when testing this enhancement:
>
> 'abc'. 'ab'. true
> 'abcd'. $c. 3
> 1. 2. true
> #(10 20 30 40). 20. 50. #(10 50 30 40)
> #(1 2 3) asOrderedCollection. 4. 4
> Date. Date today
>
> Of course, no classes will be asterisked if you use the "selector
> fragment" mode. I didn't try to implement it for the "multi-example" mode
> which appears in MethodFinder>>methodFor:, either.
>
> Also, I suppose it might be best to only asterisk the "nearest" superclass
> and not all superclasses, so that only one class would ever be asterisked.
> But that looked a little bit hairy to implement, so I kept it simple for
> now.
>
> The attached changeset just makes a couple of changes to
> SelectorBrowser... mainly, SelectorBrowser>>markMatchingClasses was added,
> plus selectedClass was tweaked to handle parsing the extra asterisk.
>
> (I guess I just missed the last batch of updates for 2.8, if this
> enhancement is deemed worthy of inclusion... keep it in mind the next time
> around. :-) )
>
> Regarding the Method Finder, it is true that not very many newbies think
> to try the Method Finder... it definitely needs to appear in more Squeak
> tutorials. (Naturally, it isn't going to be in the old Smalltalk books,
> since it's a new thing.) Also, I think the explanatory text in the lower
> pane could be improved... the part about the example mode should give a
> couple of typical scenarios, like a mini-tutorial... I remember I missed
> the point the first time I read through it. Maybe I'll submit something.
>
> - Doug Way
> EAI/Transom Technologies, Ann Arbor, MI
> http://www.transom.com
> dway at mat.net, @eai.com
>
-------------- next part --------------
'From Squeak2.8alpha of 13 January 2000 [latest update: #1974] on 29 April 2000 at 1:04:24 pm'!
"Change Set: MarkedMethodFinder-dew
Date: 19 April 2000
Author: Doug Way
An enhancement to the SelectorBrowser (method finder). When entering an example (e.g. '3. 4. 7'), and then clicking on a method in the list, classes in the class list will be marked with an asterisk if they are a class/superclass of the example instance. (These asterisked classes are really the only ones relevant to the example.)"!
!SelectorBrowser methodsFor: 'as yet unclassified' stamp: 'dew 4/29/2000 13:04'!
markMatchingClasses
"If an example is used, mark classes matching the example instance with an asterisk."
| unmarkedClassList firstPartOfSelector receiverString receiver |
"Only 'example' queries can be marked."
(contents asString includes: $.) ifFalse: [^ self].
unmarkedClassList _ classList copy.
"Get the receiver object of the selected statement in the message list."
firstPartOfSelector _ (Scanner new scanTokens: (selectorList at: selectorIndex)) second.
receiverString _ (ReadStream on: (selectorList at: selectorIndex))
upToAll: firstPartOfSelector.
receiver _ Compiler evaluate: receiverString.
unmarkedClassList do:
[:classAndMethod | | class |
class _ Compiler evaluate:
((ReadStream on: classAndMethod) upToAll: firstPartOfSelector).
(receiver isKindOf: class) ifTrue:
[classList add: '*', classAndMethod.
classList remove: classAndMethod]].
! !
!SelectorBrowser methodsFor: 'as yet unclassified' stamp: 'dew 4/25/2000 18:36'!
messageListIndex: anInteger
"Set the selected message selector to be the one indexed by anInteger. Find all classes it is in."
selectorIndex _ anInteger.
selectorIndex = 0 ifTrue: [^ self].
classList _ Smalltalk allImplementorsOf: self selectedMessageName.
self markMatchingClasses.
classListIndex _ 0.
self changed: #messageListIndex. "update my selection"
self changed: #classList.! !
!SelectorBrowser methodsFor: 'as yet unclassified' stamp: 'dew 4/19/2000 18:51'!
selectedClass
"Answer the currently selected class."
| pairString |
classListIndex = 0 ifTrue: [^nil].
pairString _ classList at: classListIndex.
(pairString includes: $*) ifTrue: [pairString _ pairString allButFirst].
MessageSet parse: pairString
toClassAndSelector: [:cls :sel | ^ cls].! !
More information about the Squeak-dev
mailing list
|