DoWhatIMeanSupport.st
changeset 5046 60d0ef296d3a
parent 5044 f8c330427edc
child 5047 b22d13631deb
--- a/DoWhatIMeanSupport.st	Tue May 03 13:24:09 2016 +0200
+++ b/DoWhatIMeanSupport.st	Tue May 03 14:59:25 2016 +0200
@@ -1860,7 +1860,10 @@
      When showing possible completions for a message,
      it is a good idea to know what the kind receiver is."
 
-    | nm nodeVal receiverClass nodeSelector nodeReceiver mthd instVarClass|
+    | nm nodeVal receiverClass 
+      msgSelector msgReceiver msgArg1
+      receiverClasses arg1Classes
+      mthd instVarClass|
 
     aNode isBlock ifTrue:[
         ^ { Block }
@@ -1898,7 +1901,7 @@
     ].
 
     aNode isMessage ifTrue:[
-        nodeSelector := aNode selector.
+        msgSelector := aNode selector.
 
         "/ heuristic: quickly assume boolean for some:
         (
@@ -1907,30 +1910,32 @@
                 > >= < <= = == ~ ~=
                 isInteger isNumber isArray
                 knownAsSymbol
-            ) includes:nodeSelector
+            ) includes:msgSelector
         ) ifTrue:[
             ^ { True } "/ use True, because boolean does not include the full protocol
         ].
 
-        nodeReceiver := aNode receiver.
+        msgReceiver := aNode receiver.
 
         "/ some hardwired knowlegde here
-        receiverClass := self classOfNode:nodeReceiver.
+        receiverClasses := self classesOfNode:msgReceiver.
+        receiverClass := receiverClasses size == 1 ifTrue:[receiverClasses anElement] ifFalse:[nil].
+        
         receiverClass notNil ifTrue:[
-            nodeSelector == #theNonMetaclass ifTrue:[  
+            msgSelector == #theNonMetaclass ifTrue:[  
                 ^ { receiverClass theNonMetaclass class }
             ].
-            nodeSelector == #theMetaclass ifTrue:[  
+            msgSelector == #theMetaclass ifTrue:[  
                 ^ { receiverClass theMetaclass class }
             ].
-            nodeSelector == #class ifTrue:[
+            msgSelector == #class ifTrue:[
                 ^ { receiverClass class }
             ].
 
             receiverClass isBehavior ifTrue:[
-                mthd := receiverClass lookupMethodFor:nodeSelector.
+                mthd := receiverClass lookupMethodFor:msgSelector.
                 receiverClass isMeta ifTrue:[
-                    ( #( #'new' #'basicNew' #'new:' #'basicNew:' #'with:' #'with:with:') includes: nodeSelector ) ifTrue:[
+                    ( #( #'new' #'basicNew' #'new:' #'basicNew:' #'with:' #'with:with:') includes: msgSelector ) ifTrue:[
                         ^ { receiverClass theNonMetaclass }
                     ].
                     "/ if that method sends one of new/basicNew/new:/basicNew:, assume it returns an instance of itself
@@ -1961,7 +1966,7 @@
             theMetaclass            Metaclass
             theNonMetaclass         Class
         ) pairWiseDo:[:sel :clsName |
-            nodeSelector == sel ifTrue:[ 
+            msgSelector == sel ifTrue:[ 
                 ^ { Smalltalk at:clsName } 
             ].
         ].
@@ -1973,14 +1978,30 @@
             includes: contains:
             and: or:
             exists atEnd
-        ) includes:nodeSelector ) ifTrue:[
+        ) includes:msgSelector ) ifTrue:[
             ^ { True } "/ Boolean - not boolean; it does not contain the full protocol (would not find ifTrue:)
         ].
 
-        ( #( + - * / // \\ ) includes:nodeSelector) ifTrue:[
+        ( #( + - * // \\ ) includes:msgSelector) ifTrue:[
             "/ assume numeric
+            
             ^ { Number }
         ].
+        msgSelector == #/ ifTrue:[
+            ((receiverClasses ? #()) contains:[:cls | cls includesBehavior:Number]) ifTrue:[
+                ^ { Number }
+            ].
+            msgArg1 := aNode arg1.
+            arg1Classes := ((self classesOfNode:msgArg1) ? #()).
+            (arg1Classes contains:[:cls | cls includesBehavior:Number]) ifTrue:[
+                ^ { Number }
+            ].    
+        ].    
+        ( #( construct: / ) includes:msgSelector) ifTrue:[
+            ((receiverClasses ? #()) contains:[:cls | cls includesBehavior:Filename]) ifTrue:[
+                ^ { Filename }
+            ].
+        ].    
     ].
     ^ nil