--- 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 $'
! !