support for resource directories: enable java-specific actions only for directories...
authornik <Nikolay.Chashnikov@jetbrains.com>
Tue, 3 Sep 2013 13:52:45 +0000 (17:52 +0400)
committernik <Nikolay.Chashnikov@jetbrains.com>
Tue, 3 Sep 2013 14:46:54 +0000 (18:46 +0400)
14 files changed:
java/compiler/impl/src/com/intellij/compiler/actions/CompileAction.java
java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java
java/compiler/impl/src/com/intellij/compiler/impl/CompilerEncodingServiceImpl.java
java/compiler/impl/src/com/intellij/packaging/impl/ui/actions/PackageFileAction.java
java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/LineBreakpoint.java
java/java-impl/src/com/intellij/ide/actions/JavaCreateTemplateInPackageAction.java
java/java-impl/src/com/intellij/ide/navigationToolbar/JavaNavBarExtension.java
java/java-impl/src/com/intellij/ide/util/PackageChooserDialog.java
platform/lang-impl/src/com/intellij/ide/actions/CreateTemplateInPackageAction.java
platform/projectModel-api/src/com/intellij/openapi/roots/FileIndex.java
platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModuleFileIndexImpl.java
platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectFileIndexImpl.java
plugins/devkit/src/actions/GeneratePluginClassAction.java
plugins/ui-designer/src/com/intellij/uiDesigner/actions/AbstractCreateFormAction.java

index 2fe4bcd205c8ac9fa0b0ac7a25afa3f10903135a..8d5bb8c54d0e0e180a61c4bca7d7dc4465b9cc62 100644 (file)
@@ -21,7 +21,6 @@ import com.intellij.openapi.actionSystem.*;
 import com.intellij.openapi.compiler.CompilerBundle;
 import com.intellij.openapi.compiler.CompilerManager;
 import com.intellij.openapi.fileTypes.FileType;
-import com.intellij.openapi.fileTypes.FileTypeManager;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.ProjectFileIndex;
@@ -158,7 +157,6 @@ public class CompileAction extends CompileActionBase {
     }
     final PsiManager psiManager = PsiManager.getInstance(project);
     final CompilerConfiguration compilerConfiguration = CompilerConfiguration.getInstance(project);
-    final FileTypeManager typeManager = FileTypeManager.getInstance();
     final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
     final CompilerManager compilerManager = CompilerManager.getInstance(project);
     final List<VirtualFile> filesToCompile = new ArrayList<VirtualFile>();
index 3ed374732fc0db0a76c2b0c6c4ac9f123b6efb8d..38807d0a685b0c038d8016e1897b4583bde351a2 100644 (file)
@@ -27,7 +27,6 @@ import com.intellij.openapi.compiler.CompilerBundle;
 import com.intellij.openapi.compiler.CompilerFilter;
 import com.intellij.openapi.compiler.CompilerManager;
 import com.intellij.openapi.fileTypes.FileType;
-import com.intellij.openapi.fileTypes.FileTypeManager;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.ProjectFileIndex;
@@ -177,7 +176,6 @@ public class ProcessAnnotationsAction extends CompileActionBase {
       return null;
     }
     final PsiManager psiManager = PsiManager.getInstance(project);
-    final FileTypeManager typeManager = FileTypeManager.getInstance();
     final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
     final CompilerManager compilerManager = CompilerManager.getInstance(project);
     final List<VirtualFile> filesToCompile = new ArrayList<VirtualFile>();
index d50063d77a90f6ea78d7b8831ecfe1b0f47ea7c6..34a49096f8941feb903fbed79af543d00f8e69ab 100644 (file)
@@ -33,6 +33,7 @@ import com.intellij.util.containers.ContainerUtil;
 import gnu.trove.THashMap;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
 
 import java.nio.charset.Charset;
 import java.util.Collection;
@@ -68,7 +69,7 @@ public class CompilerEncodingServiceImpl extends CompilerEncodingService {
       final VirtualFile file = entry.getKey();
       final Charset charset = entry.getValue();
       if (file == null || charset == null || (!file.isDirectory() && !compilerManager.isCompilableFileType(file.getFileType()))
-          || !index.isInSourceContent(file)) continue;
+          || !index.isUnderSourceRootOfType(file, JavaModuleSourceRootTypes.SOURCES)) continue;
 
       final Module module = index.getModuleForFile(file);
       if (module == null) continue;
