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. 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 <[email protected]> wrote: >>> On 11 May 2019, at 18:07, Ben Coman <[email protected]> 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 <[email protected]> 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 ?? >
