buildSrc/src/main/java/com/uber/okbuck/generator/BuckFileGenerator.java [44:306]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
public final class BuckFileGenerator {

  private BuckFileGenerator() {}

  /** generate {@code BUCKFile} */
  public static void generate(
      Project project, BuckFileManager buckFileManager, OkBuckExtension okBuckExtension) {

    VisibilityExtension visibilityExtension = okBuckExtension.getVisibilityExtension();
    TestExtension testExtension = okBuckExtension.getTestExtension();

    File moduleDir = project.getBuildFile().getParentFile();
    File visibilityFile = new File(moduleDir, visibilityExtension.visibilityFileName);
    boolean hasVisibilityFile = visibilityFile.isFile();
    boolean integrationTestsEnabled = testExtension.enableIntegrationTests;

    List<Rule> rules = createRules(project, integrationTestsEnabled);

    Multimap<String, String> extraLoadStatements = TreeMultimap.create();

    if (hasVisibilityFile) {
      rules.forEach(rule -> rule.fileConfiguredVisibility(true));
      extraLoadStatements.put(
          ":" + visibilityExtension.visibilityFileName, visibilityExtension.visibilityFunction);
    }

    File buckFile = project.file(okBuckExtension.buildFileName);
    buckFileManager.writeToBuckFile(rules, buckFile, extraLoadStatements);
  }

  private static List<Rule> createRules(Project project, boolean integrationTestsEnabled) {
    List<Rule> rules = new ArrayList<>();
    ProjectType projectType = ProjectUtil.getType(project);

    ProjectCache.getTargetCache(project)
        .getTargets()
        .forEach(
            (name, target) -> {
              switch (projectType) {
                case JAVA_LIB:
                case GROOVY_LIB:
                case KOTLIN_LIB:
                case SCALA_LIB:
                  rules.addAll(
                      createRules(
                          (JvmTarget) target,
                          projectType.getMainRuleType(),
                          projectType.getTestRuleType(),
                          projectType.getIntegrationTestRuleType(),
                          integrationTestsEnabled));
                  break;
                case ANDROID_LIB:
                  AndroidLibTarget androidLibTarget = (AndroidLibTarget) target;
                  List<Rule> targetRules = createRules(androidLibTarget);
                  rules.addAll(targetRules);
                  if (androidLibTarget.getLibInstrumentationTarget() != null) {
                    rules.addAll(
                        createRules(androidLibTarget.getLibInstrumentationTarget(), targetRules));
                  }
                  break;
                case ANDROID_APP:
                  AndroidAppTarget androidAppTarget = (AndroidAppTarget) target;
                  targetRules = createRules(androidAppTarget);
                  rules.addAll(targetRules);
                  if (androidAppTarget.getAppInstrumentationTarget() != null) {
                    rules.addAll(
                        createRules(
                            androidAppTarget.getAppInstrumentationTarget(),
                            androidAppTarget,
                            targetRules));
                  }
                  break;
                default:
                  throw new IllegalArgumentException(
                      "Okbuck does not support "
                          + project
                          + "type projects yet. Please use the extension option okbuck.buckProjects to exclude "
                          + project);
              }
            });

    // de-dup rules by name
    return new ArrayList<>(new LinkedHashSet<>(rules));
  }

  private static List<Rule> createRules(
      JvmTarget target,
      RuleType mainRuleType,
      RuleType testRuleType,
      RuleType integrationTestRuleType,
      boolean integrationTestsEnabled) {
    List<Rule> rules =
        new ArrayList<>(
            JvmLibraryRuleComposer.compose(target, mainRuleType, integrationTestsEnabled));

    if (!target.getTest().getSources().isEmpty()) {
      rules.add(JvmTestRuleComposer.compose(target, testRuleType));
    }
    if (integrationTestsEnabled && !target.getIntegrationTest().getSources().isEmpty()) {
      rules.add(JvmIntegrationTestRuleComposer.compose(target, integrationTestRuleType));
    }

    return rules;
  }

