[squeak-dev] The Inbox: ToolBuilder-Kernel-mt.125.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Jul 11 06:50:29 UTC 2019


A new version of ToolBuilder-Kernel was added to project The Inbox:
http://source.squeak.org/inbox/ToolBuilder-Kernel-mt.125.mcz

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

Name: ToolBuilder-Kernel-mt.125
Author: mt
Time: 11 July 2019, 8:50:30.487838 am
UUID: 3f3a21f8-a141-734f-8aed-f0c21aff22b9
Ancestors: ToolBuilder-Kernel-mt.124

Updates the search for class names using the new find-features feature on strings. Find WeakIdentityKeyDictionary (in a small list of results) with any of the following patterns:

WKD
Weak*Dict*
WeakDict
WeakIdentityKeyDictionary

=============== Diff against ToolBuilder-Kernel-mt.124 ===============

Item was changed:
  ----- Method: UIManager>>classOrTraitFrom:pattern:label: (in category 'system introspecting') -----
  classOrTraitFrom: environment pattern: pattern label: label
+ 	"Given a pattern and an environment, try to find a class or trait using several strategies:
+ 		- EXACT: If there is a class or trait whose name exactly given by pattern, return it.
+ 		- UPPER: If the pattern is upper-case only, find camel-case letters with that sequence.
+ 		- WILD: Try the pattern as-is for regular wild-card search.
+ 		- FEATURE: Split patterns at feature boundaries and insert wild cards between.
+ 		- FUZZY: Split patterns at feature boundaries BUT treat each feature as a full class name.
+ 	If there is only one class or trait in the given environment whose name matches pattern, return it. Otherwise, put up a menu offering the names of all classes that match pattern, and return the class chosen, else nil if nothing chosen.
- 	"If there is a class or trait whose name exactly given by pattern, return it.
- 	If there is only one class or trait in the given environment whose name matches pattern, return it.
- 	Otherwise, put up a menu offering the names of all classes that match pattern, and return the class chosen, else nil if nothing chosen.
- 	This method ignores separator characters in the pattern"
  	
+ 	!!!! In any case, separator characters in the pattern are ignored."
+ 	
+ 	| toMatch potentialNames names selectedIndex |
+ 	
+ 	"If there's a class or trait named as pattern, then return it."
+ 	(environment classOrTraitNamed: pattern) ifNotNil: [:classOrTrait | ^ classOrTrait].
+ 
+ 	"Validate pattern."	
- 	| toMatch potentialNames names exactMatch lines reducedIdentifiers selectedIndex |
  	toMatch := pattern copyWithoutAll: Character separators.
+ 	toMatch := toMatch asLowercase copyWithout: $..
  	toMatch ifEmpty: [ ^nil ].
+ 
+ 	"Fetch search space."
+ 	names := OrderedCollection new.
+ 	potentialNames := environment classAndTraitNames asOrderedCollection.
+ 
+ 	"Try uppercase-only patterns for patterns such as 'WKD' to find 'WeakIdentityKeyDictionary' etc."
+ 	names ifEmpty: [
+ 		(pattern allSatisfy: [:char | char isUppercase]) ifTrue: [
+ 			potentialNames do: [:each |
+ 				| patternStream |
+ 				patternStream := pattern readStream.
+ 				each detect: [:char |
+ 					(patternStream atEnd not and: [patternStream peek = char])
+ 						ifTrue: [
+ 							patternStream next.
+ 							patternStream atEnd
+ 								ifTrue: [names add: each. true "Match!!"]
+ 								ifFalse: [false "Not yet..."]]
+ 						ifFalse: [false "No match..."] ] ifNone: [] ] ]].
+ 
+ 	"Try wildcard search for patterns such as 'Weak*Dict*' to find 'WeakIdentityKeyDictionary' etc."
+ 	names ifEmpty: [
+ 		names := potentialNames select: [ :each | toMatch match: each ]].
- 	"If there's a class or trait named as pattern, then return it."
- 	Symbol hasInterned: pattern ifTrue: [ :symbol |
- 		environment at: symbol ifPresent: [ :maybeClassOrTrait |
- 			((maybeClassOrTrait isKindOf: Class) or: [
- 				maybeClassOrTrait isTrait ])
- 					ifTrue: [ ^maybeClassOrTrait ] ] ].
- 	"No exact match, look for potential matches."
- 	toMatch := pattern asLowercase copyWithout: $..
- 	potentialNames := (environment classAndTraitNames) asOrderedCollection.
- 	names := pattern last = $. "This is some old hack, using String>>#match: may be better."
- 		ifTrue: [ potentialNames select: [ :each | each asLowercase = toMatch ] ]
- 		ifFalse: [
- 			potentialNames select: [ :each |
- 				each includesSubstring: toMatch caseSensitive: false ] ].
- 	exactMatch := names detect: [ :each | each asLowercase = toMatch ] ifNone: [ nil ].
- 	lines := OrderedCollection new.
- 	exactMatch ifNotNil: [ lines add: 1 ].
- 	"Also try some fuzzy matching."
- 	reducedIdentifiers := pattern suggestedTypeNames select: [ :each |
- 		potentialNames includes: each ].
- 	reducedIdentifiers ifNotEmpty: [
- 		names addAll: reducedIdentifiers.
- 		lines add: 1 + names size + reducedIdentifiers size ].
- 	"Let the user select if there's more than one possible match. This may give surprising results."
- 	names size = 0 ifTrue: [^ nil "nothing matches"].
  	
+ 	"Try feature-based search for patterns such as 'WeakDict' to find 'WeakIdentityKeyDictionary' etc."
+ 	names ifEmpty: [
+ 		toMatch := pattern copyWithoutAll: '.*#'.
+ 		toMatch findFeatures in: [:features |
+ 			"1) Insert wildcards between features and at the end."
+ 			toMatch := (features joinSeparatedBy: '*'), '*'.
+ 			names := potentialNames select: [ :each | toMatch match: each ].
+ 			names ifEmpty: [	
+ 				"2) Insert wildcards before, between, and after features."
+ 				toMatch := '*', (features joinSeparatedBy: '*'), '*'.
+ 				names := potentialNames select: [ :each | toMatch match: each ] ]] ].
+ 	
+ 	"Try some fuzzy matching."
+ 	names addAll: (pattern suggestedTypeNames select: [ :each | potentialNames includes: each ]).
+ 	
+ 	"Still no match?"
+ 	names ifEmpty: [ ^ nil ].
+ 
+ 	"Let the user select if there's more than one possible match. This may give surprising results."	
  	selectedIndex := names size = 1
  		ifTrue: [ 1 ]
+ 		ifFalse: [ self chooseFrom: names title: label ].
- 		ifFalse: [
- 			exactMatch ifNotNil: [ names addFirst: exactMatch ].
- 			self chooseFrom: names lines: lines title: label ].
  	selectedIndex = 0 ifTrue: [ ^nil ].
  	^environment at: (names at: selectedIndex) asSymbol!



More information about the Squeak-dev mailing list