The Inbox: ToolBuilder-Kernel-jr.110.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

The Inbox: ToolBuilder-Kernel-jr.110.mcz

commits-2
A new version of ToolBuilder-Kernel was added to project The Inbox:
http://source.squeak.org/inbox/ToolBuilder-Kernel-jr.110.mcz

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

Name: ToolBuilder-Kernel-jr.110
Author: jr
Time: 13 May 2017, 10:49:04.306891 pm
UUID: 41b8cbb2-c017-f84b-af5d-a6b52d1365cd
Ancestors: ToolBuilder-Kernel-jr.109

extend behavior search to all environments

=============== Diff against ToolBuilder-Kernel-jr.109 ===============

Item was added:
+ ----- Method: ClassDescription>>labelForBehaviorsList (in category '*ToolBuilder-Kernel') -----
+ labelForBehaviorsList
+ ^ self name,
+ (self environment == Smalltalk globals
+ ifTrue: ['']
+ ifFalse: [' (', self environment name, ')'])!

Item was changed:
  ----- Method: UIManager>>classFromPattern:withCaption: (in category 'system introspecting') -----
  classFromPattern: pattern withCaption: aCaption
+ ^self classOrTraitFromAny: (Environment allInstances) pattern: pattern label: aCaption
- ^self classFromPattern: pattern withCaption: aCaption in: Smalltalk environment
  "
  self classFromPattern: 'CharRecog' withCaption: ''
  self classFromPattern: 'rRecog' withCaption: ''
  self classFromPattern: 'znak' withCaption: ''
  self classFromPattern: 'orph' withCaption: ''
  self classFromPattern: 'TCompil' withCaption: ''
  "
  !

Item was added:
+ ----- Method: UIManager>>classOrTraitFromAny:pattern:label: (in category 'system introspecting') -----
+ classOrTraitFromAny: environments pattern: pattern label: label
+ "If only one class or trait in the given environments has a name that matches pattern, return it.
+ Otherwise, put up a menu offering the names (and environments) of all matching behaviors, and return the chosen one, else nil if nothing chosen.
+ This method ignores separator characters in the pattern"
+
+ | toMatch allBehaviors matchingBehaviors exactMatches behaviorsWithReducedIdentifiers behaviorLabels |
+ toMatch := pattern copyWithoutAll: Character separators.
+ toMatch ifEmpty: [ ^nil ].
+ "If there are behaviors named exactly as pattern, choose only from them."
+ Symbol hasInterned: pattern ifTrue: [ :symbol | | declaringEnvironments |
+ declaringEnvironments := environments select: [:each |
+ each at: symbol ifPresent: [:it | it isBehavior] ifAbsent: [false]].
+ declaringEnvironments size = 1
+ ifTrue: [^ declaringEnvironments anyOne at: symbol].
+ declaringEnvironments ifNotEmpty: [ | behaviors |
+ behaviors := (declaringEnvironments collect: [:each | each at: symbol]) asOrderedCollection sort: [:a :b | a name <= b name].
+ behaviorLabels := behaviors collect: [:each | each labelForBehaviorsList].
+ ^ self chooseFrom: behaviorLabels values: behaviors title: label]].
+ "No exact match, look for potential matches."
+ toMatch := pattern asLowercase copyWithout: $..
+ allBehaviors := environments gather: [:each | each allClassesAndTraits].
+ matchingBehaviors := (pattern last = $. "This is some old hack, using String>>#match: may be better."
+ ifTrue: [ allBehaviors select: [ :each | each name asLowercase = toMatch ] ]
+ ifFalse: [
+ allBehaviors select: [ :each |
+ each name includesSubstring: toMatch caseSensitive: false ] ])
+ asOrderedCollection.
+ exactMatches := matchingBehaviors select: [ :each | each name asLowercase = toMatch ].
+ "Also try some fuzzy matching."
+ behaviorsWithReducedIdentifiers := pattern suggestedTypeNames gather: [:each |
+ allBehaviors select: [:behavior | behavior name = each]].
+ behaviorsWithReducedIdentifiers ifNotEmpty: [
+ matchingBehaviors addAll: behaviorsWithReducedIdentifiers].
+ "Let the user select if there's more than one possible match. This may give surprising results."
+ matchingBehaviors ifEmpty: [^ nil "nothing matches"].
+ matchingBehaviors size = 1 ifTrue: [^ matchingBehaviors anyOne].
+ exactMatches ifNotEmpty: [matchingBehaviors addAllFirst: exactMatches].
+ behaviorLabels := matchingBehaviors collect: [:each | each labelForBehaviorsList].
+ ^ self chooseFrom: behaviorLabels values: matchingBehaviors title: label!


Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: ToolBuilder-Kernel-jr.110.mcz

Jakob Reschke-2
This enables to use the search box to go to behaviors in other environments.

The new method is structurally the same as
#classOrTraitFrom:pattern:label:, but changed in various places to
handle the fact that there is not a single source to collect behaviors
from. Also it does not operate primarily on Strings, for obvious
reasons, but with the behaviors themselves.

