[Pharo-dev] DNU Create button auto extension category

Ben Coman 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 |
        "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 ??



More information about the Pharo-dev mailing list