Example #1
0
 @VisibleForTesting
 static void addRootExcludes(
     Module module, BuildRule buildRule, ProjectFilesystem projectFilesystem) {
   // If in the root of the project, specify ignored paths.
   if (buildRule != null && buildRule.getBuildTarget().getBasePathWithSlash().isEmpty()) {
     for (Path path : projectFilesystem.getIgnorePaths()) {
       // It turns out that ignoring all of buck-out causes problems in IntelliJ: it forces an
       // extra "modules" folder to appear at the top of the navigation pane that competes with the
       // ordinary file tree, making navigation a real pain. The hypothesis is that this is because
       // there are files in buck-out/gen and buck-out/android that IntelliJ freaks out about if it
       // cannot find them. Therefore, if "buck-out" is listed in the default list of paths to
       // ignore (which makes sense for other parts of Buck, such as Watchman), then we will ignore
       // only the appropriate subfolders of buck-out instead.
       if (BuckConstant.BUCK_OUTPUT_PATH.equals(path)) {
         addRootExclude(module, BuckConstant.BIN_PATH);
         addRootExclude(module, BuckConstant.LOG_PATH);
       } else {
         addRootExclude(module, path);
       }
     }
     module.isRootModule = true;
   }
 }
Example #2
0
  private boolean addSourceFolders(
      Module module,
      @Nullable BuildRule buildRule,
      @Nullable ImmutableList<SourceRoot> sourceRoots,
      boolean isTestSource) {
    if (buildRule == null || sourceRoots == null) {
      return false;
    }

    if (buildRule instanceof AndroidBinaryRule && sourceRoots.isEmpty()) {
      return false;
    }

    if (sourceRoots.isEmpty()) {
      // When there is a src_target, but no src_roots were specified, then the current directory is
      // treated as the SourceRoot. This is the common case when a project contains one folder of
      // Java source code with a build file for each Java package. For example, if the project's
      // only source folder were named "java/" and a build file in java/com/example/base/ contained
      // the an extremely simple set of build rules:
      //
      // java_library(
      //   name = 'base',
      //   srcs = glob(['*.java']),
      // }
      //
      // project_config(
      //   src_target = ':base',
      // )
      //
      // then the corresponding .iml file (in the same directory) should contain:
      //
      // <content url="file://$MODULE_DIR$">
      //   <sourceFolder url="file://$MODULE_DIR$" isTestSource="false"
      // packagePrefix="com.example.base" />
      //   <sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" />
      //
      //   <!-- It will have an <excludeFolder> for every "subpackage" of com.example.base. -->
      //   <excludeFolder url="file://$MODULE_DIR$/util" />
      // </content>
      //
      // Note to prevent the <excludeFolder> elements from being included, the project_config()
      // rule should be:
      //
      // project_config(
      //   src_target = ':base',
      //   src_root_includes_subdirectories = True,
      // )
      //
      // Because developers who organize their code this way will have many build files, the default
      // values of project_config() assume this approach to help minimize the tedium in writing all
      // of those project_config() rules.
      String url = "file://$MODULE_DIR$";
      String packagePrefix = javaPackageFinder.findJavaPackageForPath(module.pathToImlFile);
      SourceFolder sourceFolder = new SourceFolder(url, isTestSource, packagePrefix);
      module.sourceFolders.add(sourceFolder);
    } else {
      for (SourceRoot sourceRoot : sourceRoots) {
        SourceFolder sourceFolder =
            new SourceFolder(
                String.format("file://$MODULE_DIR$/%s", sourceRoot.getName()), isTestSource);
        module.sourceFolders.add(sourceFolder);
      }
    }

    // Include <excludeFolder> elements, as appropriate.
    for (String relativePath : this.buildFileTree.getChildPaths(buildRule.getBuildTarget())) {
      String excludeFolderUrl = "file://$MODULE_DIR$/" + relativePath;
      SourceFolder excludeFolder = new SourceFolder(excludeFolderUrl, /* isTestSource */ false);
      module.excludeFolders.add(excludeFolder);
    }

    // If in the root of the project, specify ignored paths.
    if ("".equals(buildRule.getBuildTarget().getBasePathWithSlash())) {
      for (String path : projectFilesystem.getIgnorePaths()) {
        module.excludeFolders.add(
            new SourceFolder(String.format("file://$MODULE_DIR$/%s", path), false));
      }
    }

    return true;
  }