[squeak-dev] The Trunk: ToolBuilder-Kernel-ul.128.mcz
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Sun Jul 21 07:28:52 UTC 2019
Le mer. 17 juil. 2019 à 08:18, <commits at source.squeak.org> a écrit :
> Marcel Taeumel uploaded a new version of ToolBuilder-Kernel to project The
> Trunk:
> http://source.squeak.org/trunk/ToolBuilder-Kernel-ul.128.mcz
>
> ==================== Summary ====================
>
> Name: ToolBuilder-Kernel-ul.128
> Author: ul
> Time: 16 July 2019, 11:36:38.782463 pm
> UUID: 7153b8e4-a085-4af2-b2a8-3f14585475b0
> Ancestors: ToolBuilder-Kernel-mt.127
>
> Further improvements:
> - do not convert potentialNames from Array to OrderedCollection
> - removed unnecessary ifEmpty: check
> - use #indexOf:startingAt: to search for a single character in a string
> - applied JIT tricks
> - simplified/restructured wildcard/feature-based searches
>
> Ideas not implemented:
> - suggestedTypeNames could become suggestedTypeNamesDo:
>
> =============== Diff against ToolBuilder-Kernel-mt.127 ===============
>
> 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.
>
> !!!! 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.
>
Note that pattern copyWithoutAll: CharacterSet separators is a tiny bit
faster than Character separators.
toMatch := toMatch asLowercase copyWithout: $..
> toMatch ifEmpty: [ ^nil ].
>
> "Fetch search space."
> names := OrderedCollection new.
> + potentialNames := environment classAndTraitNames.
> - potentialNames := environment classAndTraitNames
> asOrderedCollection.
>
> "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 ] ]
> ].
> - names ifEmpty: [
> - (pattern allSatisfy: [:char | char isUppercase]) ifTrue:
> [
> - (potentialNames do: [:eachName |
> - | isMatch lookupIndex |
> - isMatch := true.
> - lookupIndex := 0.
> - 1 to: pattern size do: [:charIndex | |
> char |
> - char := pattern at: charIndex.
> - isMatch ifTrue: [
> - lookupIndex := (eachName
> findString: char asString startingAt: lookupIndex+1 caseSensitive: true).
> - isMatch := lookupIndex >
> 0]].
> - isMatch 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: [
> - 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: [
> - toMatch := pattern copyWithoutAll: '.*#'.
> - toMatch findFeatures in: [:features |
> "1) Insert wildcards between features and at the
> end."
> + toMatch := ((pattern copyWithoutAll: '.*#')
> findFeatures joinSeparatedBy: '*'), '*'.
> + potentialNames do: [ :each | (toMatch match: each)
> ifTrue: [ names add: each ] ].
> - toMatch := (features joinSeparatedBy: '*'), '*'.
> - names := potentialNames select: [ :each | toMatch
> match: each ].
> names ifEmpty: [
> "2) Insert wildcards before, between, and
> after features."
> + toMatch := '*', toMatch.
> + potentialNames do: [ :each | (toMatch
> match: each) ifTrue: [ names add: each ] ] ] ] ].
> - toMatch := '*', (features joinSeparatedBy:
> '*'), '*'.
> - names := potentialNames select: [ :each |
> toMatch match: each ] ]] ].
>
> "Try some fuzzy matching."
> + pattern suggestedTypeNames do: [ :each |
> + (potentialNames includes: each) ifTrue: [ names add: each
> ] ].
> - names addAll: (pattern suggestedTypeNames select: [ :each |
> potentialNames includes: each ]).
>
> "Still no match?"
> + names ifEmpty: [ ^nil ].
> - 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!
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20190721/0f3acbbe/attachment.html>
More information about the Squeak-dev
mailing list
|