  private static List<Rule> createRules(
      AndroidLibTarget target,
      @Nullable String appClass,
      List<String> extraDeps,
      List<String> extraResDeps) {

    String manifestRuleName = ":" + AndroidBuckRuleComposer.libManifest(target);
    List<Rule> androidLibRules = new ArrayList<>();

    // Aidl
    List<Rule> aidlRules =
        target
            .getAidl()
            .stream()
            .map(aidlDir -> GenAidlRuleComposer.compose(target, aidlDir, manifestRuleName))
            .collect(Collectors.toList());

    List<String> aidlRuleNames =
        aidlRules.stream().map(Rule::buckName).collect(Collectors.toList());

    androidLibRules.addAll(aidlRules);

    // BuildConfig
    if (target.shouldGenerateBuildConfig()) {
      androidLibRules.add(AndroidBuildConfigRuleComposer.compose(target));
    }

    // Jni
    androidLibRules.addAll(
        target
            .getJniLibs()
            .stream()
            .map(jniLib -> PreBuiltNativeLibraryRuleComposer.compose(target, jniLib))
            .collect(Collectors.toList()));

    List<String> deps = androidLibRules.stream().map(Rule::buckName).collect(Collectors.toList());
    deps.addAll(extraDeps);

    // Unified android lib
    androidLibRules.add(
        AndroidModuleRuleComposer.compose(target, deps, aidlRuleNames, appClass, extraResDeps));

    // Test
    if (target.getRobolectricEnabled()
        && !target.getTest().getSources().isEmpty()
        && !target.getIsTest()) {
      androidLibRules.add(
          AndroidTestRuleComposer.compose(target, manifestRuleName, deps, aidlRuleNames, appClass));
    }

    return new ArrayList<>(androidLibRules);
  }

  private static List<Rule> createRules(AndroidLibTarget target) {
    return createRules(target, null, new ArrayList<>(), new ArrayList<>());
  }

  private static List<Rule> createRules(
      AndroidAppTarget target, List<String> additionalDeps, List<String> additionalResDeps) {
    List<String> deps = new ArrayList<>();
    deps.add(":" + AndroidBuckRuleComposer.src(target));

    deps.addAll(additionalDeps);

    List<Rule> libRules =
        createRules(
            target,
            target.getExopackage() != null ? target.getExopackage().getAppClass() : null,
            additionalDeps,
            additionalResDeps);
    List<Rule> rules = new ArrayList<>(libRules);

    libRules.forEach(
        rule -> {
          if (rule instanceof AndroidModuleRule && rule.name() != null) {
            deps.add(rule.buckName().replace(":src_", ":res_"));
          }
        });

    Rule keystoreRule = KeystoreRuleComposer.compose(target);

    if (target.getExopackage() != null) {
      Rule exoPackageRule = ExopackageAndroidLibraryRuleComposer.compose(target);
      rules.add(exoPackageRule);
      deps.add(exoPackageRule.buckName());
    }

    if (keystoreRule != null) {
      rules.add(keystoreRule);

      Rule appManifest = ManifestRuleComposer.composeForBinary(target);
      rules.add(appManifest);

      rules.add(
          AndroidBinaryRuleComposer.compose(
              target,
              appManifest.buckName(),
              deps,
              ":" + AndroidBuckRuleComposer.keystore(target)));
    }

    return rules;
  }

  private static List<Rule> createRules(AndroidAppTarget target) {
    return createRules(target, new ArrayList<>(), new ArrayList<>());
  }

  private static List<Rule> createRules(
      AndroidAppInstrumentationTarget target,
      AndroidAppTarget mainApkTarget,
      List<Rule> mainApkTargetRules) {

    List<Rule> libRules =
        createRules(
            target,
            null,
            filterAndroidDepRules(mainApkTargetRules),
            filterAndroidResDepRules(mainApkTargetRules));
    List<Rule> rules = new ArrayList<>(libRules);

    Rule testAppManifest = ManifestRuleComposer.composeForBinary(target);
    rules.add(testAppManifest);

    rules.add(
        AndroidInstrumentationApkRuleComposer.compose(
            filterAndroidDepRules(rules), mainApkTarget, testAppManifest.buckName()));
    rules.add(AndroidInstrumentationTestRuleComposer.compose(mainApkTarget));
    return rules;
  }

  private static List<Rule> createRules(
      AndroidLibInstrumentationTarget target, List<Rule> mainLibTargetRules) {
    return new ArrayList<>(
        createRules(
            target,
            filterAndroidDepRules(mainLibTargetRules),
            filterAndroidResDepRules(mainLibTargetRules)));
  }

  // android rules now accept only other android rules as deps, and okbuck_android_module
  // macro infers what resources rules to depend on
  private static List<String> filterAndroidDepRules(List<Rule> rules) {
    return rules
        .stream()
        .filter(rule -> rule instanceof AndroidRule || rule instanceof AndroidModuleRule)
        .map(Rule::buckName)
        .collect(Collectors.toList());
  }

