mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
custom source root types supported in DirectoryIndex
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -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();
|
||||
|
||||
+2
-1
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user