> > 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 ??
