[Pharo-dev] DNU Create button auto extension category
btc at openinworld.com
Sun May 12 02:30:13 EDT 2019
> > On 11 May 2019, at 18:07, Ben Coman <btc at 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 at 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 |
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
- msgCategory := (self askForCategoryIn: chosenClass default:
'as yet unclassified' ).
+ msgCategory := (self askForCategoryIn: chosenClass default:
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
Click <Create> button to add method with default protocol... *MyPackage
P.S. Next question is how to create a unit test for such behaviour ??
More information about the Pharo-dev