[Pharo-dev] DNU Create button auto extension category

Ben Coman btc at openinworld.com
Sun May 12 03:47:37 EDT 2019


On Sun, 12 May 2019 at 15:41, Tim Mackinnon <tim at testit.works> wrote:

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

With Calypso I've had some success using  Protocols Pane > Categorize all
uncategorized.
but as an after-the-fact clean up maybe not what your looking for.

cheers -ben


>
> Tim
>
> Sent from my iPhone
>
> On 12 May 2019, at 07:30, Ben Coman <btc at openinworld.com> wrote:
>
> >>> 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 ??
> >
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pharo.org/pipermail/pharo-dev_lists.pharo.org/attachments/20190512/2c98dd24/attachment.html>


More information about the Pharo-dev mailing list