[squeak-dev] The Inbox: Tools-ct.932.mcz

Thiede, Christoph Christoph.Thiede at student.hpi.uni-potsdam.de
Sun Jan 19 21:00:53 UTC 2020


Please note that I removed #implementMissingMethod:inClass: and #askForCategoryIn:default: directly instead of deprecating them (in favor of the new version with an additional #ifCancel: keyword). I think these methods are private enough, would you agree or should we move them into a deprecation category?


And please let me know whether this commit has an appropriate size, I always strive for optimization :-)


Best,

Christoph

________________________________
Von: Squeak-dev <squeak-dev-bounces at lists.squeakfoundation.org> im Auftrag von commits at source.squeak.org <commits at source.squeak.org>
Gesendet: Sonntag, 19. Januar 2020 21:56:42
An: squeak-dev at lists.squeakfoundation.org
Betreff: [squeak-dev] The Inbox: Tools-ct.932.mcz

Christoph Thiede uploaded a new version of Tools to project The Inbox:
http://source.squeak.org/inbox/Tools-ct.932.mcz

==================== Summary ====================

Name: Tools-ct.932
Author: ct
Time: 19 January 2020, 9:56:38.355545 pm
UUID: cfb85c45-de2c-e641-af0f-2cec865baf48
Ancestors: Tools-mt.929

Minor improvements to debugger's notifier support:

