Marcel Taeumel uploaded a new version of ToolBuilder-Kernel to project The Trunk:
http://source.squeak.org/trunk/ToolBuilder-Kernel-mt.129.mcz ==================== Summary ==================== Name: ToolBuilder-Kernel-mt.129 Author: mt Time: 2 August 2019, 9:42:26.409893 am UUID: 599e842a-df92-144c-9a4e-a2ad7d0a5664 Ancestors: ToolBuilder-Kernel-ul.128 Complements System-mt.1077. =============== Diff against ToolBuilder-Kernel-ul.128 =============== 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. + ^ ((SystemNavigation for: environment) allClassesAndTraitsMatching: pattern) + ifEmpty: [nil] + ifNotEmpty: [:results | + results size = 1 + ifTrue: [results first] + ifFalse: [self + chooseFrom: (results collect: [:each | each name]) + values: results + title: label]]! - !!!! 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 := pattern copyWithoutAll: Character separators. - toMatch := toMatch asLowercase copyWithout: $.. - toMatch ifEmpty: [ ^nil ]. - - "Fetch search space." - names := OrderedCollection new. - potentialNames := environment classAndTraitNames. - - "Try uppercase-only patterns for patterns such as 'WKD' to find 'WeakIdentityKeyDictionary' etc." - (pattern allSatisfy: [:char | char isUppercase]) ifTrue: [ - | patternSize | - patternSize := pattern size. - potentialNames do: [ :eachName | - | lookupIndex characterIndex | - lookupIndex := 0. - characterIndex := 1. - [ (lookupIndex := eachName - indexOf: (pattern at: characterIndex) - startingAt: lookupIndex + 1) > 0 - and: [ (characterIndex := characterIndex + 1) <= patternSize ] ] whileTrue. - lookupIndex > 0 ifTrue: [ names add: eachName ] ] ]. - - "Try wildcard search for patterns such as 'Weak*Dict*' to find 'WeakIdentityKeyDictionary' etc." - names ifEmpty: [ - potentialNames do: [ :each | (toMatch match: each) ifTrue: [ names add: each ] ]. - "Try feature-based search for patterns such as 'WeakDict' to find 'WeakIdentityKeyDictionary' etc." - names ifEmpty: [ - "1) Insert wildcards between features and at the end." - toMatch := ((pattern copyWithoutAll: '.*#') findFeatures joinSeparatedBy: '*'), '*'. - potentialNames do: [ :each | (toMatch match: each) ifTrue: [ names add: each ] ]. - names ifEmpty: [ - "2) Insert wildcards before, between, and after features." - toMatch := '*', toMatch. - potentialNames do: [ :each | (toMatch match: each) ifTrue: [ names add: each ] ] ] ] ]. - - "Try some fuzzy matching." - pattern suggestedTypeNames do: [ :each | - (potentialNames includes: each) ifTrue: [ names add: 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 ]. - selectedIndex = 0 ifTrue: [ ^nil ]. - ^environment at: (names at: selectedIndex) asSymbol! |
Free forum by Nabble | Edit this page |