@@ -4,9 +4,9 @@ import androidx.compose.runtime.mutableStateListOf
44import androidx.compose.runtime.mutableStateOf
55import com.sun.jdi.Bootstrap
66import com.sun.jdi.VirtualMachine
7- import com.sun.jdi.VirtualMachineManager
87import com.sun.jdi.connect.AttachingConnector
98import kotlinx.coroutines.*
9+ import org.gradle.internal.logging.events.OutputEvent
1010import org.gradle.tooling.BuildLauncher
1111import org.gradle.tooling.GradleConnector
1212import org.gradle.tooling.ProjectConnection
@@ -17,12 +17,13 @@ import processing.app.Base
1717import processing.app.Messages
1818import processing.app.Platform
1919import processing.app.ui.Editor
20- import java.io.File
20+ import java.io.*
2121import javax.swing.SwingUtilities
2222import javax.swing.event.DocumentEvent
2323import javax.swing.event.DocumentListener
2424import kotlin.io.path.writeText
2525
26+
2627class GradleService (val editor : Editor ) {
2728 val availableTasks = mutableStateListOf<String >()
2829 val finishedTasks = mutableStateListOf<String >()
@@ -39,6 +40,7 @@ class GradleService(val editor: Editor) {
3940
4041 val folder: File get() = editor.sketch.folder
4142
43+ // TODO: Capture output & enable at start of running
4244
4345 fun prepare (){
4446 Messages .log(" Preparing sketch" )
@@ -64,6 +66,7 @@ class GradleService(val editor: Editor) {
6466 startRun {
6567 connection.newSketchBuild()
6668 .addDebugging()
69+ .addProgressListener(listOf (" :run" ))
6770 .forTasks(" run" )
6871 .withCancellationToken(cancel.token())
6972 .run ()
@@ -77,6 +80,7 @@ class GradleService(val editor: Editor) {
7780 Messages .log(" Exporting sketch" )
7881 startRun {
7982 connection.newSketchBuild()
83+ .addProgressListener(listOf (" :runDistributable" ))
8084 .forTasks(" runDistributable" )
8185 .withCancellationToken(cancel.token())
8286 .run ()
@@ -118,6 +122,7 @@ class GradleService(val editor: Editor) {
118122
119123 // TODO: Attach listener if new tab is created
120124 }
125+ // TODO: Stop on dispose
121126 }
122127
123128 private fun startRun (action : () -> Unit ){
@@ -128,7 +133,16 @@ class GradleService(val editor: Editor) {
128133
129134 cancel.cancel()
130135 cancel = GradleConnector .newCancellationTokenSource()
131- action()
136+
137+ editor.console.clear()
138+
139+ try {
140+ action()
141+ }catch (e: Exception ){
142+ Messages .log(" Error while running sketch: ${e.message} " )
143+ return @launch
144+ }
145+
132146 }
133147 run?.invokeOnCompletion { running.value = run?.isActive ? : false }
134148 }
@@ -138,18 +152,33 @@ class GradleService(val editor: Editor) {
138152 if (event !is TaskStartEvent ) return @ProgressListener
139153 if (event.descriptor.name != " :run" ) return @ProgressListener
140154
141- Messages .log(" Running sketch " )
155+ Messages .log(" Attaching to VM " )
142156 val connector = Bootstrap .virtualMachineManager().allConnectors()
143157 .firstOrNull { it.name() == " com.sun.jdi.SocketAttach" }
144158 as AttachingConnector ?
145159 ? : return @ProgressListener
146160 val args = connector.defaultArguments()
147161 args[" port" ]?.setValue(debugPort.toString())
148- vm = connector.attach(args)
162+ val vm = connector.attach(args)
163+ this @GradleService.vm = vm
164+ Messages .log(" Attached to VM: ${vm.name()} " )
149165 })
150166 return this
151167 }
152168
169+ private fun BuildLauncher.addProgressListener (skipping : List <String > ): BuildLauncher {
170+ this .addProgressListener(ProgressListener { event ->
171+ val name = event.descriptor.name
172+ if (skipping.contains(name)) return @ProgressListener
173+ if (event is TaskStartEvent ) {
174+ if (! availableTasks.contains(name)) availableTasks.add(name)
175+ }
176+ if (event is TaskFinishEvent ){
177+ finishedTasks.add(name)
178+ }
179+ })
180+ return this
181+ }
153182
154183 private fun ProjectConnection.newSketchBuild (): BuildLauncher {
155184 finishedTasks.clear()
@@ -226,25 +255,12 @@ class GradleService(val editor: Editor) {
226255 }
227256
228257 return this .newBuild()
229- // .setJavaHome(Platform.getJavaHome())
258+ .setJavaHome(Platform .getJavaHome())
230259 .withArguments(
231260 " --init-script" , initGradle.toAbsolutePath().toString(),
232261 * variables.entries.map { " -Pprocessing.${it.key} =${it.value} " }.toTypedArray()
233262 )
234- .addProgressListener(ProgressListener { event ->
235- val name = event.descriptor.name
236- if (event is TaskStartEvent ) {
237- if (! availableTasks.contains(name)) availableTasks.add(name)
238- }
239- if (event is TaskFinishEvent ){
240- finishedTasks.add(name)
241- }
242- })
243- .apply {
244- if (Base .DEBUG ) {
245- setStandardError(System .err)
246- setStandardOutput(System .out )
247- }
248- }
263+ .setStandardError(System .err)
264+ .setStandardOutput(System .out )
249265 }
250266}
0 commit comments