"{ 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$'
! !