  // Same logic as above, so to get the actual resource rule, we derive from the src one
  private static List<String> filterAndroidResDepRules(List<Rule> rules) {
    return rules
        .stream()
        .filter(rule -> rule instanceof AndroidRule || rule instanceof AndroidModuleRule)
        .map(Rule::buckName)
        .map(ruleName -> ruleName.replace(":src_", ":res_"))
        .collect(Collectors.toList());
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



plugin/src/main/java/com/uber/okbuck/generator/BuckFileGenerator.java [44:306]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
public final class BuckFileGenerator {

  private BuckFileGenerator() {}

  /** generate {@code BUCKFile} */
  public static void generate(
      Project project, BuckFileManager buckFileManager, OkBuckExtension okBuckExtension) {

    VisibilityExtension visibilityExtension = okBuckExtension.getVisibilityExtension();
    TestExtension testExtension = okBuckExtension.getTestExtension();

    File moduleDir = project.getBuildFile().getParentFile();
    File visibilityFile = new File(moduleDir, visibilityExtension.visibilityFileName);
    boolean hasVisibilityFile = visibilityFile.isFile();
    boolean integrationTestsEnabled = testExtension.enableIntegrationTests;

    List<Rule> rules = createRules(project, integrationTestsEnabled);

    Multimap<String, String> extraLoadStatements = TreeMultimap.create();

    if (hasVisibilityFile) {
      rules.forEach(rule -> rule.fileConfiguredVisibility(true));
      extraLoadStatements.put(
          ":" + visibilityExtension.visibilityFileName, visibilityExtension.visibilityFunction);
    }

    File buckFile = project.file(okBuckExtension.buildFileName);
    buckFileManager.writeToBuckFile(rules, buckFile, extraLoadStatements);
  }

  private static List<Rule> createRules(Project project, boolean integrationTestsEnabled) {
    List<Rule> rules = new ArrayList<>();
    ProjectType projectType = ProjectUtil.getType(project);

    ProjectCache.getTargetCache(project)
        .getTargets()
        .forEach(
            (name, target) -> {
              switch (projectType) {
                case JAVA_LIB:
                case GROOVY_LIB:
                case KOTLIN_LIB:
                case SCALA_LIB:
                  rules.addAll(
                      createRules(
                          (JvmTarget) target,
                          projectType.getMainRuleType(),
                          projectType.getTestRuleType(),
                          projectType.getIntegrationTestRuleType(),
                          integrationTestsEnabled));
                  break;
                case ANDROID_LIB:
                  AndroidLibTarget androidLibTarget = (AndroidLibTarget) target;
                  List<Rule> targetRules = createRules(androidLibTarget);
                  rules.addAll(targetRules);
                  if (androidLibTarget.getLibInstrumentationTarget() != null) {
                    rules.addAll(
                        createRules(androidLibTarget.getLibInstrumentationTarget(), targetRules));
                  }
                  break;
                case ANDROID_APP:
                  AndroidAppTarget androidAppTarget = (AndroidAppTarget) target;
                  targetRules = createRules(androidAppTarget);
                  rules.addAll(targetRules);
                  if (androidAppTarget.getAppInstrumentationTarget() != null) {
                    rules.addAll(
                        createRules(
                            androidAppTarget.getAppInstrumentationTarget(),
                            androidAppTarget,
                            targetRules));
                  }
                  break;
                default:
                  throw new IllegalArgumentException(
                      "Okbuck does not support "
                          + project
                          + "type projects yet. Please use the extension option okbuck.buckProjects to exclude "
                          + project);
              }
            });

    // de-dup rules by name
    return new ArrayList<>(new LinkedHashSet<>(rules));
  }

  private static List<Rule> createRules(
      JvmTarget target,
      RuleType mainRuleType,
      RuleType testRuleType,
      RuleType integrationTestRuleType,
      boolean integrationTestsEnabled) {
    List<Rule> rules =
        new ArrayList<>(
            JvmLibraryRuleComposer.compose(target, mainRuleType, integrationTestsEnabled));

    if (!target.getTest().getSources().isEmpty()) {
      rules.add(JvmTestRuleComposer.compose(target, testRuleType));
    }
    if (integrationTestsEnabled && !target.getIntegrationTest().getSources().isEmpty()) {
      rules.add(JvmIntegrationTestRuleComposer.compose(target, integrationTestRuleType));
    }

    return rules;
  }

  private static List<Rule> createRules(
      AndroidLibTarget target,
      @Nullable String appClass,
      List<String> extraDeps,
      List<String> extraResDeps) {

    String manifestRuleName = ":" + AndroidBuckRuleComposer.libManifest(target);
    List<Rule> androidLibRules = new ArrayList<>();

    // Aidl
    List<Rule> aidlRules =
        target
            .getAidl()
            .stream()
            .map(aidlDir -> GenAidlRuleComposer.compose(target, aidlDir, manifestRuleName))
            .collect(Collectors.toList());

    List<String> aidlRuleNames =
        aidlRules.stream().map(Rule::buckName).collect(Collectors.toList());

    androidLibRules.addAll(aidlRules);

    // BuildConfig
    if (target.shouldGenerateBuildConfig()) {
      androidLibRules.add(AndroidBuildConfigRuleComposer.compose(target));
    }

    // Jni
    androidLibRules.addAll(
        target
            .getJniLibs()
            .stream()
            .map(jniLib -> PreBuiltNativeLibraryRuleComposer.compose(target, jniLib))
            .collect(Collectors.toList()));

    List<String> deps = androidLibRules.stream().map(Rule::buckName).collect(Collectors.toList());
    deps.addAll(extraDeps);

    // Unified android lib
    androidLibRules.add(
        AndroidModuleRuleComposer.compose(target, deps, aidlRuleNames, appClass, extraResDeps));

    // Test
    if (target.getRobolectricEnabled()
        && !target.getTest().getSources().isEmpty()
        && !target.getIsTest()) {
      androidLibRules.add(
          AndroidTestRuleComposer.compose(target, manifestRuleName, deps, aidlRuleNames, appClass));
    }

    return new ArrayList<>(androidLibRules);
  }

  private static List<Rule> createRules(AndroidLibTarget target) {
    return createRules(target, null, new ArrayList<>(), new ArrayList<>());
  }

  private static List<Rule> createRules(
      AndroidAppTarget target, List<String> additionalDeps, List<String> additionalResDeps) {
    List<String> deps = new ArrayList<>();
    deps.add(":" + AndroidBuckRuleComposer.src(target));

    deps.addAll(additionalDeps);

    List<Rule> libRules =
        createRules(
            target,
            target.getExopackage() != null ? target.getExopackage().getAppClass() : null,
            additionalDeps,
            additionalResDeps);
    List<Rule> rules = new ArrayList<>(libRules);

    libRules.forEach(
        rule -> {
          if (rule instanceof AndroidModuleRule && rule.name() != null) {
            deps.add(rule.buckName().replace(":src_", ":res_"));
          }
        });

    Rule keystoreRule = KeystoreRuleComposer.compose(target);

    if (target.getExopackage() != null) {
      Rule exoPackageRule = ExopackageAndroidLibraryRuleComposer.compose(target);
      rules.add(exoPackageRule);
      deps.add(exoPackageRule.buckName());
    }

    if (keystoreRule != null) {
      rules.add(keystoreRule);

      Rule appManifest = ManifestRuleComposer.composeForBinary(target);
      rules.add(appManifest);

      rules.add(
          AndroidBinaryRuleComposer.compose(
              target,
              appManifest.buckName(),
              deps,
              ":" + AndroidBuckRuleComposer.keystore(target)));
    }

    return rules;
  }

  private static List<Rule> createRules(AndroidAppTarget target) {
    return createRules(target, new ArrayList<>(), new ArrayList<>());
  }

  private static List<Rule> createRules(
      AndroidAppInstrumentationTarget target,
      AndroidAppTarget mainApkTarget,
      List<Rule> mainApkTargetRules) {

    List<Rule> libRules =
        createRules(
            target,
            null,
            filterAndroidDepRules(mainApkTargetRules),
            filterAndroidResDepRules(mainApkTargetRules));
    List<Rule> rules = new ArrayList<>(libRules);

    Rule testAppManifest = ManifestRuleComposer.composeForBinary(target);
    rules.add(testAppManifest);

    rules.add(
        AndroidInstrumentationApkRuleComposer.compose(
            filterAndroidDepRules(rules), mainApkTarget, testAppManifest.buckName()));
    rules.add(AndroidInstrumentationTestRuleComposer.compose(mainApkTarget));
    return rules;
  }

  private static List<Rule> createRules(
      AndroidLibInstrumentationTarget target, List<Rule> mainLibTargetRules) {
    return new ArrayList<>(
        createRules(
            target,
            filterAndroidDepRules(mainLibTargetRules),
            filterAndroidResDepRules(mainLibTargetRules)));
  }

  // android rules now accept only other android rules as deps, and okbuck_android_module
  // macro infers what resources rules to depend on
  private static List<String> filterAndroidDepRules(List<Rule> rules) {
    return rules
        .stream()
        .filter(rule -> rule instanceof AndroidRule || rule instanceof AndroidModuleRule)
        .map(Rule::buckName)
        .collect(Collectors.toList());
  }

  // Same logic as above, so to get the actual resource rule, we derive from the src one
  private static List<String> filterAndroidResDepRules(List<Rule> rules) {
    return rules
        .stream()
        .filter(rule -> rule instanceof AndroidRule || rule instanceof AndroidModuleRule)
        .map(Rule::buckName)
        .map(ruleName -> ruleName.replace(":src_", ":res_"))
        .collect(Collectors.toList());
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



