Initial support for complete-as-you-type.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Tue, 24 Sep 2013 01:53:26 +0100
changeset 100 6d2fb43e661b
parent 99 6943778c2db7
child 101 a300290bf8fc
Initial support for complete-as-you-type. Highly experimental, do not use it now!
Make.proto
SmallSense__CodeNavigationService.st
SmallSense__CompletionWindow.st
SmallSense__EditSupport.st
SmallSense__SmalltalkEditSupport.st
SmallSense__SmalltalkLintService.st
SmallSense__SmalltalkSyntaxHighlighter.st
bc.mak
extensions.st
jv_smallsense.st
smallsense.rc
--- a/Make.proto	Mon Sep 23 14:36:49 2013 +0100
+++ b/Make.proto	Tue Sep 24 01:53:26 2013 +0100
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libview2 -I$(INCLUDE_TOP)/stx/libhtml -I$(INCLUDE_TOP)/stx/libtool -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/helpers -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/lint -I$(INCLUDE_TOP)/stx/libcomp -I$(INCLUDE_TOP)/stx/libview -I$(INCLUDE_TOP)/stx/libwidg2
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libview2 -I$(INCLUDE_TOP)/stx/libwidg -I$(INCLUDE_TOP)/stx/libhtml -I$(INCLUDE_TOP)/stx/libtool -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/helpers -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/lint -I$(INCLUDE_TOP)/stx/libcomp -I$(INCLUDE_TOP)/stx/libview -I$(INCLUDE_TOP)/stx/libwidg2
 
 
 # if you need any additional defines for embedded C code,
@@ -205,7 +205,7 @@
 $(OUTDIR)SmallSense__UnionType.$(O) SmallSense__UnionType.$(H): SmallSense__UnionType.st $(INCLUDE_TOP)/jv/smallsense/SmallSense__Type.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__UnknownType.$(O) SmallSense__UnknownType.$(H): SmallSense__UnknownType.st $(INCLUDE_TOP)/jv/smallsense/SmallSense__Type.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__VariablePO.$(O) SmallSense__VariablePO.$(H): SmallSense__VariablePO.st $(INCLUDE_TOP)/jv/smallsense/SmallSense__PO.$(H) $(INCLUDE_TOP)/stx/libwidg2/HierarchicalItem.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libcomp/AssignmentNode.$(H) $(INCLUDE_TOP)/stx/libcomp/MessageNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseErrorNode.$(H) $(INCLUDE_TOP)/stx/libcomp/PrimaryNode.$(H) $(INCLUDE_TOP)/stx/libcomp/StatementNode.$(H) $(INCLUDE_TOP)/stx/libbasic/UserPreferences.$(H) $(INCLUDE_TOP)/stx/libbasic/IdentityDictionary.$(H) $(INCLUDE_TOP)/stx/libbasic/Dictionary.$(H) $(INCLUDE_TOP)/stx/libbasic/Set.$(H) $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libcomp/VariableNode.$(H) $(INCLUDE_TOP)/stx/libbasic/ConfigurableFeatures.$(H) $(INCLUDE_TOP)/stx/goodies/refactoryBrowser/lint/RBLintRule.$(H) $(INCLUDE_TOP)/stx/goodies/refactoryBrowser/lint/RBTransformationRule.$(H) $(INCLUDE_TOP)/stx/libhtml/HTMLDocumentView.$(H) $(INCLUDE_TOP)/stx/libhtml/HTMLDocumentFrame.$(H) $(INCLUDE_TOP)/stx/libview/View.$(H) $(INCLUDE_TOP)/stx/libview/SimpleView.$(H) $(INCLUDE_TOP)/stx/libview/DisplaySurface.$(H) $(INCLUDE_TOP)/stx/libview/GraphicsMedium.$(H) $(INCLUDE_TOP)/stx/libview/DeviceGraphicsContext.$(H) $(INCLUDE_TOP)/stx/libview/GraphicsContext.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__CodeHighlightingService.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__BackgroundSourceProcessingService.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__CodeViewService.$(H) $(INCLUDE_TOP)/stx/libwidg2/DoWhatIMeanSupport.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__NavigationState.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__CodeCompletionService.$(H) $(INCLUDE_TOP)/stx/libcomp/BlockNode.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__CodeNavigationService.$(H) $(STCHDR)
