class: DoWhatIMeanSupport
authorClaus Gittinger <cg@exept.de>
Wed, 24 Jul 2013 21:33:04 +0200
changeset 4304 c1ac9271223b
parent 4303 fdc31f138ba3
child 4305 6be463447aa6
class: DoWhatIMeanSupport changed: #codeCompletionForMessage:inClass:codeView:
DoWhatIMeanSupport.st
--- a/DoWhatIMeanSupport.st	Wed Jul 24 15:49:10 2013 +0200
+++ b/DoWhatIMeanSupport.st	Wed Jul 24 21:33:04 2013 +0200
@@ -2866,7 +2866,7 @@
      newParts nSelParts oldLen newLen selectorParts 
      findBest parentNode selectorInBest selector2InBest2
      parser selectorsSentInCode split 
-     varName rbTypes rbType|
+     varName rbTypes rbType tryParent parentIsKeywordMessage|
 
     RefactoryTyper notNil ifTrue:[
         "/ refactory package also provides a (very limited) typer;
@@ -2929,28 +2929,38 @@
 
     parentNode := node parent.
 
+    parentIsKeywordMessage :=
+        (parentNode notNil 
+            and:[ parentNode isMessage 
+            and:[ parentNode selector isKeywordSelector]]).
+
+    tryParent := false.
     "/ if its a unary message AND the parent is a keyword node, look for parent completion too.
-    (node selector isUnarySelector 
-    and:[ parentNode notNil 
-    and:[ parentNode isMessage 
-    and:[ (selector2 := parentNode selector) isKeywordSelector ]]]) ifTrue:[
-        "/ srchClass2 := self lookupClassForMessage:parentNode inClass:classOrNil.
-        selector2 := selector2,selector.
-        bestSelectors2 := findBest value:parentNode value:selector2.
+    (node selector isUnarySelector and:[ parentIsKeywordMessage ]) ifTrue:[ 
+        tryParent := true.
     ] ifFalse:[
         "/ also, if nothing was found
         (bestSelectors isEmpty 
         and:[ parentNode notNil 
         and:[ parentNode isMessage ]]) ifTrue:[
             "/ srchClass2 := self lookupClassForMessage:parentNode inClass:classOrNil.
+            "/ selector2 := parentNode selector.
             "/ selector2 := selector2,selector.
             bestSelectors := findBest value:parentNode value:selector.
         ]
-   ].
-
+    ].
+    tryParent ifTrue:[
+        selector2 := parentNode selector,selector.
+        bestSelectors2 := findBest value:parentNode value:selector2.
+    ].
 
     bestSelectors := (bestSelectorsFromRB ? #()) , bestSelectors.
 
+    "/ if the parent is a keyword selector, the child cannot
+    parentIsKeywordMessage ifTrue:[
+        bestSelectors := bestSelectors reject:[:sel | sel isKeywordSelector]
+    ].
+
     bestSelectors2 isEmptyOrNil ifTrue:[
         allBest := bestSelectors.
     ] ifFalse:[
@@ -3045,6 +3055,7 @@
 
     best ~= selector ifTrue:[
         numArgs := best numArgs.
+
         (bestSelectors2 notEmptyOrNil and:[bestSelectors2 includes:best]) ifTrue:[
             selectorParts := parentNode selectorParts , node selectorParts.
         ] ifFalse:[
@@ -3089,9 +3100,13 @@
                     start := oldPartialToken start.
                     stop := oldPartialToken stop.
 
-                    (best endsWith:$:) ifTrue:[
-                        (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
+                    (best isKeywordSelector) ifTrue:[
+                        (oldPartialToken value endsWith:$:) ifTrue:[
                             newPart := newPart , ':'
+                        ] ifFalse:[
+                            (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
+                                newPart := newPart , ':'
+                            ]
                         ]
                     ] ifFalse:[
                         (codeView characterAtCharacterPosition:stop) == $: ifTrue:[
@@ -3110,12 +3125,15 @@
 
                     codeView replaceFromCharacterPosition:start to:stop with:newPart.
 
-                    oldLen := stop - start + 1.
-                    newLen := newPart size.
-
                     "/ codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
-                    newCursorPosition := stop + (newLen-oldLen).
+                    newCursorPosition isNil ifTrue:[ 
+                        oldLen := stop - start + 1.
+                        newLen := newPart size.
+
+                        newCursorPosition := stop + (newLen-oldLen) 
+                    ].
                 ].
+
                 codeView cursorToCharacterPosition:newCursorPosition.
                 codeView cursorRight.  "/ avoid going to the next line !!
                 ((best endsWith:':') and:[numArgs == 1]) ifTrue:[
@@ -3489,10 +3507,10 @@
 !DoWhatIMeanSupport class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.109 2013-07-24 10:41:24 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.110 2013-07-24 19:33:04 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.109 2013-07-24 10:41:24 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.110 2013-07-24 19:33:04 cg Exp $'
 ! !