[Pharo-dev] DNU Create button auto extension category

ducasse stepharo at netcourrier.com
Sun May 12 04:49:55 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.

Yes and I was sad since I spent time improving it :(

> 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