+$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libcomp/AssignmentNode.$(H) $(INCLUDE_TOP)/stx/libcomp/MessageNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseErrorNode.$(H) $(INCLUDE_TOP)/stx/libcomp/PrimaryNode.$(H) $(INCLUDE_TOP)/stx/libcomp/StatementNode.$(H) $(INCLUDE_TOP)/stx/libbasic/UserPreferences.$(H) $(INCLUDE_TOP)/stx/libbasic/IdentityDictionary.$(H) $(INCLUDE_TOP)/stx/libbasic/Dictionary.$(H) $(INCLUDE_TOP)/stx/libbasic/Set.$(H) $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libcomp/VariableNode.$(H) $(INCLUDE_TOP)/stx/libbasic/ConfigurableFeatures.$(H) $(INCLUDE_TOP)/stx/goodies/refactoryBrowser/lint/RBLintRule.$(H) $(INCLUDE_TOP)/stx/goodies/refactoryBrowser/lint/RBTransformationRule.$(H) $(INCLUDE_TOP)/stx/libhtml/HTMLDocumentView.$(H) $(INCLUDE_TOP)/stx/libhtml/HTMLDocumentFrame.$(H) $(INCLUDE_TOP)/stx/libview/View.$(H) $(INCLUDE_TOP)/stx/libview/SimpleView.$(H) $(INCLUDE_TOP)/stx/libview/DisplaySurface.$(H) $(INCLUDE_TOP)/stx/libview/GraphicsMedium.$(H) $(INCLUDE_TOP)/stx/libview/DeviceGraphicsContext.$(H) $(INCLUDE_TOP)/stx/libview/GraphicsContext.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__CodeHighlightingService.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__BackgroundSourceProcessingService.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__CodeViewService.$(H) $(INCLUDE_TOP)/stx/libwidg2/DoWhatIMeanSupport.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__NavigationState.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__CodeCompletionService.$(H) $(INCLUDE_TOP)/stx/libcomp/BlockNode.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__CodeNavigationService.$(H) $(INCLUDE_TOP)/stx/libwidg/Workspace.$(H) $(INCLUDE_TOP)/stx/libwidg/TextCollector.$(H) $(INCLUDE_TOP)/stx/libwidg/EditTextView.$(H) $(INCLUDE_TOP)/stx/libwidg/TextView.$(H) $(INCLUDE_TOP)/stx/libwidg/ListView.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
 
--- a/SmallSense__CodeNavigationService.st	Mon Sep 23 14:36:49 2013 +0100
+++ b/SmallSense__CodeNavigationService.st	Tue Sep 24 01:53:26 2013 +0100
@@ -25,7 +25,7 @@
 button1Press
     | node |
 
-    node := codeView currentParseNode.
+    node := currentNodeHolder value.
     node isNil ifTrue:[ 
         ^ self 
     ].
@@ -42,7 +42,7 @@
 
     "Created: / 14-02-2010 / 18:43:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 18-11-2011 / 14:58:02 / cg"
-    "Modified: / 21-02-2012 / 14:30:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-09-2013 / 00:47:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 button1PressForMessageNode: node
--- a/SmallSense__CompletionWindow.st	Mon Sep 23 14:36:49 2013 +0100
+++ b/SmallSense__CompletionWindow.st	Tue Sep 24 01:53:26 2013 +0100
@@ -4,7 +4,7 @@
 
 SimpleDialog subclass:#CompletionWindow
 	instanceVariableNames:'codeView result position textHolder selectionHolder
-		selectionUnambigous listHolder listView'
+		selectionUnambigous listHolder listView closeAction'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'SmallSense-Core-Interface'
@@ -73,6 +73,16 @@
       )
 ! !
 
+!CompletionWindow methodsFor:'accessing'!
+
+closeAction
+    ^ closeAction
+!
+
+closeAction:aBlock
+    closeAction := aBlock.
+! !
+
 !CompletionWindow methodsFor:'aspects'!
 
 listHolder
@@ -302,6 +312,13 @@
 
 !CompletionWindow methodsFor:'hooks'!
 
+closeDownViews
+    closeAction value.
+    super closeDownViews.
+
+    "Created: / 24-09-2013 / 01:15:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 postBuildList: aView
 
     listView := aView scrolledView.
