custom source root types supported in DirectoryIndex

This commit is contained in:
nik
2013-09-03 16:16:22 +04:00
parent f6ed90cf04
commit 52a0af994e
8 changed files with 133 additions and 66 deletions
@@ -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();
@@ -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<JavaResourceRootType> RESOURCES = ContainerUtilRt.newHashSet(JavaResourceRootType.RESOURCE, JavaResourceRootType.TEST_RESOURCE);
public static final Set<? extends JpsModuleSourceRootType<?>> PRODUCTION = ContainerUtilRt.newHashSet(JavaSourceRootType.SOURCE, JavaResourceRootType.RESOURCE);
public static final Set<? extends JpsModuleSourceRootType<?>> 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);
}
}
@@ -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<int[]> myPackageNameToDirsMap = new TObjectIntHashMap<int[]>(INT_ARRAY_STRATEGY);
private final List<int[]> multiDirPackages = new ArrayList<int[]>(Arrays.asList(new int[]{-1}));
private final TIntObjectHashMap<int[]> myDirToPackageName = new TIntObjectHashMap<int[]>();
private final TObjectIntHashMap<JpsModuleSourceRootType<?>> myRootTypeId = new TObjectIntHashMap<JpsModuleSourceRootType<?>>();
private final List<JpsModuleSourceRootType<?>> myRootTypes = new ArrayList<JpsModuleSourceRootType<?>>();
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<String> 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<JpsModuleSourceRootType<?>>() {
@Override
public boolean execute(JpsModuleSourceRootType<?> root, int id) {
copy.myRootTypeId.put(root, id);
return true;
}
});
return copy;
}
}
@@ -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
@@ -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;
}
}
@@ -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();
@@ -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 {
@@ -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<JpsElement>)rootType).createDefaultProperties());
rootModel.commit();
}
}.execute().throwException();