index f72bd757eab45a5e426cea502d46ce886dfc8224..26e4721491957ab580974f203b4401f23fc82a1a 100644 (file)
@@ -21,6 +21,7 @@ import com.intellij.packaging.artifacts.ArtifactManager;
 import com.intellij.packaging.impl.artifacts.ArtifactBySourceFileFinder;
 import com.intellij.util.text.SyncDateFormat;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -60,7 +61,7 @@ public class PackageFileAction extends AnAction {
     final CompilerManager compilerManager = CompilerManager.getInstance(project);
     for (VirtualFile file : files) {
       if (file == null || file.isDirectory() ||
-          fileIndex.isInSourceContent(file) && compilerManager.isCompilableFileType(file.getFileType())) {
+          fileIndex.isUnderSourceRootOfType(file, JavaModuleSourceRootTypes.SOURCES) && compilerManager.isCompilableFileType(file.getFileType())) {
         return Collections.emptyList();
       }
       final Collection<? extends Artifact> artifacts = ArtifactBySourceFileFinder.getInstance(project).findArtifacts(file);
index 9ca1bd12f697ae62f6beca8a23de1fa8939910ba..ae21b113df889d5109ee0c767b5996dbe68eb6a6 100644 (file)
@@ -61,6 +61,7 @@ import com.sun.jdi.event.LocatableEvent;
 import com.sun.jdi.request.BreakpointRequest;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
 
 import javax.swing.*;
 import java.util.ArrayList;
@@ -191,7 +192,7 @@ public class LineBreakpoint extends BreakpointWithHighlighter {
     if (position != null) {
       final VirtualFile breakpointFile = position.getFile().getVirtualFile();
       final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
-      if (breakpointFile != null && fileIndex.isInSourceContent(breakpointFile)) {
+      if (breakpointFile != null && fileIndex.isUnderSourceRootOfType(breakpointFile, JavaModuleSourceRootTypes.SOURCES)) {
         // apply filtering to breakpoints from content sources only, not for sources attached to libraries
         final Collection<VirtualFile> candidates = findClassCandidatesInSourceContent(className, debugProcess.getSearchScope(), fileIndex);
         if (LOG.isDebugEnabled()) {
@@ -271,7 +272,7 @@ public class LineBreakpoint extends BreakpointWithHighlighter {
               final VirtualFile vFile = psiFile.getVirtualFile();
               msg.append("\n\t").append("VirtualFile=").append(vFile);
               if (vFile != null) {
-                msg.append("\n\t").append("isInSourceContent=").append(fileIndex.isInSourceContent(vFile));
+                msg.append("\n\t").append("isInSourceContent=").append(fileIndex.isUnderSourceRootOfType(vFile, JavaModuleSourceRootTypes.SOURCES));
               }
             }
             LOG.debug(msg.toString());
@@ -281,7 +282,7 @@ public class LineBreakpoint extends BreakpointWithHighlighter {
             return null;
           }
           final VirtualFile vFile = psiFile.getVirtualFile();
-          if (vFile == null || !fileIndex.isInSourceContent(vFile)) {
+          if (vFile == null || !fileIndex.isUnderSourceRootOfType(vFile, JavaModuleSourceRootTypes.SOURCES)) {
             return null; // this will switch off the check if at least one class is from libraries
           }
           list.add(vFile);
index e80c05e0acf17db0d1529c815871c340fb23eeee..b1397f65526d1e0b81b33bba1a3837a8a44e4124 100644 (file)
@@ -18,6 +18,7 @@ package com.intellij.ide.actions;
 import com.intellij.openapi.project.DumbAware;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.psi.*;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
 
 import javax.swing.*;
 
@@ -25,7 +26,7 @@ public abstract class JavaCreateTemplateInPackageAction<T extends PsiElement> ex
                                                                                                                        DumbAware {
 
   protected JavaCreateTemplateInPackageAction(String text, String description, Icon icon, boolean inSourceOnly) {
-    super(text, description, icon, inSourceOnly);
+    super(text, description, icon, inSourceOnly ? JavaModuleSourceRootTypes.SOURCES : null);
   }
 
   @Override
index cf9e0ad9f3b4fe360f25b55223ff272ca79860cd..2fc52f481343b5eab585ac47f68afbe3abefd4a3 100644 (file)
@@ -29,6 +29,7 @@ import com.intellij.openapi.roots.ProjectFileIndex;
 import com.intellij.openapi.roots.ProjectRootManager;
 import com.intellij.openapi.vfs.VirtualFile;
 import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -62,7 +63,7 @@ public class JavaNavBarExtension implements NavBarModelExtension{
     final PsiFile containingFile = psiElement.getContainingFile();
     if (containingFile != null) {
       final VirtualFile file = containingFile.getVirtualFile();
-      if (file != null && (index.isInSourceContent(file) || index.isInLibraryClasses(file) || index.isInLibrarySource(file))) {
+      if (file != null && (index.isUnderSourceRootOfType(file, JavaModuleSourceRootTypes.SOURCES) || index.isInLibraryClasses(file) || index.isInLibrarySource(file))) {
         if (psiElement instanceof PsiJavaFile) {
           final PsiJavaFile psiJavaFile = (PsiJavaFile)psiElement;
           if (psiJavaFile.getViewProvider().getBaseLanguage() == StdLanguages.JAVA) {
index 2ad3edc9afa996192126f60cddc931ad508ddacb..ac9ddb4f95f64ced8d2bf1a8ffc20c06a305b634 100644 (file)
@@ -51,6 +51,7 @@ import com.intellij.util.ui.UIUtil;
 import com.intellij.util.ui.tree.TreeUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
 
 import javax.swing.*;
 import javax.swing.event.TreeSelectionEvent;
@@ -277,7 +278,7 @@ public class PackageChooserDialog extends PackageChooser {
     fileIndex.iterateContent(
       new ContentIterator() {
         public boolean processFile(VirtualFile fileOrDir) {
-          if (fileOrDir.isDirectory() && fileIndex.isInSourceContent(fileOrDir)){
+          if (fileOrDir.isDirectory() && fileIndex.isUnderSourceRootOfType(fileOrDir, JavaModuleSourceRootTypes.SOURCES)) {
             final PsiDirectory psiDirectory = psiManager.findDirectory(fileOrDir);
             LOG.assertTrue(psiDirectory != null);
             PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(psiDirectory);
index 9d874e11c9d45e275f23d73aa8961d9b2a670695..c4ab2023ac6f6f0166616b742769467d1f64ce75 100644 (file)
@@ -29,18 +29,21 @@ import com.intellij.psi.PsiElement;
 import com.intellij.util.IncorrectOperationException;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
 
 import javax.swing.*;
+import java.util.Set;
 
 /**
  * @author peter
  */
 public abstract class CreateTemplateInPackageAction<T extends PsiElement> extends CreateFromTemplateAction<T> {
-  private final boolean myInSourceOnly;
+  private Set<? extends JpsModuleSourceRootType<?>> mySourceRootTypes;
 
-  protected CreateTemplateInPackageAction(String text, String description, Icon icon, boolean inSourceOnly) {
+  protected CreateTemplateInPackageAction(String text, String description, Icon icon,
+                                          final Set<? extends JpsModuleSourceRootType<?>> rootTypes) {
     super(text, description, icon);
-    myInSourceOnly = inSourceOnly;
+    mySourceRootTypes = rootTypes;
   }
 
   @Override
@@ -60,13 +63,13 @@ public abstract class CreateTemplateInPackageAction<T extends PsiElement> extend
       return false;
     }
 
-    if (!myInSourceOnly) {
+    if (mySourceRootTypes == null) {
       return true;
     }
 
     ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
     for (PsiDirectory dir : view.getDirectories()) {
-      if (projectFileIndex.isInSourceContent(dir.getVirtualFile()) && checkPackageExists(dir)) {
+      if (projectFileIndex.isUnderSourceRootOfType(dir.getVirtualFile(), mySourceRootTypes) && checkPackageExists(dir)) {
         return true;
       }
     }
index e10ae92c464d3fc5c088e8624a635f73d9d97427..64558ddc58895a4d6775d1e17b8857e0f809b2a2 100644 (file)
@@ -17,6 +17,9 @@ package com.intellij.openapi.roots;
 
 import com.intellij.openapi.vfs.VirtualFile;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
+
+import java.util.Set;
 
 /**
  * Provides information about files contained in a project or module.
@@ -78,4 +81,12 @@ public interface FileIndex {
    * @return true if the file or directory belongs to a test source root, false otherwise.
    */
   boolean isInTestSourceContent(@NotNull VirtualFile fileOrDir);
+
+  /**
+   * Returns true if <code>fileOrDir</code> is a file or directory from the source root which have
+   *
+   * @param fileOrDir the file or directory to check.
+   * @return true if the file or directory belongs to a source root of one of specified types, false otherwise
+   */
+  boolean isUnderSourceRootOfType(@NotNull VirtualFile fileOrDir, @NotNull Set<? extends JpsModuleSourceRootType<?>> rootTypes);
 }
index 1e69e388a59aba3130ce1d2844b2d1bad5e2ae16..48303f9afd4c4c10cbc925f52b0335c14c7a975e 100644 (file)
@@ -27,9 +27,11 @@ import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.vfs.VirtualFileFilter;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
+import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 public class ModuleFileIndexImpl extends FileIndexBase implements ModuleFileIndex {
   private final Module myModule;
@@ -97,6 +99,13 @@ public class ModuleFileIndexImpl extends FileIndexBase implements ModuleFileInde
            && JavaModuleSourceRootTypes.isTestSourceOrResource(myDirectoryIndex.getSourceRootType(info));
   }
 
+  @Override
+  public boolean isUnderSourceRootOfType(@NotNull VirtualFile fileOrDir, @NotNull Set<? extends JpsModuleSourceRootType<?>> rootTypes) {
+    DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
+    return info != null && info.isInModuleSource() && myModule.equals(info.getModule())
+           && rootTypes.contains(myDirectoryIndex.getSourceRootType(info));
+  }
+
   private class ContentFilter implements VirtualFileFilter {
     @Override
     public boolean accept(@NotNull VirtualFile file) {
index af837efb9a71944384a034a01d9a68c914363534..e2f58e33023287094e5ca0d0a7b8a68d00973467 100644 (file)
@@ -31,10 +31,12 @@ import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.vfs.VirtualFileFilter;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
+import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
 
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 public class ProjectFileIndexImpl extends FileIndexBase implements ProjectFileIndex {
   private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.roots.impl.ProjectFileIndexImpl");
@@ -205,6 +207,12 @@ public class ProjectFileIndexImpl extends FileIndexBase implements ProjectFileIn
     return info != null && info.isInModuleSource() && JavaModuleSourceRootTypes.isTestSourceOrResource(myDirectoryIndex.getSourceRootType(info));
   }
 
+  @Override
+  public boolean isUnderSourceRootOfType(@NotNull VirtualFile fileOrDir, @NotNull Set<? extends JpsModuleSourceRootType<?>> rootTypes) {
+    DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
+    return info != null && info.isInModuleSource() && rootTypes.contains(myDirectoryIndex.getSourceRootType(info));
+  }
+
   private class ContentFilter implements VirtualFileFilter {
     @Override
     public boolean accept(@NotNull VirtualFile file) {
index 6ee75b2b1a6fa428f5e08d506db16704ac2d73a3..b0451c1f098f6db66ce207b74d14cdafefb38b67 100644 (file)
@@ -39,6 +39,7 @@ import org.jetbrains.idea.devkit.DevKitBundle;
 import org.jetbrains.idea.devkit.module.PluginModuleType;
 import org.jetbrains.idea.devkit.util.ChooseModulesDialog;
 import org.jetbrains.idea.devkit.util.DescriptorUtil;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
 
 import javax.swing.*;
 import java.util.*;
@@ -90,7 +91,7 @@ public abstract class GeneratePluginClassAction extends CreateElementActionBase
         ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
         PsiDirectory[] dirs = view.getDirectories();
         for (PsiDirectory dir : dirs) {
-          if (projectFileIndex.isInSourceContent(dir.getVirtualFile()) && JavaDirectoryService.getInstance().getPackage(dir) != null) {
+          if (projectFileIndex.isUnderSourceRootOfType(dir.getVirtualFile(), JavaModuleSourceRootTypes.SOURCES) && JavaDirectoryService.getInstance().getPackage(dir) != null) {
             return;
           }
         }
index 421e486836bc4f0d9408580f99120052e6fda3a3..5a63ed8d5705ebfeef5b8ce4f699f93e16308a1a 100644 (file)
@@ -33,6 +33,7 @@ import com.intellij.uiDesigner.UIDesignerBundle;
 import com.intellij.util.IncorrectOperationException;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
 
 import javax.swing.*;
 import java.io.IOException;
@@ -56,7 +57,7 @@ public abstract class AbstractCreateFormAction extends CreateElementActionBase i
         final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
         final PsiDirectory[] dirs = view.getDirectories();
         for (final PsiDirectory dir : dirs) {
-          if (projectFileIndex.isInSourceContent(dir.getVirtualFile()) && JavaDirectoryService.getInstance().getPackage(dir) != null) {
+          if (projectFileIndex.isUnderSourceRootOfType(dir.getVirtualFile(), JavaModuleSourceRootTypes.SOURCES) && JavaDirectoryService.getInstance().getPackage(dir) != null) {
             return;
           }
         }