@@ -389,10 +406,10 @@
             - 16"icon" - (textView widthOfString: self textHolder value) - 5"magic constant".
     y := textView yOfCursor + textView font maxHeight + 3.
     p := (textView originRelativeTo: nil) + (x @ y).
-
     self openInterfaceModal:#windowSpec at:p
 
     "Created: / 04-04-2011 / 21:12:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-09-2013 / 01:36:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !CompletionWindow methodsFor:'opening'!
--- a/SmallSense__EditSupport.st	Mon Sep 23 14:36:49 2013 +0100
+++ b/SmallSense__EditSupport.st	Tue Sep 24 01:53:26 2013 +0100
@@ -3,7 +3,8 @@
 "{ NameSpace: SmallSense }"
 
 Object subclass:#EditSupport
-	instanceVariableNames:'service textView backspaceIsUndo'
+	instanceVariableNames:'service textView backspaceIsUndo completionWindow
+		completionSuppressed'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'SmallSense-Core-Services'
@@ -42,9 +43,11 @@
 service:aSmallSenseService
     service := aSmallSenseService.
     textView := aSmallSenseService textView.
+    completionWindow := nil.
+    completionSuppressed := false.
     backspaceIsUndo := false.
 
-    "Modified: / 17-09-2013 / 23:16:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-09-2013 / 01:18:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !EditSupport methodsFor:'editing'!
@@ -81,13 +84,20 @@
 
 !EditSupport methodsFor:'event handling'!
 
-doKeyPressKeyComplete                                                  
+doKeyPressComplete
+    ^ self doKeyPressComplete: false
+
+    "Created: / 04-08-2013 / 02:33:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-09-2013 / 00:53:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doKeyPressComplete: auto 
     "Not supported in generic edit support"
-
+    
     textView flash.
-    ^ true
+    ^ auto not
 
-    "Created: / 04-08-2013 / 02:31:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 24-09-2013 / 00:59:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 keyPress: key x:x y:y in: view
@@ -96,14 +106,43 @@
      If the method returns true, the event will not be processed
      by the view."
 
+    | codeView line |
+
     key == #CodeCompletion  ifTrue: [
-        ^ self doKeyPressKeyComplete. 
+        ^ self doKeyPressComplete. 
     ].
 
+
+
+    (key isCharacter and:[key isAlphaNumeric and:[UserPreferences current immediateCodeCompletion]]) ifTrue:[
+        completionSuppressed ifTrue:[ ^ false ].
+"/        completionWindow notNil ifTrue:[ ^ false ].
+
+        codeView := service codeView.
+        line := (codeView list at: codeView cursorLine).
+        line isEmptyOrNil ifTrue:[ ^ false ].
+        line := line string.
+
+        ((line size >= codeView cursorCol) and:[
+            (line at: codeView cursorCol) isAlphaNumeric]) ifTrue:[ ^ false ].
+        (line size < (codeView cursorCol - 1)) ifTrue:[ ^ false ].
+        (line at: codeView cursorCol - 1) isAlphaNumeric ifFalse:[ ^ false ].
+        (line at: codeView cursorCol - 2) isAlphaNumeric ifFalse:[ ^ false ].
+
+
+        completionSuppressed := true.
+        codeView sensor pushUserEvent: #doKeyPressComplete: for: self  withArgument: true.
+
+    ] ifFalse:[
+         completionSuppressed := false.
+
+    ].
+
+
     ^false
 
     "Created: / 24-07-2013 / 23:31:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified (format): / 17-09-2013 / 23:18:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-09-2013 / 01:49:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !EditSupport methodsFor:'private'!
--- a/SmallSense__SmalltalkEditSupport.st	Mon Sep 23 14:36:49 2013 +0100
+++ b/SmallSense__SmalltalkEditSupport.st	Tue Sep 24 01:53:26 2013 +0100
@@ -37,98 +37,107 @@
 
 !SmalltalkEditSupport methodsFor:'event handling'!
 
-doKeyPressKeyComplete
-    |cls 
+doKeyPressComplete: auto 
+    | cls  
 "/     crsrPos interval node checkedNode
 "/     char start stop selectorSoFar matchingSelectors
     codeView |
 
     codeView := service codeView.
-
     cls := codeView classHolder value.
