[Pharo-dev] DNU Create button auto extension category
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.
> 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
>>>> 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
>>> 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