--- a/DoWhatIMeanSupport.st Fri Feb 17 17:28:32 2017 +0100
+++ b/DoWhatIMeanSupport.st Sun Feb 19 14:04:34 2017 +0100
@@ -2023,49 +2023,53 @@
|receiverName possibleClasses possibleClassesFromOtherSends|
receiverName := nodeReceiver name.
+
+ classesOfReceiver notEmptyOrNil ifTrue:[
+ possibleClasses := classesOfReceiver.
+ ] ifFalse:[
+ classesFromAssignmentsToReceiver := self classesFromAssignmentTo:receiverName in:tree.
+
+ possibleClasses := classesFromAssignmentsToReceiver.
+ possibleClasses isEmpty ifTrue:[
+ "/ messages sent
+ otherMessagesToReceiver := self messagesSentTo:receiverName in:tree.
+ otherMessagesToReceiver remove:selector ifAbsent:[].
+
+ otherMessagesToReceiver notEmpty ifTrue:[
+ "/ classes which respond to all
+ possibleClassesFromOtherSends :=
+ Smalltalk
+ allClassesForWhich:[:cls |
+ cls isLoaded
+ and:[ otherMessagesToReceiver
+ conform:[:eachSelectorSent | cls canUnderstand:eachSelectorSent]]
+ ].
+ possibleClasses := possibleClasses , possibleClassesFromOtherSends.
+ ].
+ ].
- classesFromAssignmentsToReceiver := self classesFromAssignmentTo:receiverName in:tree.
-
- possibleClasses := classesFromAssignmentsToReceiver.
- possibleClasses isEmpty ifTrue:[
- "/ messages sent
- otherMessagesToReceiver := self messagesSentTo:receiverName in:tree.
- otherMessagesToReceiver remove:selector ifAbsent:[].
-
- otherMessagesToReceiver notEmpty ifTrue:[
- "/ classes which respond to all
- possibleClassesFromOtherSends :=
- Smalltalk
- allClassesForWhich:[:cls |
- cls isLoaded
- and:[ otherMessagesToReceiver
- conform:[:eachSelectorSent | cls canUnderstand:eachSelectorSent]]
- ].
- possibleClasses := possibleClasses , possibleClassesFromOtherSends.
+ "/ if the receiver is a classVar/classInstVar,
+ "/ include the class of its current value and UndefinedObject.
+ "/ This helps to complete class methods and (lazy) initializer code.
+ (classOrNil notNil) ifTrue:[
+ |tryValue currentValue|
+
+ tryValue := false.
+ (classOrNil theNonMetaclass allClassVarNames includes: receiverName) ifTrue:[
+ tryValue := true.
+ currentValue := classOrNil theNonMetaclass classVarAt:receiverName.
+ ] ifFalse:[
+ (classOrNil isMeta and:[ classOrNil allInstVarNames includes: receiverName ]) ifTrue:[
+ tryValue := true.
+ currentValue := classOrNil theNonMetaclass instVarNamed:receiverName.
+ ].
+ ].
+ tryValue ifTrue:[
+ possibleClasses := { currentValue class } , possibleClasses.
+ ].
].
].
-
- "/ if the receiver is a classVar/classInstVar,
- "/ include the class of its current value and UndefinedObject.
- "/ This helps to complete class methods and (lazy) initializer code.
- (classOrNil notNil) ifTrue:[
- |tryValue currentValue|
-
- tryValue := false.
- (classOrNil theNonMetaclass allClassVarNames includes: receiverName) ifTrue:[
- tryValue := true.
- currentValue := classOrNil theNonMetaclass classVarAt:receiverName.
- ] ifFalse:[
- (classOrNil isMeta and:[ classOrNil allInstVarNames includes: receiverName ]) ifTrue:[
- tryValue := true.
- currentValue := classOrNil theNonMetaclass instVarNamed:receiverName.
- ].
- ].
- tryValue ifTrue:[
- possibleClasses := { currentValue class } , possibleClasses.
- ].
- ].
-
+
(possibleClasses notEmpty and:[possibleClasses size < 15]) ifTrue:[
bestSelectors :=
(possibleClasses
@@ -2667,8 +2671,7 @@
"Created: / 10-11-2006 / 13:18:27 / cg"
"Modified: / 16-02-2010 / 10:33:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
- "Modified: / 05-02-2017 / 12:59:16 / cg"
- "Modified (format): / 13-02-2017 / 20:35:49 / cg"
+ "Modified: / 19-02-2017 / 12:42:23 / cg"
!
codeCompletionForMessageTo:node into:actionBlock
@@ -5588,7 +5591,8 @@
!
addClassesOfExpression:expr inClass:classOrNil to:setOfTypes
- |cls exprVal varName varScope instVarClass classVarClass poolVarClass sym|
+ |cls exprVal varName varScope instVarClass classVarClass poolVarClass sym
+ topNameSpace|
expr isLiteral ifTrue:[
exprVal := expr value.
@@ -5695,10 +5699,16 @@
varName isUppercaseFirst ifTrue:[
sym := varName asSymbolIfInterned.
sym notNil ifTrue:[
- exprVal := (Smalltalk at:sym).
- exprVal notNil ifTrue:[
+ ((topNameSpace := classOrNil topNameSpace) notNil
+ and:[ topNameSpace ~~ Smalltalk
+ and:[ (exprVal := topNameSpace at:sym) notNil ]]) ifTrue:[
setOfTypes add:(exprVal class).
- ]
+ ] ifFalse:[
+ exprVal := (Smalltalk at:sym).
+ exprVal notNil ifTrue:[
+ setOfTypes add:(exprVal class).
+ ]
+ ].
].
].
^ setOfTypes
@@ -5717,7 +5727,7 @@
^ setOfTypes
- "Modified: / 05-02-2017 / 12:58:40 / cg"
+ "Modified (comment): / 19-02-2017 / 14:03:29 / cg"
!
addClassesOfInstVarNamed:varName inClass:aClass to:setOfTypes