-    cls isNil ifTrue:[
-        codeView showInfo:'No class'.
+    cls isNil ifTrue: [
+        codeView showInfo: 'No class'.
         ^ true.
     ].
-    UserInformation handle:[:ex |
-        codeView showInfo:(ex messageText).
-        ex proceed.
-    ] do:[
-        codeView withWaitCursorDo:[
-            | p node text items |
-
-            codeView textView keyRelease: #Control_L x:0 y:0.
-            p := codeView characterPositionOfCursor.
-            items := Recognizer
-                                    resultSetFor: codeView mode
-                                    source: codeView contents
-                                    class: cls
-                                    line: codeView cursorLine
-                                    column: codeView cursorCol.
+    UserInformation 
+        handle: [:ex | 
+            codeView showInfo: (ex messageText).
+            ex proceed.
+        ]
+        do: [
+            codeView 
+                withWaitCursorDo: [
+                    | p  node  text  items |
 
-            items notEmptyOrNil ifTrue:[
-                (p := items position) notNil ifTrue:[
-                    node := p node.                    
-                    node notNil ifTrue:[
-                        (node isVariable and:[p isInNode]) ifTrue:[
-                            text := node name
-                        ] ifFalse:[node isMessage ifTrue:[
-                            text := node selector
-                        ]].
-                    ].            
-                ].
-            ].    
-
-            CompletionWindow openForView: codeView text: text items: items.
-        ]
-    ].
+                    auto ifFalse:[
+                        codeView textView keyRelease: #'Control_L' x: 0 y: 0.
+                    ].
+                    p := codeView characterPositionOfCursor.
+                    items := Recognizer 
+                            resultSetFor: codeView mode
+                            source: codeView contents
+                            class: cls
+                            line: codeView cursorLine
+                            column: codeView cursorCol.
+                    items notEmptyOrNil ifTrue: [
+                        (p := items position) notNil ifTrue: [
+                            node := p node.
+                            node notNil ifTrue: [
+                                (node isVariable and: [ p isInNode ]) ifTrue: [
+                                    text := node name
+                                ] ifFalse: [
+                                    node isMessage ifTrue: [
+                                        text := node selector
+                                    ]
+                                ].
+                            ].
+                        ].
+                    ].
+                    (auto not or: [ items notEmptyOrNil ]) ifTrue: [
+                        completionWindow := CompletionWindow 
+                            openForView: codeView
+                            text: text
+                            items: items.
+                        completionWindow closeAction:[completionWindow := nil].
+                    ].
+                ]
+        ].
     ^ true.
 
-"/
-"/    interval := self selectedInterval.
-"/    interval isEmpty ifTrue:[
-"/        crsrPos := codeView characterPositionOfCursor - 1.
-"/        char := codeView characterUnderCursor.
-"/        [crsrPos > 1 and:[char isSeparator or:['.' includes:char]]] whileTrue:[
-"/            crsrPos := crsrPos - 1.
-"/            char := codeView characterAtCharacterPosition:crsrPos.
-"/        ].
-"/        interval := crsrPos to:crsrPos.
-"/    ].
-"/
-"/    node := self findNodeForInterval:interval allowErrors:true.
-"/    [node isNil] whileTrue:[
-"/        "/ expand to the left ...
-"/        interval start > 1 ifFalse:[
-"/            self showInfo:'No parseNode found'.
-"/            ^ self.
-"/        ].
-"/        interval start:(interval start - 1).
-"/        node := self findNodeForInterval:interval allowErrors:true.
-"/    ].
-"/
-"/    node isVariable ifTrue:[
-"/        self codeCompletionForVariable:node inClass:cls.
-"/        ^ self.
-"/    ].
-"/
-"/    checkedNode := node.
-"/    [checkedNode notNil] whileTrue:[
-"/        checkedNode isMessage ifTrue:[
-"/            self codeCompletionForMessage:checkedNode inClass:cls.
-"/            ^ self
-"/        ].
-"/        checkedNode isMethod ifTrue:[
-"/            self codeCompletionForMethod:checkedNode inClass:cls.
-"/            ^ self.
-"/        ].
-"/        checkedNode := checkedNode parent.
-"/    ].
-"/
-"/    self showInfo:'Node is neither variable nor message.'.
+    "/
+    "/    interval := self selectedInterval.
+    "/    interval isEmpty ifTrue:[
+    "/        crsrPos := codeView characterPositionOfCursor - 1.
+    "/        char := codeView characterUnderCursor.
+    "/        [crsrPos > 1 and:[char isSeparator or:['.' includes:char]]] whileTrue:[
+    "/            crsrPos := crsrPos - 1.
+    "/            char := codeView characterAtCharacterPosition:crsrPos.
+    "/        ].
+    "/        interval := crsrPos to:crsrPos.
+    "/    ].
+    "/
+    "/    node := self findNodeForInterval:interval allowErrors:true.
+    "/    [node isNil] whileTrue:[
+    "/        "/ expand to the left ...
+    "/        interval start > 1 ifFalse:[
+    "/            self showInfo:'No parseNode found'.
+    "/            ^ self.
+    "/        ].
+    "/        interval start:(interval start - 1).
+    "/        node := self findNodeForInterval:interval allowErrors:true.
+    "/    ].
+    "/
+    "/    node isVariable ifTrue:[
+    "/        self codeCompletionForVariable:node inClass:cls.
+    "/        ^ self.
+    "/    ].
+    "/
+    "/    checkedNode := node.
+    "/    [checkedNode notNil] whileTrue:[
+    "/        checkedNode isMessage ifTrue:[
+    "/            self codeCompletionForMessage:checkedNode inClass:cls.
+    "/            ^ self
+    "/        ].
+    "/        checkedNode isMethod ifTrue:[
+    "/            self codeCompletionForMethod:checkedNode inClass:cls.
+    "/            ^ self.
+    "/        ].
+    "/        checkedNode := checkedNode parent.
+    "/    ].
+    "/
+    "/    self showInfo:'Node is neither variable nor message.'.
 
-    "Created: / 04-08-2013 / 02:33:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 19-08-2013 / 15:14:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 24-09-2013 / 00:53:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 keyPress: key x:x y:y in: view
@@ -164,7 +173,7 @@
     ^ super keyPress: key x:x y:y in: view
 
     "Created: / 07-03-2010 / 09:36:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 17-09-2013 / 23:19:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-09-2013 / 00:58:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 keyPressReturn
--- a/SmallSense__SmalltalkLintService.st	Mon Sep 23 14:36:49 2013 +0100
+++ b/SmallSense__SmalltalkLintService.st	Tue Sep 24 01:53:26 2013 +0100
@@ -326,7 +326,7 @@
 rehighlight: delayed
 
     | service |
-    service := self service: SyntaxHighlightingService name.
+    service := self service: SmallSense::CodeHighlightingService name.
     service isNil ifTrue:[
         service := self service: Tools::CodeHighlightingService name
     ].
@@ -335,7 +335,7 @@
     ]
 
     "Created: / 27-01-2012 / 17:06:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 06-08-2013 / 10:32:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 23-09-2013 / 22:27:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 showInfoWindowForLine: lineNo