- Allow to cancel method creation when asked for category
- Always offer defaultCategory as first choice
- Fix a bug in #askForSuperclassOf:upTo:toImplement:ifCancel: (superclass was not respected*)
- Improve multilingual support
- Select message to implement after implementing the method (see #removeNotifierContext:)
- Refactoring, deduplication

*Snippet to reproduce:
        c1 := Object newSubclass.
        c1 compile: 'foo'.
        c2 := c1 newSubclass.
        c2 compile: 'foo ^ self subclassResponsibility'.
        c3 := c2 newSubclass.
        c3 new foo.

=============== Diff against Tools-mt.929 ===============

Item was removed:
- ----- Method: Debugger>>askForCategoryIn:default: (in category 'notifier support') -----
- askForCategoryIn: aClass default: aString
-
-        ^ (Project uiManager
-                chooseFromOrAddTo: (aClass allMethodCategoriesIntegratedThrough: Object)
-                lines: #()
-                title: 'Please provide a good category for the new method' translated)
-                        ifNil: [aString]
-                        ifNotNil: [:newCategory | newCategory ifEmpty: [aString]]!

Item was added:
+ ----- Method: Debugger>>askForCategoryIn:default:ifCancel: (in category 'notifier support') -----
+ askForCategoryIn: aClass default: defaultCategory ifCancel: aBlock
+
+        | categories category |
+        categories := (aClass allMethodCategoriesIntegratedThrough: Object) asOrderedCollection.
+        categories
+                remove: defaultCategory ifAbsent: [];
+                addFirst: defaultCategory.
+        category := Project uiManager
+                chooseFromOrAddTo: categories
+                lines: #(2)
+                title: 'Please provide a good category for the new method' translated.
+        category ifNil: [^ aBlock value].
+        ^ category ifEmpty: [defaultCategory]!

Item was changed:
  ----- Method: Debugger>>askForSuperclassOf:toImplement:ifCancel: (in category 'notifier support') -----
  askForSuperclassOf: aClass toImplement: aSelector ifCancel: cancelBlock
+
+        ^ self
+                askForSuperclassOf: aClass
+                upTo: nil
+                toImplement: aSelector
+                ifCancel: cancelBlock!
-        | classes chosenClassIndex |
-        classes := aClass withAllSuperclasses.
-        chosenClassIndex := UIManager default
-                chooseFrom: (classes collect: [:c | c name])
-                title: 'Define #', aSelector, ' in which class?'.
-        chosenClassIndex = 0 ifTrue: [^ cancelBlock value].
-        ^ classes at: chosenClassIndex!

Item was changed:
  ----- Method: Debugger>>askForSuperclassOf:upTo:toImplement:ifCancel: (in category 'notifier support') -----
  askForSuperclassOf: aClass upTo: superclass toImplement: aSelector ifCancel: cancelBlock
+
         | classes chosenClassIndex |
+        classes := aClass withAllSuperclasses readStream upTo: superclass.
-        classes := aClass withAllSuperclasses reject: [:cls | aClass isKindOf: cls].
         chosenClassIndex := UIManager default
                 chooseFrom: (classes collect: [:c | c name])
+                title: ('Define {1} in which class?' translated
+                        format: {aSelector asSymbol printString}).
-                title: 'Define #', aSelector, ' in which class?'.
         chosenClassIndex = 0 ifTrue: [^ cancelBlock value].
         ^ classes at: chosenClassIndex!

Item was changed:
  ----- Method: Debugger>>createMethod (in category 'notifier buttons') -----
  createMethod
+        "Should only be called when this Debugger was created in response to a MessageNotUnderstood exception. Create a stub for the method that was missing and proceed into it."
-        "Should only be called when this Debugger was created in response to a
-        MessageNotUnderstood exception. Create a stub for the method that was
-        missing and proceed into it."

         | msg chosenClass |
         self initializeFull.
         msg := self contextStackTop exceptionMessage.
         chosenClass := self
                 askForSuperclassOf: self contextStackTop receiver class
                 toImplement: msg selector
                 ifCancel: [^self].
+        self
+                implementMissingMethod: msg
+                inClass: chosenClass
+                ifCancel: [^self].!
-        self implementMissingMethod: msg inClass: chosenClass.!

Item was removed:
- ----- Method: Debugger>>implementMissingMethod:inClass: (in category 'notifier support') -----
- implementMissingMethod: aMessage inClass: aClass
-        ^ self
-                implementMissingMethod: aMessage
-                inClass: aClass
-                inCategory: (self askForCategoryIn: aClass default: 'as yet unclassified').!

Item was added:
+ ----- Method: Debugger>>implementMissingMethod:inClass:ifCancel: (in category 'notifier support') -----
+ implementMissingMethod: aMessage inClass: aClass ifCancel: aBlock
+
+        | category |
+        category := self
+                askForCategoryIn: aClass
+                default: ClassOrganizer default
+                ifCancel: [^ aBlock value].
+        ^ self
+                implementMissingMethod: aMessage
+                inClass: aClass
+                inCategory: category!

Item was changed:
  ----- Method: Debugger>>implementMissingMethod:inClass:inCategory: (in category 'notifier support') -----
  implementMissingMethod: aMessage inClass: aClass inCategory: aSymbol
         "Create a stub implementation of the missing message and sew it onto the top of the stack, ensuring the context's arguments are set correctly. Debug the new context."
+
+        self
+                pushStubMethodOnStack: aMessage inClass: aClass inCategory: aSymbol;
+                removeNotifierContext: self selectedContext sender.!
-        self pushStubMethodOnStack: aMessage inClass: aClass inCategory: aSymbol.
-
-        "Cut out the sender context. This is the context that signalled the MessageNotUnderstood."
-        self selectedContext privSender: self selectedContext sender.
-        self resetContext: self selectedContext.
-        self debug.!

Item was changed:
  ----- Method: Debugger>>implementOverridingMethod:inClass:inCategory: (in category 'notifier support') -----
  implementOverridingMethod: aMessage inClass: aClass inCategory: aSymbol
         "Create a stub implementation of the overriding message and sew it onto the top of the stack, ensuring the context's arguments are set correctly. Debug the new context."
+
+        self
+                pushStubMethodOnStack: aMessage inClass: aClass inCategory: aSymbol;
+                removeNotifierContext: self selectedContext sender sender.!
-        self pushStubMethodOnStack: aMessage inClass: aClass inCategory: aSymbol.
-
-        "Cut out the sender context. This is the context that signalled the SubclassResponsibility."
-        self selectedContext privSender: self selectedContext sender sender.
-        self resetContext: self selectedContext.
-        self debug.!

Item was added:
+ ----- Method: Debugger>>removeNotifierContext: (in category 'notifier support') -----
+ removeNotifierContext: aContext
+        "Cut out the sender context. This is the context that signalled a notification that triggered the notifier."
+
+        self selectedContext privSender: aContext.
+        self resetContext: self selectedContext.
+        self debug; doStep. "for convenient selection"!


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200119/75979273/attachment.html>


More information about the Squeak-dev mailing list