Skip to content

Commit 8f47d21

Browse files
committed
Scan libaries for dependencies
1 parent 5d71244 commit 8f47d21

File tree

8 files changed

+87
-24
lines changed

8 files changed

+87
-24
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,7 @@ java/build/
123123
/java/android/example/build
124124
/java/android/example/.processing
125125
/java/gradle/example/build
126+
java/gradle/example/gradle/wrapper/gradle-wrapper.jar
127+
java/gradle/example/gradle/wrapper/gradle-wrapper.properties
128+
java/gradle/example/gradlew
129+
java/gradle/example/gradlew.bat

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ compose.desktop {
101101

102102
dependencies {
103103
implementation(project(":core"))
104+
runtimeOnly(project(":java"))
104105

105106
implementation(libs.flatlaf)
106107

app/src/processing/app/Base.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ public class Base {
6767
*/
6868
static public boolean DEBUG = System.getenv().containsKey("DEBUG");
6969

70+
static public boolean GRADLE = false;
71+
7072
/** True if running via Commander. */
7173
static private boolean commandLine;
7274

app/src/processing/app/gradle/ui/Toolbar.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import androidx.compose.ui.graphics.Color
2222
import androidx.compose.ui.input.pointer.PointerEventType
2323
import androidx.compose.ui.input.pointer.onPointerEvent
2424
import androidx.compose.ui.unit.dp
25+
import processing.app.Base
2526
import processing.app.ui.Editor
2627
import processing.app.ui.EditorToolbar
2728
import processing.app.ui.Theme
@@ -38,7 +39,7 @@ class Toolbar(val editor: Editor) {
3839
val panel = ComposePanel().apply {
3940
setContent {
4041
// TODO: Dynamically switch between the toolbars
41-
val displayNew = true
42+
val displayNew = Base.GRADLE
4243
if(displayNew){
4344
bar.display()
4445
return@setContent

java/gradle/example/brightness.pde

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ void draw() {
2929
rect(barX, 0, barWidth, height);
3030
lastBar = whichBar;
3131
}
32-
}
32+
}

java/gradle/src/main/kotlin/ProcessingPlugin.kt

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -161,27 +161,37 @@ class ProcessingPlugin @Inject constructor(private val objectFactory: ObjectFact
161161
val outputDirectory = project.layout.buildDirectory.asFile.get().resolve( "generated/pde/" + sourceSet.name)
162162
sourceSet.java.srcDir(outputDirectory)
163163

164-
val taskName = sourceSet.getTaskName("preprocess", "PDE")
165-
project.tasks.register(taskName, ProcessingTask::class.java) { task ->
164+
val pdeTaskName = sourceSet.getTaskName("preprocess", "PDE")
165+
project.tasks.register(pdeTaskName, ProcessingTask::class.java) { task ->
166166
task.description = "Processes the ${sourceSet.name} PDE"
167167
task.source = pdeSourceSet
168168
task.outputDirectory = outputDirectory
169169
task.sketchName = sketchName
170170
task.workingDir = workingDir
171171
task.sketchBook = sketchbook
172172
}
173+
val depsTaskName = sourceSet.getTaskName("addDependencies", "PDE")
174+
project.tasks.register(depsTaskName){ task ->
175+
task.dependsOn(pdeTaskName)
176+
task.doLast {
177+
outputDirectory
178+
.listFiles()
179+
?.filter { file -> file.name.endsWith(".dependencies") }
180+
?.map { file ->
181+
val dependencies = file.readLines()
182+
dependencies.forEach { path ->
183+
project.dependencies.add("implementation", project.files(path))
184+
}
185+
}
186+
}
187+
}
173188

174189
project.tasks.named(
175190
sourceSet.compileJavaTaskName
176191
) { task ->
177-
task.dependsOn(taskName)
192+
task.dependsOn(pdeTaskName, depsTaskName)
178193
}
179194
}
180-
181-
// TODO: Move to ProcessingTask after reading the libs from the sketch
182-
File(sketchbook, "libraries").listFiles { file -> file.isDirectory }?.forEach{
183-
project.dependencies.add("implementation", project.fileTree(it).apply { include("**/*.jar") })
184-
}
185195
}
186196
abstract class DefaultPDESourceDirectorySet @Inject constructor(
187197
sourceDirectorySet: SourceDirectorySet,

java/gradle/src/main/kotlin/ProcessingTask.kt

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import org.gradle.work.InputChanges
77
import processing.mode.java.preproc.PdePreprocessor
88
import java.io.File
99
import java.util.concurrent.Callable
10+
import java.util.jar.JarFile
1011
import javax.inject.Inject
1112

1213
abstract class ProcessingTask : SourceTask() {
@@ -45,22 +46,66 @@ abstract class ProcessingTask : SourceTask() {
4546
}.joinToString("\n"){
4647
it.readText()
4748
}
48-
File(outputDirectory, "$sketchName.java")
49-
.bufferedWriter()
50-
.use { out ->
51-
val meta = PdePreprocessor
52-
.builderFor(sketchName)
53-
.build()
54-
.write(out, combined)
49+
val javaFile = File(outputDirectory, "$sketchName.java").bufferedWriter()
5550

51+
val meta = PdePreprocessor
52+
.builderFor(sketchName)
53+
.build()
54+
.write(javaFile, combined)
5655

57-
val importStatement = meta.importStatements
58-
println(sketchBook)
56+
javaFile.flush()
57+
javaFile.close()
5958

60-
// for (import in importStatement) {
61-
// project.dependencies.add("implementation", import)
62-
// }
59+
// Scan all the libaries in the sketchbook
60+
val libraries = File(sketchBook, "libraries")
61+
.listFiles { file -> file.isDirectory }
62+
?.map { folder ->
63+
// Find all the jars in the sketch book
64+
val jars = folder.resolve("library")
65+
.listFiles{ file -> file.extension == "jar" }
66+
?.map{ file ->
67+
68+
// Inside of each jar, look for the defined classes
69+
val jar = JarFile(file)
70+
val classes = jar.entries().asSequence()
71+
.filter { entry -> entry.name.endsWith(".class") }
72+
.map { entry -> entry.name }
73+
.map { it.substringBeforeLast('/').replace('/', '.') }
74+
.distinct()
75+
.toList()
76+
77+
// Return a reference to the jar and its classes
78+
return@map object {
79+
val name = file.name
80+
val path = file
81+
val classes = classes
82+
}
83+
}?: emptyList()
84+
85+
// Save the parsed jars and which folder
86+
return@map object {
87+
val name = folder.name
88+
val path = folder
89+
val jars = jars
90+
}
6391
}
92+
93+
// Loop over the import statements and find the library jars that provide those imports
94+
val dependencies = mutableSetOf<File>()
95+
meta.importStatements.map { import ->
96+
libraries?.map { library ->
97+
library.jars.map { jar ->
98+
jar.classes
99+
.filter { className -> className.startsWith(import.packageName) }
100+
.map { _ ->
101+
dependencies.add(jar.path)
102+
}
103+
}
104+
}
105+
}
106+
// Write the dependencies to a file
107+
val deps = File(outputDirectory, "$sketchName.dependencies")
108+
deps.writeText(dependencies.joinToString("\n") { it.absolutePath })
64109
}
65110

66111
@get:Inject

java/src/processing/mode/java/JavaEditor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ public String getCommentPrefix() {
488488
* Handler for Sketch → Export Application
489489
*/
490490
public void handleExportApplication() {
491-
if(true){
491+
if(Base.GRADLE){
492492
this.service.export();
493493
return;
494494
}
@@ -640,7 +640,7 @@ public void handleTweak() {
640640
}
641641

642642
protected void handleLaunch(boolean present, boolean tweak) {
643-
if(true){
643+
if(Base.GRADLE){
644644
this.service.run();
645645
return;
646646
}

0 commit comments

Comments
 (0)