From 00a67a5344348e59389e0845895b1cd70d617af6 Mon Sep 17 00:00:00 2001 From: Christoph Hegemann Date: Mon, 26 Oct 2026 17:27:55 +0100 Subject: [PATCH 1/2] Use the indexed directory as source root in buildSrc and included builds ScipGradlePlugin used project.getRootDir() as the source root for the javac plugin and scip-kotlinc. buildSrc and included builds have their own root directory, so their documents got paths relative to it: kotlinx-datetime's buildSrc/src/main/kotlin/KotlinUserProjectInfra.kt was indexed as src/main/kotlin/KotlinUserProjectInfra.kt, and thunderbird-android's included build components/ui/bolt/... as ui/bolt/... The init script now passes the CLI's working directory as scipSourceroot, and the plugin uses it for every build. Co-authored-by: Amp Amp-Thread-ID: https://ampcode.com/threads/T-01a178a8-3c2c-75e0-bfa6-7417585d4372 --- .../java/org/scip_code/scip_java/gradle/ScipGradlePlugin.java | 4 +++- .../org/scip_code/scip_java/buildtools/GradleBuildTool.kt | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/scip-gradle-plugin/src/main/java/org/scip_code/scip_java/gradle/ScipGradlePlugin.java b/scip-gradle-plugin/src/main/java/org/scip_code/scip_java/gradle/ScipGradlePlugin.java index 8ad6ddfa7..f7598df7c 100644 --- a/scip-gradle-plugin/src/main/java/org/scip_code/scip_java/gradle/ScipGradlePlugin.java +++ b/scip-gradle-plugin/src/main/java/org/scip_code/scip_java/gradle/ScipGradlePlugin.java @@ -37,7 +37,9 @@ private void configureProject(Project project) { project.getExtensions().getExtraProperties().getProperties(); String targetRoot = requiredExtra(extraProperties, "scipTarget").toString(); - String sourceRoot = project.getRootDir().toString(); + // The CLI's working directory, not project.getRootDir(): buildSrc and + // included builds have their own root directory. + String sourceRoot = requiredExtra(extraProperties, "scipSourceroot").toString(); // Compilation tasks we need to trigger to index all the sources we care // about. Built up as we detect the java and kotlin plugins. diff --git a/scip-java/src/main/kotlin/org/scip_code/scip_java/buildtools/GradleBuildTool.kt b/scip-java/src/main/kotlin/org/scip_code/scip_java/buildtools/GradleBuildTool.kt index 900287442..49cda12c4 100644 --- a/scip-java/src/main/kotlin/org/scip_code/scip_java/buildtools/GradleBuildTool.kt +++ b/scip-java/src/main/kotlin/org/scip_code/scip_java/buildtools/GradleBuildTool.kt @@ -117,6 +117,7 @@ This means our SCIP compiler plugin was not attached to one or more JavaCompile allprojects { project.ext["scipTarget"] = "${targetroot()}" + project.ext["scipSourceroot"] = "${index.workingDirectory}" project.ext["javacPluginJar"] = "$pluginpath" project.ext["dependenciesOut"] = "$dependenciesPath" project.ext["scipKotlincJar"] = "$scipKotlincPath" From d80ac9055e8f6e16e32a2bf7c144042e3a3d9b0f Mon Sep 17 00:00:00 2001 From: Christoph Hegemann Date: Mon, 26 Oct 2026 17:28:37 +0100 Subject: [PATCH 2/2] Index Java in Android modules The javac plugin was only attached in projects with the `java` plugin, so Java sources in Android modules were never indexed (#177). Android JavaCompile tasks always get -processorpath from the variant's annotation processor configurations, and javac only looks for -Xplugin plugins there when it is set. In com.android.* projects the plugin jar is now added to annotationProcessor, testAnnotationProcessor and androidTestAnnotationProcessor, and -Xplugin:scip is added to their JavaCompile tasks like for `java` projects. The default scipCompileAll still only triggers compileJava, so Android variants need an explicit build command such as `scip-java index -- compileDebugJavaWithJavac`. Co-authored-by: Amp Amp-Thread-ID: https://ampcode.com/threads/T-01a178a8-3c2c-75e0-bfa6-7417585d4372 --- .../scip_java/gradle/ScipGradlePlugin.java | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/scip-gradle-plugin/src/main/java/org/scip_code/scip_java/gradle/ScipGradlePlugin.java b/scip-gradle-plugin/src/main/java/org/scip_code/scip_java/gradle/ScipGradlePlugin.java index f7598df7c..ea9132897 100644 --- a/scip-gradle-plugin/src/main/java/org/scip_code/scip_java/gradle/ScipGradlePlugin.java +++ b/scip-gradle-plugin/src/main/java/org/scip_code/scip_java/gradle/ScipGradlePlugin.java @@ -13,6 +13,16 @@ public class ScipGradlePlugin implements Plugin { + private static final List ANDROID_PLUGINS = + List.of( + "com.android.application", + "com.android.library", + "com.android.test", + "com.android.dynamic-feature"); + + private static final List ANDROID_ANNOTATION_PROCESSORS = + List.of("annotationProcessor", "testAnnotationProcessor", "androidTestAnnotationProcessor"); + @Override public void apply(Project project) { project.afterEvaluate(this::configureProject); @@ -45,12 +55,16 @@ private void configureProject(Project project) { // about. Built up as we detect the java and kotlin plugins. List triggers = new ArrayList<>(); - if (project.getPlugins().hasPlugin("java")) { - triggers.add("compileJava"); - triggers.add("compileTestJava"); + boolean isAndroid = ANDROID_PLUGINS.stream().anyMatch(id -> project.getPlugins().hasPlugin(id)); + + if (project.getPlugins().hasPlugin("java") || isAndroid) { + if (!isAndroid) { + triggers.add("compileJava"); + triggers.add("compileTestJava"); + } Object javacPluginDep = project.files(requiredExtra(extraProperties, "javacPluginJar")); - boolean pluginAdded = tryAddJavacPlugin(project, javacPluginDep); + boolean pluginAdded = tryAddJavacPlugin(project, javacPluginDep, isAndroid); project .getTasks() @@ -144,10 +158,20 @@ private static boolean hasAnnotationProcessors(Project project, String configura } } - private static boolean tryAddJavacPlugin(Project project, Object javacPluginDep) { + private static boolean tryAddJavacPlugin( + Project project, Object javacPluginDep, boolean isAndroid) { try { project.getDependencies().add("compileOnly", javacPluginDep); project.getDependencies().add("testCompileOnly", javacPluginDep); + if (isAndroid) { + // AGP always passes -processorpath, so javac only finds the plugin there. + for (String name : ANDROID_ANNOTATION_PROCESSORS) { + if (project.getConfigurations().findByName(name) != null) { + project.getDependencies().add(name, javacPluginDep); + } + } + return true; + } if (hasAnnotationProcessors(project, "annotationProcessor")) { project.getDependencies().add("annotationProcessor", javacPluginDep); }