--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/GroovyEvaluator.st Sat Feb 16 19:08:45 2013 +0100
@@ -0,0 +1,236 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+ SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice. This software may not
+ be provided or otherwise made available to, or used by, any
+ other person. No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+ of one of the above copright owners. For exact set of such code,
+ see the differences between this version and version stx:libjava
+ as of 1.9.2010
+"
+"{ Package: 'stx:libjava' }"
+
+Object subclass:#GroovyEvaluator
+ instanceVariableNames:'requestor source'
+ classVariableNames:'WorkspaceBinding'
+ poolDictionaries:''
+ category:'Languages-Groovy-Compiler'
+!
+
+!GroovyEvaluator class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+ SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice. This software may not
+ be provided or otherwise made available to, or used by, any
+ other person. No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+ of one of the above copright owners. For exact set of such code,
+ see the differences between this version and version stx:libjava
+ as of 1.9.2010
+
+"
+! !
+
+!GroovyEvaluator class methodsFor:'* As yet uncategorized *'!
+
+evaluate: source in: context receiver: receiver notifying: requestor logged: log ifFail: failblock
+ ^self new evaluate: source in: context receiver: receiver notifying: requestor logged: log ifFail: failblock
+
+ "Created: / 13-04-2012 / 17:24:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GroovyEvaluator class methodsFor:'utilities'!
+
+flushWorkspaceBinding
+
+ WorkspaceBinding := nil
+
+ "Created: / 02-12-2011 / 23:23:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GroovyEvaluator methodsFor:'accessing'!
+
+currentNameSpace: ns
+ ns notNil ifTrue:[
+ self error:'Smalltalk namespaces not supported by Groovy'
+ ].
+
+ "Created: / 01-08-2012 / 11:18:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+currentNamespace: ns
+ self currentNameSpace: ns
+
+ "Created: / 07-04-2012 / 09:26:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GroovyEvaluator methodsFor:'compiler interface'!
+
+evaluate:src
+ | result |
+
+ result := self evaluate:src in: nil receiver: nil notifying: nil logged: false ifFail: [self error:'Evaluation failed'].
+ ^result.
+
+ "Created: / 02-09-2011 / 10:24:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+evaluate: sourceObj in: context receiver: receiver notifying: requestorObj logged: logged ifFail: fail
+ | binding result wsForWorkspace |
+
+ JavaVM booted ifFalse: [
+ Java initialize.
+ JavaVM initializeVM.
+ ].
+
+ requestor := requestorObj.
+ source := sourceObj.
+ wsForWorkspace := requestor notNil and: [ requestor application isKindOf: WorkspaceApplication ].
+ binding := (Java classForName: 'groovy.lang.Binding') new.
+
+ wsForWorkspace ifTrue: [
+ WorkspaceBinding isNil ifTrue: [
+ WorkspaceBinding := (JavaVM classForName: 'groovy.lang.Binding') new.
+ ].
+ binding := WorkspaceBinding
+ ] ifFalse: [
+
+ binding setVariable: 'this' to: receiver.
+ binding setVariable: 'self' to: receiver.
+ context notNil ifTrue:[
+ | pc |
+
+ binding setVariable: 'thisContext' to: context.
+ pc := context pc.
+ context method localVariableTable do:[:entry|
+ (pc between: entry startPC and: entry endPC) ifTrue:[
+ binding setVariable: entry name to: (context at: entry slot + 1)
+ ].
+ ].
+ ]
+
+ ].
+
+ result := self evaluate: source withBinding: binding.
+ ^ result class javaUnwrap: result.
+
+ "Created: / 17-08-2011 / 08:54:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+evaluate: source withBinding: binding
+ "Given a binding, evaluates given a code"
+
+ | shell result |
+
+ [
+ shell := (Java classForName: 'groovy.lang.GroovyShell') newCleared.
+ shell perform: #'<init>(Lgroovy/lang/Binding;)V' with: binding.
+ result := shell
+ perform: #'evaluate(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;'
+ with: (Java as_String: source string)
+ with: (Java as_String: 'doIt')
+ ] on: JAVA org codehaus groovy control CompilationFailedException do:[:ex|
+ self syntaxError: ex.
+ ].
+
+ ^ result class javaUnwrap: result.
+
+ "Created: / 21-08-2012 / 14:08:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+moreSharedPools: pools
+
+ "Ignored for Java"
+
+ "Created: / 16-08-2011 / 10:15:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GroovyEvaluator methodsFor:'error reporting'!
+
+syntaxError: exception
+ | error cause |
+
+ error := exception getErrorCollector getError: 0.
+ cause := error getCause.
+ self syntaxError: exception cause: cause.
+
+ "Created: / 21-08-2012 / 14:17:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+syntaxError:message cause: cause
+ "Notify requestor of an error - if there is no requestor
+ put it on the transcript. Requestor is typically the CodeView
+ in which the accept/doIt was triggered, or the PositionableStream
+ which does the fileIn. The requestor may decide how to highlight the
+ error (and/or to abort the compile).
+ Return the result passed back by the requestor."
+
+ | sourceStream startCol endCol |
+
+ (Smalltalk isInitialized not and:[Smalltalk isStandAloneDebug]) ifTrue:[
+ "/ error during startup, but sometimes we expect an error and want to supress it
+ (Smalltalk at:#Parser) parseWarningSignal query ~~ #ignore ifTrue:[
+ thisContext fullPrintAll.
+ ].
+ ].
+
+
+ "/ backward compatibility - will vanish eventually (use a handler, Luke)
+
+ sourceStream := source string readStream.
+ cause getLine - 1 timesRepeat:[ sourceStream nextLine ].
+ startCol := sourceStream position - 1 + cause getStartColumn.
+ endCol := sourceStream position - 1 + cause getEndColumn.
+
+ (requestor notNil and:[requestor isTextView]) ifTrue:[
+ requestor error: cause getOriginalMessage position: startCol to: endCol from: self.
+ ^ self
+ ].
+ (Smalltalk at:#'Parser::ParseError') isHandled ifTrue:[
+ (Smalltalk at:#'Parser::ParseError') new
+ errorMessage: cause getOriginalMessage startPosition:startCol endPosition:endCol;
+ parameter:self;
+ lineNumber:cause getLine;
+ raiseRequest.
+ ].
+
+ "Created: / 21-08-2012 / 17:10:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GroovyEvaluator class methodsFor:'documentation'!
+
+version_CVS
+ ^ '$Header: /cvs/stx/stx/libjava/GroovyEvaluator.st,v 1.1 2013-02-16 18:08:32 vrany Exp $'
+!
+
+version_HG
+
+ ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+ ^ '§Id§'
+! !
+