2017-05-16 19:02 GMT+02:00 [hidden email]
<[hidden email]>:

> A new version of ToolBuilder-Kernel was added to project The Inbox:
> http://source.squeak.org/inbox/ToolBuilder-Kernel-jr.110.mcz
>
> ==================== Summary ====================
>
> Name: ToolBuilder-Kernel-jr.110
> Author: jr
> Time: 13 May 2017, 10:49:04.306891 pm
> UUID: 41b8cbb2-c017-f84b-af5d-a6b52d1365cd
> Ancestors: ToolBuilder-Kernel-jr.109
>
> extend behavior search to all environments
>
> =============== Diff against ToolBuilder-Kernel-jr.109 ===============
>
> Item was added:
> + ----- Method: ClassDescription>>labelForBehaviorsList (in category '*ToolBuilder-Kernel') -----
> + labelForBehaviorsList
> +       ^ self name,
> +               (self environment == Smalltalk globals
> +                       ifTrue: ['']
> +                       ifFalse: [' (', self environment name, ')'])!
>
> Item was changed:
>   ----- Method: UIManager>>classFromPattern:withCaption: (in category 'system introspecting') -----
>   classFromPattern: pattern withCaption: aCaption
> +       ^self classOrTraitFromAny: (Environment allInstances) pattern: pattern label: aCaption
> -       ^self classFromPattern: pattern withCaption: aCaption in: Smalltalk environment
>   "
>         self classFromPattern: 'CharRecog' withCaption: ''
>         self classFromPattern: 'rRecog' withCaption: ''
>         self classFromPattern: 'znak' withCaption: ''
>         self classFromPattern: 'orph' withCaption: ''
>         self classFromPattern: 'TCompil' withCaption: ''
>   "
>   !
>
> Item was added:
> + ----- Method: UIManager>>classOrTraitFromAny:pattern:label: (in category 'system introspecting') -----
> + classOrTraitFromAny: environments pattern: pattern label: label
> +       "If only one class or trait in the given environments has a name that matches pattern, return it.
> +       Otherwise, put up a menu offering the names (and environments) of all matching behaviors, and return the chosen one, else nil if nothing chosen.
> +       This method ignores separator characters in the pattern"
> +
> +       | toMatch allBehaviors matchingBehaviors exactMatches behaviorsWithReducedIdentifiers behaviorLabels |
> +       toMatch := pattern copyWithoutAll: Character separators.
> +       toMatch ifEmpty: [ ^nil ].
> +       "If there are behaviors named exactly as pattern, choose only from them."
> +       Symbol hasInterned: pattern ifTrue: [ :symbol | | declaringEnvironments |
> +               declaringEnvironments := environments select: [:each |
> +                       each at: symbol ifPresent: [:it | it isBehavior] ifAbsent: [false]].
> +               declaringEnvironments size = 1
> +                       ifTrue: [^ declaringEnvironments anyOne at: symbol].
> +               declaringEnvironments ifNotEmpty: [ | behaviors |
> +                       behaviors := (declaringEnvironments collect: [:each | each at: symbol]) asOrderedCollection sort: [:a :b | a name <= b name].
> +                       behaviorLabels := behaviors collect: [:each | each labelForBehaviorsList].
> +                       ^ self chooseFrom: behaviorLabels values: behaviors title: label]].
> +       "No exact match, look for potential matches."
> +       toMatch := pattern asLowercase copyWithout: $..
> +       allBehaviors := environments gather: [:each | each allClassesAndTraits].
> +       matchingBehaviors := (pattern last = $. "This is some old hack, using String>>#match: may be better."
> +               ifTrue: [ allBehaviors select: [ :each | each name asLowercase = toMatch ] ]
> +               ifFalse: [
> +                       allBehaviors select: [ :each |
> +                               each name includesSubstring: toMatch caseSensitive: false ] ])
> +               asOrderedCollection.
> +       exactMatches := matchingBehaviors select: [ :each | each name asLowercase = toMatch ].
> +       "Also try some fuzzy matching."
> +       behaviorsWithReducedIdentifiers := pattern suggestedTypeNames gather: [:each |
> +               allBehaviors select: [:behavior | behavior name = each]].
> +       behaviorsWithReducedIdentifiers ifNotEmpty: [
> +               matchingBehaviors addAll: behaviorsWithReducedIdentifiers].
> +       "Let the user select if there's more than one possible match. This may give surprising results."
> +       matchingBehaviors ifEmpty: [^ nil "nothing matches"].
> +       matchingBehaviors size = 1 ifTrue: [^ matchingBehaviors anyOne].
> +       exactMatches ifNotEmpty: [matchingBehaviors addAllFirst: exactMatches].
> +       behaviorLabels := matchingBehaviors collect: [:each | each labelForBehaviorsList].
> +       ^ self chooseFrom: behaviorLabels values: matchingBehaviors title: label!
>
>