--- 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