private static void setupApiInformationAnalysis()

in buildSrc/src/main/java/com/google/firebase/gradle/plugins/FirebaseJavaLibraryPlugin.java [94:193]


  private static void setupApiInformationAnalysis(Project project) {
    File metalavaOutputJarFile = new File(project.getRootProject().getBuildDir(), "metalava.jar");
    SourceSet mainSourceSet =
        project
            .getConvention()
            .getPlugin(JavaPluginConvention.class)
            .getSourceSets()
            .getByName("main");
    File outputFile =
        project
            .getRootProject()
            .file(
                Paths.get(
                    project.getRootProject().getBuildDir().getPath(),
                    "apiinfo",
                    project.getPath().substring(1).replace(":", "_")));
    File outputApiFile = new File(outputFile.getAbsolutePath() + "_api.txt");

    project
        .getTasks()
        .register(
            "getMetalavaJar",
            GetMetalavaJarTask.class,
            task -> {
              task.setOutputFile(metalavaOutputJarFile);
            });
    File apiTxt =
        project.file("api.txt").exists()
            ? project.file("api.txt")
            : project.file(project.getRootDir() + "/empty-api.txt");
    TaskProvider<ApiInformationTask> apiInfo =
        project
            .getTasks()
            .register(
                "apiInformation",
                ApiInformationTask.class,
                task -> {
                  task.setApiTxt(apiTxt);
                  task.setMetalavaJarPath(metalavaOutputJarFile.getAbsolutePath());
                  task.setSourceSet(mainSourceSet);
                  task.setOutputFile(outputFile);
                  task.setBaselineFile(project.file("baseline.txt"));
                  task.setOutputApiFile(outputApiFile);
                  if (project.hasProperty("updateBaseline")) {
                    task.setUpdateBaseline(true);
                  } else {
                    task.setUpdateBaseline(false);
                  }
                  task.dependsOn("getMetalavaJar");
                });

    TaskProvider<GenerateApiTxtFileTask> generateApiTxt =
        project
            .getTasks()
            .register(
                "generateApiTxtFile",
                GenerateApiTxtFileTask.class,
                task -> {
                  task.setApiTxt(project.file("api.txt"));
                  task.setMetalavaJarPath(metalavaOutputJarFile.getAbsolutePath());
                  task.setSourceSet(mainSourceSet);
                  task.setBaselineFile(project.file("baseline.txt"));
                  task.setUpdateBaseline(project.hasProperty("updateBaseline"));
                  task.dependsOn("getMetalavaJar");
                });

    TaskProvider<GenerateStubsTask> docStubs =
        project
            .getTasks()
            .register(
                "docStubs",
                GenerateStubsTask.class,
                task -> {
                  task.dependsOn("getMetalavaJar");

                  task.setSourceSet(mainSourceSet);
                });
    project.getTasks().getByName("check").dependsOn(docStubs);

    project.afterEvaluate(
        p -> {
          FileCollection classpath =
              project
                  .getConfigurations()
                  .getByName("runtimeClasspath")
                  .getIncoming()
                  .artifactView(
                      config ->
                          config.attributes(
                              container ->
                                  container.attribute(
                                      Attribute.of("artifactType", String.class), "jar")))
                  .getArtifacts()
                  .getArtifactFiles();

          apiInfo.configure(t -> t.setClassPath(classpath));
          generateApiTxt.configure(t -> t.setClassPath(classpath));
          docStubs.configure(t -> t.setClassPath(classpath));
        });
  }