JavaScriptCompletionEngine.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 24 Sep 2013 23:18:24 +0200
branchinitialV
changeset 1180 01c6be61f29c
parent 700 7a5a081a7e32
child 712 0f50a866727b
permissions -rw-r--r--
checkin from stx browser

"{ Package: 'stx:libjavascript' }"

Object subclass:#JavaScriptCompletionEngine
	instanceVariableNames:'method class context codeView parser node requestor'
	classVariableNames:''
	poolDictionaries:''
	category:'Languages-JavaScript-Compiling & Parsing'
!


!JavaScriptCompletionEngine methodsFor:'accessing'!

klass
    context notNil ifTrue:[
         ^ context receiver class
    ].
    method notNil ifTrue:[
         ^ method mclass
    ].
    class notNil ifTrue:[
         ^ class
    ].
    ^ nil

    "Created: / 23-09-2013 / 14:49:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaScriptCompletionEngine methodsFor:'completion'!

completeForMethod:methodOrNil class:classOrNil context:contextOrNil codeView:codeViewArg into:actionBlock
    | cursorPosition |

    method := methodOrNil.
    class := classOrNil.
    context := contextOrNil.
    codeView := codeViewArg.
    requestor := actionBlock. 

    

    cursorPosition := codeView characterPositionOfCursor - 1.
    parser := JavaScriptCompletionParser new.
    parser nodeRewriteHook: [:n | 
        (node isNil and:[cursorPosition between: n startPosition and: n endPosition]) ifTrue:[
             node := n.
        ].
        n
    ].
    parser parseMethod: codeView contents in: self klass ignoreErrors:true ignoreWarnings:true.

    node notNil ifTrue:[
        node isVariableNode ifTrue:[
             self completeVariable.
             ^ self
        ].
    ].

    self breakPoint: #jv.

    "Created: / 23-09-2013 / 13:49:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (format): / 23-09-2013 / 21:32:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaScriptCompletionEngine methodsFor:'completion-private'!

completeVariable
    | klass variables editor |

    klass := self klass.
    variables := parser methodArgs , parser methodVars , class allInstVarNames.
    editor := [:index |
        |answer start stop oldVar oldLen newLen |

        answer := variables at:index.

        start := node startPosition.
        stop := node endPosition.
        oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.

        oldLen := stop - start + 1.
        newLen := answer size.

        codeView
            undoableDo:[ 
                codeView replaceFromCharacterPosition:start to:stop with:(answer).

                (answer startsWith:oldVar) ifTrue:[
                    codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
                ] ifFalse:[
                    codeView selectFromCharacterPosition:start to:start+newLen-1.
                ].
                codeView dontReplaceSelectionOnInput
            ]
            info:'Completion'.
    ].

    requestor value: variables value: editor value: 'Variable'

    "Created: / 23-09-2013 / 21:05:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaScriptCompletionEngine class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
! !