This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 00369b8 GROOVY-9473: Support compiling as Java code in the Groovy
console (closes #1197)
00369b8 is described below
commit 00369b87547c3ce83d1177b50137a59533b61382
Author: Paul King <[email protected]>
AuthorDate: Tue Mar 17 21:22:59 2020 +1000
GROOVY-9473: Support compiling as Java code in the Groovy console (closes
#1197)
---
.../main/groovy/groovy/console/ui/Console.groovy | 53 ++++++++++++----------
.../groovy/groovy/console/ui/ConsoleActions.groovy | 6 +++
.../groovy/console/ui/view/BasicMenuBar.groovy | 1 +
.../groovy/console/ui/view/MacOSXMenuBar.groovy | 1 +
4 files changed, 38 insertions(+), 23 deletions(-)
diff --git
a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/Console.groovy
b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/Console.groovy
index 500ba50..09cc742 100644
---
a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/Console.groovy
+++
b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/Console.groovy
@@ -30,7 +30,9 @@ import groovy.console.ui.text.GroovyFilter
import groovy.console.ui.text.SmartDocumentFilter
import groovy.swing.SwingBuilder
import groovy.transform.CompileStatic
+import groovy.transform.EqualsAndHashCode
import groovy.transform.ThreadInterrupt
+import groovy.transform.TupleConstructor
import groovy.ui.GroovyMain
import org.antlr.v4.gui.TestRig
import org.antlr.v4.runtime.CharStream
@@ -1179,6 +1181,11 @@ class Console implements CaretListener,
HyperlinkListener, ComponentListener, Fo
String name = ((File) Console.this.scriptFile)?.name ?:
(DEFAULT_SCRIPT_NAME_START + Console.this.scriptNameCounter++)
Console.this.shell.run(src, name, [])
}
+
+ @Override
+ Object compile(String src) {
+ shell.getClassLoader().parseClass(src)
+ }
}
@CompileStatic
@@ -1198,33 +1205,28 @@ class Console implements CaretListener,
HyperlinkListener, ComponentListener, Fo
}
return null
}
+
+ @Override
+ Object compile(String src) {
+ Optional<String> optionalPrimaryClassName =
findPrimaryClassName(src)
+ if (optionalPrimaryClassName.isPresent()) {
+ def js = new
JavaShell(Thread.currentThread().contextClassLoader)
+ js.compileAll(optionalPrimaryClassName.get(), src)
+ } else {
+ System.err.println('Initial parsing successful but no public
class found. Compile will not proceed.')
+ }
+ return null
+ }
}
@CompileStatic
+ @EqualsAndHashCode
+ @TupleConstructor
private abstract class SourceType {
String extension
- SourceType(String extension) {
- this.extension = extension
- }
abstract Object run(String src)
-
- @Override
- boolean equals(o) {
- if (this.is(o)) return true
- if (!(o instanceof SourceType)) return false
-
- SourceType that = (SourceType) o
-
- if (extension != that.extension) return false
-
- return true
- }
-
- @Override
- int hashCode() {
- return extension.hashCode()
- }
+ abstract Object compile(String src)
}
void runJava(EventObject evt = null) {
@@ -1458,7 +1460,11 @@ class Console implements CaretListener,
HyperlinkListener, ComponentListener, Fo
return Optional.ofNullable(className)
}
- void compileScript(EventObject evt = null) {
+ void compileAsJava(EventObject evt = null) {
+ compileScript(evt, new JavaSourceType())
+ }
+
+ void compileScript(EventObject evt = null, SourceType st = new
GroovySourceType()) {
if (scriptRunning) {
statusLabel.text = 'Cannot compile script now as a script is
already running. Please wait or use "Interrupt Script" option.'
return
@@ -1472,8 +1478,9 @@ class Console implements CaretListener,
HyperlinkListener, ComponentListener, Fo
// Print the input text
if (showScriptInOutput) {
+ final promptPrefix = "${st.extension}> "
for (line in record.allText.tokenize('\n')) {
- appendOutputNl('groovy> ', promptStyle)
+ appendOutputNl(promptPrefix, promptStyle)
appendOutput(line, commandStyle)
}
appendOutputNl(' \n', promptStyle)
@@ -1484,7 +1491,7 @@ class Console implements CaretListener,
HyperlinkListener, ComponentListener, Fo
runThread = Thread.start {
try {
SwingUtilities.invokeLater { showCompilingMessage() }
- shell.getClassLoader().parseClass(record.allText)
+ st.compile(record.allText)
SwingUtilities.invokeLater { compileFinishNormal() }
} catch (Throwable t) {
SwingUtilities.invokeLater { finishException(t, false) }
diff --git
a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ConsoleActions.groovy
b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ConsoleActions.groovy
index 6e06db3..eea6bcd 100644
---
a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ConsoleActions.groovy
+++
b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ConsoleActions.groovy
@@ -423,6 +423,12 @@ compileAction = action(
shortDescription: 'Compile Groovy Script'
)
+compileJavaAction = action(
+ name: 'Compile as Java',
+ closure: controller.&compileAsJava,
+ shortDescription: 'Compile as Java'
+)
+
commentAction = action(
name: 'Comment',
closure: controller.&comment,
diff --git
a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/view/BasicMenuBar.groovy
b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/view/BasicMenuBar.groovy
index 8252e33..f584595 100644
---
a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/view/BasicMenuBar.groovy
+++
b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/view/BasicMenuBar.groovy
@@ -86,6 +86,7 @@ menuBar {
checkBoxMenuItem(threadInterruptAction, selected:
controller.threadInterrupt)
menuItem(interruptAction)
menuItem(compileAction)
+ menuItem(compileJavaAction)
checkBoxMenuItem(indyAction, selected: controller.indy)
separator()
menuItem(addClasspathJar)
diff --git
a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/view/MacOSXMenuBar.groovy
b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/view/MacOSXMenuBar.groovy
index 20a2cd9..cb741e0 100644
---
a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/view/MacOSXMenuBar.groovy
+++
b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/view/MacOSXMenuBar.groovy
@@ -138,6 +138,7 @@ menuBar {
checkBoxMenuItem(threadInterruptAction, selected:
controller.threadInterrupt)
menuItem(interruptAction, icon:null)
menuItem(compileAction, icon:null)
+ menuItem(compileJavaAction, icon:null)
separator()
menuItem(addClasspathJar)
menuItem(addClasspathDir)