My point was that in general - method categorisation has degraded (not just your debugger case, but in a broader sense).
Nautilus used to infer method protocols , and if not inferred, you used to see protocols already in your package... now you basically have to type out protocols and search for them every time.
Yes and I was sad since I spent time improving it :(
I donât think you can even bulk categorise methods either.
I keep meaning to have a look, as itâs all quite annoying and doesnât really encourage you to categorise anything as itâs too much like hard work.
Tim
Sent from my iPhone
On 12 May 2019, at 07:30, Ben Coman <btc@openinworld.com> wrote:
On 11 May 2019, at 18:07, Ben Coman <btc@openinworld.com> wrote:
Currently when a DNU occurs we get this cool <Create> button, but when this presents the dialog "New Protocol Name" I get a blank list and the default is "as yet unclassified" and I end up with a heap of such unclassified methods to sort later.
I am wondering if it could be smarter when tests are being run. A reasonable assumption could be that the test's package name is closely related to the likely extension package name. So for a DNU, I wonder if the debugger could walk the stack to discover if a TestCase subclass was on the stack (e.g. MyTestCase) and then determine which package MyTestCase belonged to, and present that as a choice for "New Protocol Name", helping categorize extension methods.
I've started to play like this...
TestCase subclass: #MyTestRoot
MyTestRoot >> runCase [ super runCase ] on: MessageNotUnderstood do: [ :ex | "do something here, but for now..." ex pass ].
but before getting to deep, I'm seeking suggestions/solutions from the community.
On Sun, 12 May 2019 at 05:06, Tim Mackinnon <tim@testit.works> wrote:
Itâs a good point Ben - in fact categorisation in general has not been finished in pharo7 - the move to Calypso lost smart method categories and its on the todo list to fix and improve it.
I don't think this is related to Calypso, more to do with the debugger. I got what I wanted with the following change... ``` DoesNotUnderstandDebugAction>>defaultProtocol "new method" "Facilitate DNU with TDD creating extension methods by suggesting that as default protocol" | interruptedContext candidateContext | "self halt" interruptedContext := self interruptedContext. candidateContext := interruptedContext sender. [ candidateContext isNil or: [ candidateContext contextClass isKindOf: TestCase class ] ] whileFalse: [ candidateContext := candidateContext sender ]. candidateContext ifNotNil: [ | testPackage dnuPackage| dnuPackage := interruptedContext receiver class package. testPackage := candidateContext contextClass package. (testPackage = dnuPackage) ifFalse: [ ^ '*', testPackage name ]. ]. ^'as yet unclassified'
DoesNotUnderstandDebugAction>>executeAction "diff modified method" | msg msgCategory chosenClass exception | msg := self interruptedContext tempAt: 1. exception := self interruptedContext tempAt: 2. (exception class == ClassNotUnderstood) ifTrue: [ self createMissingClassWith: exception variableNode in: self interruptedContext ]. chosenClass := self askForSuperclassOf: self interruptedContext receiver class toImplement: msg selector ifCancel: [^self]. - msgCategory := (self askForCategoryIn: chosenClass default: 'as yet unclassified' ). + msgCategory := (self askForCategoryIn: chosenClass default: self defaultProtocol). self session implement: msg classified: msgCategory inClass: chosenClass forContext: self interruptedContext. self debugger selectTopContext ```
Tim, Can you trial this with your Exercism Die exercise?
Alternatively an isolated test... ``` Object subclass: MyApp ... package: 'MyPackage'
TestCase subclass: MyTestCase ... package: 'MyPackage'
MyTestCase >> testAutoExtensionProtocol MyApp new unknown ```
Run the test then click <Create> button to add following method with default protocol... as yet unclassified ``` MyApp >> unknown 42 unknown ```
Click <Create> button to add method with default protocol... *MyPackage
cheers -ben
P.S. Next question is how to create a unit test for such behaviour ??