SystemBrowser.st
changeset 4924 0d39bbc7203e
parent 4921 cd47f919e8f9
child 5018 2fe02eac49c5
--- a/SystemBrowser.st	Fri May 23 12:14:28 2003 +0200
+++ b/SystemBrowser.st	Fri May 23 14:09:53 2003 +0200
@@ -4815,7 +4815,16 @@
 classWithNameSimilarTo:className
     "helper for class-name entry; finds a class by name tolerant w.r.t. case"
 
-    |nm lcName class allClasses triedMatchers|
+    |allMatchingClasses|
+
+    allMatchingClasses := self classesWithNameSimilarTo:className.
+    ^ allMatchingClasses firstIfEmpty:nil
+!
+
+classesWithNameSimilarTo:className
+    "helper for class-name entry; finds a class by name tolerant w.r.t. case"
+
+    |nm lcName class allClasses triedDetectors triedMatchers allMatchingClasses|
 
     (className startsWith:'Smalltalk::') ifTrue:[
         nm := className copyFrom:('Smalltalk::' size + 1).
@@ -4824,25 +4833,48 @@
     ].
 
     class := Smalltalk at:nm asSymbol.
-    class isBehavior ifTrue:[^ class].      "/ a direct hit
+    class isBehavior ifTrue:[^ Array with:class].      "/ a direct hit
 
     lcName := className asLowercase.
+    class := Smalltalk at:lcName asSymbol.
+    class isBehavior ifTrue:[^ Array with:class].      "/ an almost direct hit
+
     allClasses := Smalltalk allClasses.
 
     triedMatchers := OrderedCollection new.
-    triedMatchers add:[:cls | cls name asLowercase = lcName].       
+    triedDetectors := OrderedCollection new.
+    triedDetectors add:[:cls | cls name asLowercase = lcName].       
+    triedDetectors add:[:cls | cls nameWithoutPrefix asLowercase = lcName].      
+    triedDetectors add:[:cls | cls nameWithoutNameSpacePrefix asLowercase = lcName].      
+
     triedMatchers add:[:cls | cls name asLowercase startsWith:lcName].      
-    triedMatchers add:[:cls | cls nameWithoutNameSpacePrefix asLowercase = lcName].      
     triedMatchers add:[:cls | cls nameWithoutNameSpacePrefix asLowercase startsWith:lcName].      
-    triedMatchers add:[:cls | cls nameWithoutPrefix asLowercase = lcName].      
     triedMatchers add:[:cls | cls nameWithoutPrefix asLowercase startsWith:lcName].      
     triedMatchers add:[:cls | cls nameWithoutPrefix asLowercase includesString:lcName].      
-
-    triedMatchers do:[:eachTry |
+    triedMatchers add:[:cls | cls name asLowercase includesString:lcName].      
+
+    triedDetectors do:[:eachTry |
+        |class|
+
         class := allClasses detect:eachTry ifNone:nil.
-        class notNil ifTrue:[^ class].
+        class notNil ifTrue:[^ Array with:class].
     ].
-    ^ nil  
+
+    allMatchingClasses := IdentitySet new.
+    triedMatchers do:[:eachTry |
+        |matchingClasses|
+
+        matchingClasses := allClasses select:eachTry.
+        matchingClasses size == 1 ifTrue:[^ matchingClasses].
+        allMatchingClasses addAll:matchingClasses.
+    ].
+    allMatchingClasses isEmpty ifTrue:[^ #()].
+
+    allMatchingClasses := allMatchingClasses asOrderedCollection.
+    allMatchingClasses sort:[:a :b | (lcName levenshteinTo:a name asLowercase)
+                                     <
+                                     (lcName levenshteinTo:b name asLowercase)].
+    ^ allMatchingClasses.
 !
 
 extractClassAndSelectorFrom:aString into:aBlock
@@ -4994,7 +5026,7 @@
 !SystemBrowser class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/SystemBrowser.st,v 1.190 2003-05-22 08:00:31 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/SystemBrowser.st,v 1.191 2003-05-23 12:09:53 cg Exp $'
 ! !
 
 SystemBrowser initialize!