DoWhatIMeanSupport.st
changeset 4427 fb066a08ef83
parent 4426 76a0c105e8f4
child 4429 22fe83aa1537
--- a/DoWhatIMeanSupport.st	Fri Sep 27 11:28:05 2013 +0200
+++ b/DoWhatIMeanSupport.st	Sat Sep 28 15:00:52 2013 +0200
@@ -1705,7 +1705,7 @@
     "when showing possible completions for a message, 
      it is a good idea to know what the kind receiver is."
 
-    | nm nodeVal receiverClass nodeSelector nodeReceiver|
+    | nm nodeVal receiverClass nodeSelector nodeReceiver mthd|
 
     aNode isBlock ifTrue:[
         ^ Block
@@ -1741,12 +1741,25 @@
         nodeReceiver := aNode receiver.
 
         "/ some hardwired knowlegde here
-        ( #( #'new' #'basicNew' #'new:' #'basicNew:' #'with:' #'with:with:') includes: nodeSelector ) ifTrue:[
-            receiverClass := self classOfNode:nodeReceiver.
-            receiverClass notNil ifTrue:[
-                receiverClass isBehavior ifTrue:[
-                    receiverClass isMeta ifTrue:[
+        receiverClass := self classOfNode:nodeReceiver.
+        receiverClass notNil ifTrue:[
+            receiverClass isBehavior ifTrue:[
+                mthd := receiverClass lookupMethodFor:nodeSelector.
+                receiverClass isMeta ifTrue:[
+                    ( #( #'new' #'basicNew' #'new:' #'basicNew:' #'with:' #'with:with:') includes: nodeSelector ) ifTrue:[
                         ^ receiverClass theNonMetaclass
+                    ].
+                    "/ if that method sends one of new/basicNew/new:/basicNew:, assume it returns an instance of itself
+                    mthd notNil ifTrue:[
+                        ( mthd sendsAny:#( #'new' #'basicNew' #'new:' #'basicNew:' )) ifTrue:[
+                            ^ receiverClass theNonMetaclass
+                        ].
+                    ].
+                ] ifFalse:[
+                    mthd notNil ifTrue:[
+                        (ParseTreeSearcher methodIsSetterMethod:mthd) ifTrue:[
+                            ^ receiverClass.
+                        ]
                     ]
                 ]
             ].
@@ -4499,10 +4512,10 @@
 !DoWhatIMeanSupport class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.176 2013-09-27 09:28:05 vrany Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.177 2013-09-28 13:00:52 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.176 2013-09-27 09:28:05 vrany Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.177 2013-09-28 13:00:52 cg Exp $'
 ! !