DoWhatIMeanSupport.st
changeset 5486 56dd440a7ddd
parent 5471 289b60e70a2c
child 5501 905b5a2216f7
--- 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