diff --git a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java index 072e6b3ff52a..a0a5ed2e5775 100644 --- a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java +++ b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java @@ -32,8 +32,10 @@ import com.intellij.testFramework.IdeaTestCase; import com.intellij.testFramework.PlatformTestCase; import com.intellij.testFramework.PsiTestUtil; import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.java.JavaResourceRootType; +import org.jetbrains.jps.model.java.JavaSourceRootType; +import org.jetbrains.jps.model.module.JpsModuleSourceRootType; import java.io.File; import java.io.IOException; @@ -70,6 +72,8 @@ public class DirectoryIndexTest extends IdeaTestCase { private VirtualFile myExcludeDir; private VirtualFile myOutputDir; private VirtualFile myModule1OutputDir; + private VirtualFile myResDir; + private VirtualFile myTestResDir; @Override protected void setUp() throws Exception { @@ -91,6 +95,8 @@ public class DirectoryIndexTest extends IdeaTestCase { pack1 testSrc pack2 + res + testRes lib src cls @@ -113,6 +119,8 @@ public class DirectoryIndexTest extends IdeaTestCase { myPack1Dir = mySrcDir1.createChildDirectory(DirectoryIndexTest.this, "pack1"); myTestSrc1 = mySrcDir1.createChildDirectory(DirectoryIndexTest.this, "testSrc"); myPack2Dir = myTestSrc1.createChildDirectory(DirectoryIndexTest.this, "pack2"); + myResDir = myModule1Dir.createChildDirectory(DirectoryIndexTest.this, "res"); + myTestResDir = myModule1Dir.createChildDirectory(DirectoryIndexTest.this, "testRes"); myLibDir = myModule1Dir.createChildDirectory(DirectoryIndexTest.this, "lib"); myLibSrcDir = myLibDir.createChildDirectory(DirectoryIndexTest.this, "src"); @@ -136,6 +144,9 @@ public class DirectoryIndexTest extends IdeaTestCase { PsiTestUtil.addContentRoot(myModule, myModule1Dir); PsiTestUtil.addSourceRoot(myModule, mySrcDir1); PsiTestUtil.addSourceRoot(myModule, myTestSrc1, true); + PsiTestUtil.addSourceRoot(myModule, myResDir, JavaResourceRootType.RESOURCE); + PsiTestUtil.addSourceRoot(myModule, myTestResDir, JavaResourceRootType.TEST_RESOURCE); + ModuleRootModificationUtil.addModuleLibrary(myModule, "lib.js", singletonList(myFileLibCls.getUrl()), singletonList(myFileLibSrc.getUrl())); } @@ -182,29 +193,31 @@ public class DirectoryIndexTest extends IdeaTestCase { checkInfoNull(myRootVFile); // beware: files in directory index - checkInfo(myFileLibSrc, null, false, false, false, true, ""); - checkInfo(myFileLibCls, null, false, false, true, false, ""); + checkInfo(myFileLibSrc, null, false, true, "", null); + checkInfo(myFileLibCls, null, true, false, "", null); - checkInfo(myModule1Dir, myModule, false, false, false, false, null); - checkInfo(mySrcDir1, myModule, true, false, false, false, "", myModule); - checkInfo(myPack1Dir, myModule, true, false, false, false, "pack1", myModule); - checkInfo(myTestSrc1, myModule, true, true, false, false, "", myModule); - checkInfo(myPack2Dir, myModule, true, true, false, false, "pack2", myModule); + checkInfo(myModule1Dir, myModule, false, false, null, null); + checkInfo(mySrcDir1, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule); + checkInfo(myPack1Dir, myModule, false, false, "pack1", JavaSourceRootType.SOURCE, myModule); + checkInfo(myTestSrc1, myModule, false, false, "", JavaSourceRootType.TEST_SOURCE, myModule); + checkInfo(myPack2Dir, myModule, false, false, "pack2", JavaSourceRootType.TEST_SOURCE, myModule); + checkInfo(myResDir, myModule, false, false, "", JavaResourceRootType.RESOURCE, myModule); + checkInfo(myTestResDir, myModule, false, false, "", JavaResourceRootType.TEST_RESOURCE, myModule); - checkInfo(myLibDir, myModule, false, false, false, false, null); - checkInfo(myLibSrcDir, myModule, false, false, false, true, "", myModule2); - checkInfo(myLibClsDir, myModule, false, false, true, false, "", myModule2); + checkInfo(myLibDir, myModule, false, false, null, null); + checkInfo(myLibSrcDir, myModule, false, true, "", null, myModule2); + checkInfo(myLibClsDir, myModule, true, false, "", null, myModule2); - checkInfo(myModule2Dir, myModule2, false, false, false, false, null); - checkInfo(mySrcDir2, myModule2, true, false, false, false, "", myModule2, myModule3); + checkInfo(myModule2Dir, myModule2, false, false, null, null); + checkInfo(mySrcDir2, myModule2, false, false, "", JavaSourceRootType.SOURCE, myModule2, myModule3); checkInfoNull(myCvsDir); checkInfoNull(myExcludeDir); - checkInfo(myModule3Dir, myModule3, false, false, false, false, null); + checkInfo(myModule3Dir, myModule3, false, false, null, null); } public void testDirsByPackageName() { - checkPackage("", myFileLibSrc, myFileLibCls, mySrcDir1, myTestSrc1, myLibSrcDir, myLibClsDir, mySrcDir2); + checkPackage("", myFileLibSrc, myFileLibCls, mySrcDir1, myTestSrc1, myResDir, myTestResDir, myLibSrcDir, myLibClsDir, mySrcDir2); checkPackage("pack1", myPack1Dir); checkPackage("pack2", myPack2Dir); } @@ -331,8 +344,8 @@ public class DirectoryIndexTest extends IdeaTestCase { myIndex.checkConsistency(); - checkInfo(myModule2Dir, myModule2, false, false, false, false, null); - checkInfo(mySrcDir2, myModule2, true, false, false, false, "", myModule2, myModule3); + checkInfo(myModule2Dir, myModule2, false, false, null, null); + checkInfo(mySrcDir2, myModule2, false, false, "", JavaSourceRootType.SOURCE, myModule2, myModule3); } public void testResettingProjectOutputPath() throws Exception { @@ -471,8 +484,8 @@ public class DirectoryIndexTest extends IdeaTestCase { myIndex.checkConsistency(); - checkInfo(myModule1Dir, myModule, false, false, true, false, "", myModule); - checkInfo(mySrcDir1, myModule, true, false, true, false, "", myModule); + checkInfo(myModule1Dir, myModule, true, false, "", null, myModule); + checkInfo(mySrcDir1, myModule, true, false, "", JavaSourceRootType.SOURCE, myModule); } @@ -485,16 +498,19 @@ public class DirectoryIndexTest extends IdeaTestCase { private void checkInfo(VirtualFile dir, @Nullable Module module, - boolean isInModuleSource, - boolean isTestSource, boolean isInLibrary, boolean isInLibrarySource, - @Nullable String packageName, + @Nullable String packageName, final JpsModuleSourceRootType moduleSourceRootType, Module... modulesOfOrderEntries) { DirectoryInfo info = checkInfoNotNull(dir); assertEquals(module, info.getModule()); - assertEquals(isInModuleSource, info.isInModuleSource()); - assertEquals(isTestSource, info.isTestSource()); + if (moduleSourceRootType != null) { + assertTrue(info.isInModuleSource()); + assertEquals(moduleSourceRootType, myIndex.getSourceRootType(info)); + } + else { + assertFalse(info.isInModuleSource()); + } assertEquals(isInLibrary, info.hasLibraryClassRoot()); assertEquals(isInLibrarySource, info.isInLibrarySource()); @@ -510,10 +526,10 @@ public class DirectoryIndexTest extends IdeaTestCase { } } - private void checkInfoNull(@NotNull VirtualFile dir) { + private void checkInfoNull(VirtualFile dir) { assertNull(myIndex.getInfoForDirectory(dir)); } - private DirectoryInfo checkInfoNotNull(@NotNull VirtualFile output2) { + private DirectoryInfo checkInfoNotNull(VirtualFile output2) { DirectoryInfo info = myIndex.getInfoForDirectory(output2); assertNotNull(output2.toString(), info); info.assertConsistency(); diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JavaModuleSourceRootTypes.java b/jps/model-api/src/org/jetbrains/jps/model/java/JavaModuleSourceRootTypes.java index a3b0a753d3df..d7217918de6a 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/JavaModuleSourceRootTypes.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/JavaModuleSourceRootTypes.java @@ -16,6 +16,7 @@ package org.jetbrains.jps.model.java; import com.intellij.util.containers.ContainerUtilRt; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.module.JpsModuleSourceRootType; import java.util.Set; @@ -28,4 +29,8 @@ public class JavaModuleSourceRootTypes { public static final Set RESOURCES = ContainerUtilRt.newHashSet(JavaResourceRootType.RESOURCE, JavaResourceRootType.TEST_RESOURCE); public static final Set> PRODUCTION = ContainerUtilRt.newHashSet(JavaSourceRootType.SOURCE, JavaResourceRootType.RESOURCE); public static final Set> TESTS = ContainerUtilRt.newHashSet(JavaSourceRootType.TEST_SOURCE, JavaResourceRootType.TEST_RESOURCE); + + public static boolean isTestSourceOrResource(@Nullable JpsModuleSourceRootType type) { + return JavaSourceRootType.TEST_SOURCE.equals(type) || JavaResourceRootType.TEST_RESOURCE.equals(type); + } } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java index 9e1fdb120992..047f8271369b 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java @@ -54,6 +54,7 @@ import gnu.trove.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; +import org.jetbrains.jps.model.module.JpsModuleSourceRootType; import java.util.*; @@ -103,6 +104,8 @@ public class DirectoryIndexImpl extends DirectoryIndex { myState.myExcludeRootsMap.clear(); myState.myPackageNameToDirsMap.clear(); myState.myProjectExcludeRoots.clear(); + myState.myRootTypeId.clear(); + myState.myRootTypes.clear(); } }); } @@ -236,7 +239,7 @@ public class DirectoryIndexImpl extends DirectoryIndex { if (parentInfo.isInModuleSource()) { String newDirPackageName = getPackageNameForSubdir(parentPackage, file.getName()); state.fillMapWithModuleSource(module, (NewVirtualFile)parentContentRoot, file, newDirPackageName, - (NewVirtualFile)parentInfo.getSourceRoot(), parentInfo.isTestSource(), null, interned); + (NewVirtualFile)parentInfo.getSourceRoot(), parentInfo.getSourceRootTypeId(), null, interned); } } @@ -540,6 +543,15 @@ public class DirectoryIndexImpl extends DirectoryIndex { return myState.getInfo(((NewVirtualFile)dir).getId()); } + @Override + @Nullable + public JpsModuleSourceRootType getSourceRootType(@NotNull DirectoryInfo info) { + if (info.isInModuleSource()) { + return myState.getRootTypeById(info.getSourceRootTypeId()); + } + return null; + } + @Override public boolean isProjectExcludeRoot(@NotNull VirtualFile dir) { checkAvailability(); @@ -628,6 +640,8 @@ public class DirectoryIndexImpl extends DirectoryIndex { private final TObjectIntHashMap myPackageNameToDirsMap = new TObjectIntHashMap(INT_ARRAY_STRATEGY); private final List multiDirPackages = new ArrayList(Arrays.asList(new int[]{-1})); private final TIntObjectHashMap myDirToPackageName = new TIntObjectHashMap(); + private final TObjectIntHashMap> myRootTypeId = new TObjectIntHashMap>(); + private final List> myRootTypes = new ArrayList>(); private volatile boolean writable = true; private IndexState() { @@ -784,7 +798,7 @@ public class DirectoryIndexImpl extends DirectoryIndex { VirtualFile contentRoot, VirtualFile sourceRoot, VirtualFile libraryClassRoot, - @DirectoryInfo.SourceFlag int sourceFlag, + int sourceRootTypeData, OrderEntry[] orderEntries) { if (contentRoot != null) { assertAncestor(info, contentRoot, id); @@ -795,7 +809,7 @@ public class DirectoryIndexImpl extends DirectoryIndex { assertAncestor(info, root, ((NewVirtualFile)sourceRoot).getId()); } } - DirectoryInfo newInfo = info.with(module, contentRoot, sourceRoot, libraryClassRoot, (byte)sourceFlag, orderEntries); + DirectoryInfo newInfo = info.with(module, contentRoot, sourceRoot, libraryClassRoot, sourceRootTypeData, orderEntries); storeInfo(newInfo, id); return newInfo; } @@ -876,19 +890,37 @@ public class DirectoryIndexImpl extends DirectoryIndex { for (SourceFolder sourceFolder : sourceFolders) { VirtualFile dir = sourceFolder.getFile(); if (dir instanceof NewVirtualFile && contentRoot instanceof NewVirtualFile) { + int rootTypeId = getRootTypeId(sourceFolder.getRootType()); fillMapWithModuleSource(module, (NewVirtualFile)contentRoot, (NewVirtualFile)dir, sourceFolder.getPackagePrefix(), - (NewVirtualFile)dir, sourceFolder.isTestSource(), progress, interned); + (NewVirtualFile)dir, rootTypeId, progress, interned); } } } } + private int getRootTypeId(JpsModuleSourceRootType rootType) { + if (myRootTypeId.containsKey(rootType)) { + return myRootTypeId.get(rootType); + } + + int id = myRootTypes.size(); + myRootTypes.add(rootType); + myRootTypeId.put(rootType, id); + return id; + } + + @Nullable + private JpsModuleSourceRootType getRootTypeById(int id) { + if (id >= myRootTypes.size()) return null; + return myRootTypes.get(id); + } + private void fillMapWithModuleSource(@NotNull final Module module, @NotNull final NewVirtualFile contentRoot, @NotNull final NewVirtualFile dir, @NotNull final String packageName, @NotNull final NewVirtualFile sourceRoot, - final boolean isTestSource, + final int rootTypeId, @Nullable final ProgressIndicator progress, final @Nullable TObjectIntHashMap interned ) { @@ -915,9 +947,8 @@ public class DirectoryIndexImpl extends DirectoryIndex { assert VfsUtilCore.isAncestor(dir, file, false) : "dir: " + dir + " (" + dir.getFileSystem() + "); file: " + file + " (" + file.getFileSystem() + ")"; - int flag = info.getSourceFlag() | DirectoryInfo.MODULE_SOURCE_FLAG; - flag = BitUtil.set(flag, DirectoryInfo.TEST_SOURCE_FLAG, isTestSource); - info = with(id, info, null, null, sourceRoot, null, (byte)flag, null); + int flag = DirectoryInfo.createSourceRootTypeData(true, info.isInLibrarySource(), rootTypeId); + info = with(id, info, null, null, sourceRoot, null, flag, null); String currentPackage = myPackages.isEmpty() ? packageName : getPackageNameForSubdir(myPackages.peek(), file.getName()); myPackages.push(currentPackage); @@ -976,8 +1007,8 @@ public class DirectoryIndexImpl extends DirectoryIndex { if (isAnotherRoot(dirId)) return false; // another library source root starts here } - int flag = info.getSourceFlag() | DirectoryInfo.LIBRARY_SOURCE_FLAG; - with(dirId, info, null, null, sourceRoot, null, (byte)flag, null); + int data = DirectoryInfo.createSourceRootTypeData(info.isInModuleSource(), true, info.getSourceRootTypeId()); + with(dirId, info, null, null, sourceRoot, null, data, null); final String packageName = getCurrentValue(); final String newPackageName = Comparing.equal(file, dir) ? packageName : getPackageNameForSubdir(packageName, file.getName()); @@ -1406,6 +1437,15 @@ public class DirectoryIndexImpl extends DirectoryIndex { } }); + copy.myRootTypes.addAll(myRootTypes); + myRootTypeId.forEachEntry(new TObjectIntProcedure>() { + @Override + public boolean execute(JpsModuleSourceRootType root, int id) { + copy.myRootTypeId.put(root, id); + return true; + } + }); + return copy; } } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndex.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndex.java index 953cf2d57474..9e7638e596ed 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndex.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndex.java @@ -23,6 +23,7 @@ import com.intellij.util.Query; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; +import org.jetbrains.jps.model.module.JpsModuleSourceRootType; public abstract class DirectoryIndex { public static DirectoryIndex getInstance(Project project) { @@ -35,6 +36,9 @@ public abstract class DirectoryIndex { public abstract DirectoryInfo getInfoForDirectory(@NotNull VirtualFile dir); + @Nullable + public abstract JpsModuleSourceRootType getSourceRootType(@NotNull DirectoryInfo info); + public abstract boolean isProjectExcludeRoot(@NotNull VirtualFile dir); @NotNull diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java index 8755f49aa26e..7d45b749e305 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java @@ -26,7 +26,6 @@ import com.intellij.util.ArrayFactory; import com.intellij.util.ArrayUtil; import com.intellij.util.BitUtil; import com.intellij.util.IncorrectOperationException; -import org.intellij.lang.annotations.MagicConstant; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; @@ -42,15 +41,9 @@ public final class DirectoryInfo { private final VirtualFile contentRoot; private final VirtualFile sourceRoot; - public static final byte TEST_SOURCE_FLAG = 1; // (makes sense only if MODULE_SOURCE_FLAG is set) - public static final byte LIBRARY_SOURCE_FLAG = 2; // set if it's a directory with sources of some library - public static final byte MODULE_SOURCE_FLAG = 4; // set if files in this directory belongs to sources of the module (if field 'module' is not null) - - @MagicConstant(flags = {TEST_SOURCE_FLAG, LIBRARY_SOURCE_FLAG, MODULE_SOURCE_FLAG}) - public @interface SourceFlag {} - - @SourceFlag - private final byte sourceFlag; + private static final byte MODULE_SOURCE_FLAG = 1; // set if files in this directory belongs to sources of the module (if field 'module' is not null) + private static final byte LIBRARY_SOURCE_FLAG = 2; // set if it's a directory with sources of some library + private final byte sourceRootTypeData;//two least significant bits are used for MODULE_SOURCE_FLAG and LIBRARY_SOURCE_FLAG, the remaining bits store module root type id (source/tests/resources/...) /** * orderEntry to (classes of) which a directory belongs @@ -66,13 +59,13 @@ public final class DirectoryInfo { VirtualFile contentRoot, VirtualFile sourceRoot, VirtualFile libraryClassRoot, - @SourceFlag byte sourceFlag, + byte sourceRootTypeData, OrderEntry[] orderEntries) { this.module = module; this.libraryClassRoot = libraryClassRoot; this.contentRoot = contentRoot; this.sourceRoot = sourceRoot; - this.sourceFlag = sourceFlag; + this.sourceRootTypeData = sourceRootTypeData; this.orderEntries = orderEntries; } @@ -83,7 +76,7 @@ public final class DirectoryInfo { DirectoryInfo info = (DirectoryInfo)o; - return sourceFlag == info.sourceFlag && + return sourceRootTypeData == info.sourceRootTypeData && Comparing.equal(contentRoot, info.contentRoot) && Comparing.equal(libraryClassRoot, info.libraryClassRoot) && Comparing.equal(module, info.module) && @@ -97,7 +90,7 @@ public final class DirectoryInfo { result = 31 * result + (libraryClassRoot != null ? libraryClassRoot.hashCode() : 0); result = 31 * result + (contentRoot != null ? contentRoot.hashCode() : 0); result = 31 * result + (sourceRoot != null ? sourceRoot.hashCode() : 0); - result = 31 * result + (int)sourceFlag; + result = 31 * result + (int)sourceRootTypeData; return result; } @@ -106,7 +99,7 @@ public final class DirectoryInfo { return "DirectoryInfo{" + "module=" + getModule() + ", isInModuleSource=" + isInModuleSource() + - ", isTestSource=" + isTestSource() + + ", rootTypeId=" + getSourceRootTypeId() + ", isInLibrarySource=" + isInLibrarySource() + ", libraryClassRoot=" + getLibraryClassRoot() + ", contentRoot=" + getContentRoot() + @@ -293,15 +286,11 @@ public final class DirectoryInfo { } public boolean isInModuleSource() { - return BitUtil.isSet(sourceFlag, MODULE_SOURCE_FLAG); - } - - public boolean isTestSource() { - return BitUtil.isSet(sourceFlag, TEST_SOURCE_FLAG); + return BitUtil.isSet(sourceRootTypeData, MODULE_SOURCE_FLAG); } public boolean isInLibrarySource() { - return BitUtil.isSet(sourceFlag, LIBRARY_SOURCE_FLAG); + return BitUtil.isSet(sourceRootTypeData, LIBRARY_SOURCE_FLAG); } public Module getModule() { @@ -317,16 +306,16 @@ public final class DirectoryInfo { VirtualFile contentRoot, VirtualFile sourceRoot, VirtualFile libraryClassRoot, - @SourceFlag byte sourceFlag, + int sourceRootTypeData, OrderEntry[] orderEntries) { return new DirectoryInfo(iff(module, this.module), iff(contentRoot, this.contentRoot), iff(sourceRoot, this.sourceRoot), - iff(libraryClassRoot, this.libraryClassRoot), sourceFlag == 0 ? this.sourceFlag : sourceFlag, + iff(libraryClassRoot, this.libraryClassRoot), sourceRootTypeData == 0 ? this.sourceRootTypeData : (byte)sourceRootTypeData, iff(orderEntries, this.orderEntries)); } @NotNull public DirectoryInfo withInternedEntries(@NotNull OrderEntry[] orderEntries) { - return new DirectoryInfo(module, contentRoot, sourceRoot, libraryClassRoot, sourceFlag, orderEntries); + return new DirectoryInfo(module, contentRoot, sourceRoot, libraryClassRoot, sourceRootTypeData, orderEntries); } @TestOnly @@ -337,8 +326,11 @@ public final class DirectoryInfo { } } - @SourceFlag - public int getSourceFlag() { - return sourceFlag; + public int getSourceRootTypeId() { + return sourceRootTypeData >> 2; + } + + public static int createSourceRootTypeData(boolean isInModuleSources, boolean isInLibrarySource, int moduleSourceRootTypeId) { + return (isInModuleSources ? MODULE_SOURCE_FLAG : 0) | (isInLibrarySource ? LIBRARY_SOURCE_FLAG : 0) | moduleSourceRootTypeId << 2; } } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModuleFileIndexImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModuleFileIndexImpl.java index 72a306afe16f..ea1e4af2d77e 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModuleFileIndexImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModuleFileIndexImpl.java @@ -27,6 +27,7 @@ import com.intellij.openapi.vfs.VfsUtilCore; 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 java.util.Collections; import java.util.List; @@ -113,7 +114,7 @@ public class ModuleFileIndexImpl implements ModuleFileIndex { public boolean isInTestSourceContent(@NotNull VirtualFile fileOrDir) { if (fileOrDir.isDirectory()) { DirectoryInfo info = myDirectoryIndex.getInfoForDirectory(fileOrDir); - return info != null && info.isInModuleSource() && info.isTestSource() && myModule.equals(info.getModule()); + return info != null && info.isInModuleSource() && myModule.equals(info.getModule()) && JavaModuleSourceRootTypes.isTestSourceOrResource(myDirectoryIndex.getSourceRootType(info)); } else { VirtualFile parent = fileOrDir.getParent(); diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectFileIndexImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectFileIndexImpl.java index b7d803daa8c9..576e7608bb41 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectFileIndexImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectFileIndexImpl.java @@ -32,6 +32,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileFilter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import java.util.Arrays; import java.util.Collections; @@ -239,7 +240,7 @@ public class ProjectFileIndexImpl implements ProjectFileIndex { @Override public boolean isInTestSourceContent(@NotNull VirtualFile fileOrDir) { DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir); - return info != null && info.isInModuleSource() && info.isTestSource(); + return info != null && info.isInModuleSource() && JavaModuleSourceRootTypes.isTestSourceOrResource(myDirectoryIndex.getSourceRootType(info)); } private class ContentFilter implements VirtualFileFilter { diff --git a/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java b/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java index 6bb2857da140..84f73810d294 100644 --- a/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java +++ b/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java @@ -43,6 +43,10 @@ import junit.framework.Assert; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.JpsElement; +import org.jetbrains.jps.model.JpsElementTypeWithDefaultProperties; +import org.jetbrains.jps.model.java.JavaSourceRootType; +import org.jetbrains.jps.model.module.JpsModuleSourceRootType; import java.io.File; import java.io.IOException; @@ -159,6 +163,10 @@ public class PsiTestUtil { } public static void addSourceRoot(final Module module, final VirtualFile vDir, final boolean isTestSource) { + addSourceRoot(module, vDir, isTestSource ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE); + } + + public static void addSourceRoot(final Module module, final VirtualFile vDir, @NotNull final JpsModuleSourceRootType rootType) { new WriteCommandAction.Simple(module.getProject()) { @Override protected void run() throws Throwable { @@ -166,7 +174,7 @@ public class PsiTestUtil { final ModifiableRootModel rootModel = rootManager.getModifiableModel(); ContentEntry entry = findContentEntry(rootModel, vDir); if (entry == null) entry = rootModel.addContentEntry(vDir); - entry.addSourceFolder(vDir, isTestSource); + entry.addSourceFolder(vDir, rootType, ((JpsElementTypeWithDefaultProperties)rootType).createDefaultProperties()); rootModel.commit(); } }.execute().throwException();