diff -r fa049861df83 -r 56dd440a7ddd DoWhatIMeanSupport.st --- 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 " - "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