--- a/SmallSense__SmalltalkSyntaxHighlighter.st	Mon Sep 23 14:36:49 2013 +0100
+++ b/SmallSense__SmalltalkSyntaxHighlighter.st	Tue Sep 24 01:53:26 2013 +0100
@@ -631,6 +631,26 @@
     "Modified: / 16-02-2012 / 23:39:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+primary_identifier
+    | node |
+
+    ignoreBadIdentifier := classToCompileFor isNil.
+    node := super primary_identifier.
+    ignoreBadIdentifier := false.
+    node isVariable ifTrue:[
+        | el prevEl |
+
+        el := elements newElementFor: node.
+        prevEl := lastVariableElements at:node name ifAbsent:[nil].
+        prevEl notNil ifTrue:[prevEl next:el].
+        lastVariableElements at:node name put:el.
+        elements add: el.
+    ].
+    ^node
+
+    "Created: / 24-09-2013 / 00:42:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 unaryExpressionFor:receiverArg
     "parse a unary-expression; return a node-tree, nil or #Error"
 
@@ -698,27 +718,6 @@
 
     "Modified: / 19-01-2012 / 10:47:37 / cg"
     "Created: / 16-02-2012 / 23:50:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-variable
-    | node |
-
-    ignoreBadIdentifier := classToCompileFor isNil.
-    node := super variable.
-    ignoreBadIdentifier := false.
-    node isVariable ifTrue:[
-	| el prevEl |
-
-	el := elements newElementFor: node.
-	prevEl := lastVariableElements at:node name ifAbsent:[nil].
-	prevEl notNil ifTrue:[prevEl next:el].
-	lastVariableElements at:node name put:el.
-	elements add: el.
-    ].
-    ^node
-
-    "Modified: / 19-01-2000 / 16:22:16 / cg"
-    "Created: / 16-02-2012 / 22:21:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !SmalltalkSyntaxHighlighter methodsFor:'syntax detection'!
--- a/bc.mak	Mon Sep 23 14:36:49 2013 +0100
+++ b/bc.mak	Tue Sep 24 01:53:26 2013 +0100
@@ -34,7 +34,7 @@
 
 
 
-LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libview2 -I$(INCLUDE_TOP)\stx\libhtml -I$(INCLUDE_TOP)\stx\libtool -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\helpers -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\lint -I$(INCLUDE_TOP)\stx\libcomp -I$(INCLUDE_TOP)\stx\libview -I$(INCLUDE_TOP)\stx\libwidg2
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libview2 -I$(INCLUDE_TOP)\stx\libwidg -I$(INCLUDE_TOP)\stx\libhtml -I$(INCLUDE_TOP)\stx\libtool -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\helpers -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\lint -I$(INCLUDE_TOP)\stx\libcomp -I$(INCLUDE_TOP)\stx\libview -I$(INCLUDE_TOP)\stx\libwidg2
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
@@ -129,7 +129,7 @@
 $(OUTDIR)SmallSense__UnionType.$(O) SmallSense__UnionType.$(H): SmallSense__UnionType.st $(INCLUDE_TOP)\jv\smallsense\SmallSense__Type.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__UnknownType.$(O) SmallSense__UnknownType.$(H): SmallSense__UnknownType.st $(INCLUDE_TOP)\jv\smallsense\SmallSense__Type.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)SmallSense__VariablePO.$(O) SmallSense__VariablePO.$(H): SmallSense__VariablePO.st $(INCLUDE_TOP)\jv\smallsense\SmallSense__PO.$(H) $(INCLUDE_TOP)\stx\libwidg2\HierarchicalItem.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libcomp\AssignmentNode.$(H) $(INCLUDE_TOP)\stx\libcomp\MessageNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseErrorNode.$(H) $(INCLUDE_TOP)\stx\libcomp\PrimaryNode.$(H) $(INCLUDE_TOP)\stx\libcomp\StatementNode.$(H) $(INCLUDE_TOP)\stx\libbasic\UserPreferences.$(H) $(INCLUDE_TOP)\stx\libbasic\IdentityDictionary.$(H) $(INCLUDE_TOP)\stx\libbasic\Dictionary.$(H) $(INCLUDE_TOP)\stx\libbasic\Set.$(H) $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libcomp\VariableNode.$(H) $(INCLUDE_TOP)\stx\libbasic\ConfigurableFeatures.$(H) $(INCLUDE_TOP)\stx\goodies\refactoryBrowser\lint\RBLintRule.$(H) $(INCLUDE_TOP)\stx\goodies\refactoryBrowser\lint\RBTransformationRule.$(H) $(INCLUDE_TOP)\stx\libhtml\HTMLDocumentView.$(H) $(INCLUDE_TOP)\stx\libhtml\HTMLDocumentFrame.$(H) $(INCLUDE_TOP)\stx\libview\View.$(H) $(INCLUDE_TOP)\stx\libview\SimpleView.$(H) $(INCLUDE_TOP)\stx\libview\DisplaySurface.$(H) $(INCLUDE_TOP)\stx\libview\GraphicsMedium.$(H) $(INCLUDE_TOP)\stx\libview\DeviceGraphicsContext.$(H) $(INCLUDE_TOP)\stx\libview\GraphicsContext.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__CodeHighlightingService.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__BackgroundSourceProcessingService.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__CodeViewService.$(H) $(INCLUDE_TOP)\stx\libwidg2\DoWhatIMeanSupport.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__NavigationState.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__CodeCompletionService.$(H) $(INCLUDE_TOP)\stx\libcomp\BlockNode.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__CodeNavigationService.$(H) $(STCHDR)
