• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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