1import org.gradle.api.Plugin 2import org.gradle.api.Project 3import org.gradle.api.tasks.compile.JavaCompile 4 5import java.util.jar.JarFile 6 7@SuppressWarnings("GroovyUnusedDeclaration") 8class ShadowsPlugin implements Plugin<Project> { 9 @Override 10 void apply(Project project) { 11 project.apply plugin: 'idea' 12 13 project.extensions.create("shadows", ShadowsPluginExtension) 14 15 project.dependencies { 16 annotationProcessor project.project(":processor") 17 } 18 19 // write generated Java into its own dir... see https://github.com/gradle/gradle/issues/4956 20 def generatedSrcDir = project.file("build/generated/src/apt/main") 21 22 project.tasks.named("compileJava").configure { task -> 23 task.options.annotationProcessorGeneratedSourcesDirectory = generatedSrcDir 24 25 task.doFirst { 26 options.compilerArgs.add("-Aorg.robolectric.annotation.processing.jsonDocsEnabled=true") 27 options.compilerArgs.add("-Aorg.robolectric.annotation.processing.jsonDocsDir=${project.layout.buildDirectory.get().asFile}/docs/json") 28 options.compilerArgs.add("-Aorg.robolectric.annotation.processing.shadowPackage=${project.shadows.packageName}") 29 options.compilerArgs.add("-Aorg.robolectric.annotation.processing.sdkCheckMode=${project.shadows.sdkCheckMode}") 30 options.compilerArgs.add("-Aorg.robolectric.annotation.processing.sdks=${project.rootProject.layout.buildDirectory.get().asFile}/sdks.txt") 31 } 32 } 33 34 // include generated sources in javadoc jar 35 project.tasks.named("javadoc").configure { task -> 36 task.source(generatedSrcDir) 37 } 38 39 // verify that we have the apt-generated files in our javadoc and sources jars 40 project.tasks.named("javadocJar").configure { task -> 41 task.doLast { 42 def shadowPackageNameDir = project.shadows.packageName.replaceAll(/\./, '/') 43 checkForFile(task.archivePath, "${shadowPackageNameDir}/Shadows.html") 44 } 45 } 46 47 project.tasks.named("sourcesJar").configure { task -> 48 task.from(generatedSrcDir) 49 task.doLast { 50 def shadowPackageNameDir = project.shadows.packageName.replaceAll(/\./, '/') 51 checkForFile(task.archivePath, "${shadowPackageNameDir}/Shadows.java") 52 } 53 } 54 55 project.rootProject.configAnnotationProcessing += project 56 57 /* Prevents sporadic compilation error: 58 * 'Bad service configuration file, or exception thrown while constructing 59 * Processor object: javax.annotation.processing.Processor: Error reading 60 * configuration file' 61 * 62 * See https://discuss.gradle.org/t/gradle-not-compiles-with-solder-tooling-jar/7583/20 63 */ 64 project.tasks.withType(JavaCompile).configureEach { options.fork = true } 65 } 66 67 static class ShadowsPluginExtension { 68 String packageName 69 String sdkCheckMode = "WARN" 70 } 71 72 private static void checkForFile(jar, String name) { 73 def files = new JarFile(jar).entries().collect { it.name }.toSet() 74 75 if (!files.contains(name)) { 76 throw new RuntimeException("Missing file ${name} in ${jar}") 77 } 78 } 79} 80