[Pharo-dev] DNU Create button auto extension category

Tim Mackinnon tim at testit.works
Sun May 12 03:40:26 EDT 2019


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




More information about the Pharo-dev mailing list