+$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libcomp\AssignmentNode.$(H) $(INCLUDE_TOP)\stx\libcomp\MessageNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseErrorNode.$(H) $(INCLUDE_TOP)\stx\libcomp\PrimaryNode.$(H) $(INCLUDE_TOP)\stx\libcomp\StatementNode.$(H) $(INCLUDE_TOP)\stx\libbasic\UserPreferences.$(H) $(INCLUDE_TOP)\stx\libbasic\IdentityDictionary.$(H) $(INCLUDE_TOP)\stx\libbasic\Dictionary.$(H) $(INCLUDE_TOP)\stx\libbasic\Set.$(H) $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libcomp\VariableNode.$(H) $(INCLUDE_TOP)\stx\libbasic\ConfigurableFeatures.$(H) $(INCLUDE_TOP)\stx\goodies\refactoryBrowser\lint\RBLintRule.$(H) $(INCLUDE_TOP)\stx\goodies\refactoryBrowser\lint\RBTransformationRule.$(H) $(INCLUDE_TOP)\stx\libhtml\HTMLDocumentView.$(H) $(INCLUDE_TOP)\stx\libhtml\HTMLDocumentFrame.$(H) $(INCLUDE_TOP)\stx\libview\View.$(H) $(INCLUDE_TOP)\stx\libview\SimpleView.$(H) $(INCLUDE_TOP)\stx\libview\DisplaySurface.$(H) $(INCLUDE_TOP)\stx\libview\GraphicsMedium.$(H) $(INCLUDE_TOP)\stx\libview\DeviceGraphicsContext.$(H) $(INCLUDE_TOP)\stx\libview\GraphicsContext.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__CodeHighlightingService.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__BackgroundSourceProcessingService.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__CodeViewService.$(H) $(INCLUDE_TOP)\stx\libwidg2\DoWhatIMeanSupport.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__NavigationState.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__CodeCompletionService.$(H) $(INCLUDE_TOP)\stx\libcomp\BlockNode.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__CodeNavigationService.$(H) $(INCLUDE_TOP)\stx\libwidg\Workspace.$(H) $(INCLUDE_TOP)\stx\libwidg\TextCollector.$(H) $(INCLUDE_TOP)\stx\libwidg\EditTextView.$(H) $(INCLUDE_TOP)\stx\libwidg\TextView.$(H) $(INCLUDE_TOP)\stx\libwidg\ListView.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
 
--- a/extensions.st	Mon Sep 23 14:36:49 2013 +0100
+++ b/extensions.st	Tue Sep 24 01:53:26 2013 +0100
@@ -408,6 +408,16 @@
     "Created: / 27-11-2011 / 16:31:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!Workspace class methodsFor:'defaults - smallsense'!
+
+smallSenseCodeCompletionServiceClass
+    <swizzle: #codeCompletionServiceClass>
+
+    ^ SmallSense::CodeCompletionService
+
+    "Created: / 24-09-2013 / 00:29:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !jv_smallsense class methodsFor:'documentation'!
 
 extensionsVersion_HG
--- a/jv_smallsense.st	Mon Sep 23 14:36:49 2013 +0100
+++ b/jv_smallsense.st	Tue Sep 24 01:53:26 2013 +0100
@@ -52,6 +52,7 @@
         #'stx:libtool'    "AbstractSettingsApplication - superclass of SmallSense::SettingsAppl "
         #'stx:libview'    "DeviceGraphicsContext - extended "
         #'stx:libview2'    "ApplicationModel - superclass of SmallSense::CompletionWindow "
+        #'stx:libwidg'    "EditTextView - extended "
         #'stx:libwidg2'    "DoWhatIMeanSupport - extended "
     )
 !
@@ -241,6 +242,7 @@
         'Tools::CodeCompletionService class' smallSenseIsUsefulFor:
         BlockNode childNamesAndValuesDo:
         'Tools::CodeNavigationService class' new
+        'Workspace class' smallSenseCodeCompletionServiceClass
     )
 ! !
 
--- a/smallsense.rc	Mon Sep 23 14:36:49 2013 +0100
+++ b/smallsense.rc	Tue Sep 24 01:53:26 2013 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "Copyright Claus Gittinger 1988-2011\nCopyright eXept Software AG 1998-2011\0"
       VALUE "ProductName", "Smalltalk/X\0"
       VALUE "ProductVersion", "6.2.3.0\0"
-      VALUE "ProductDate", "Mon, 23 Sep 2013 13:35:47 GMT\0"
+      VALUE "ProductDate", "Tue, 24 Sep 2013 00:52:17 GMT\0"
     END
 
   END