[Pharo-dev] DNU Create button auto extension category
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
but as an after-the-fact clean up maybe not what your looking for.
> 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...
More information about the Pharo-dev