project model: allow marking custom source root types as tests roots (IDEA-203651)

This commit is contained in:
nik
2018-12-07 13:57:23 +03:00
parent 41d4f02b5c
commit 2852d1e53d
11 changed files with 50 additions and 19 deletions
@@ -30,6 +30,11 @@ public class JavaModuleSourceRootTypes {
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);
/**
* @deprecated in order to check that a source root is a java-specific tests root, use {@link #TESTS} set, for arbitrary roots use
* {@link JpsModuleSourceRootType#isForTests()} instead
*/
@Deprecated
public static boolean isTestSourceOrResource(@Nullable JpsModuleSourceRootType<?> type) {
return JavaSourceRootType.TEST_SOURCE.equals(type) || JavaResourceRootType.TEST_RESOURCE.equals(type);
}
@@ -24,10 +24,18 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
*/
public class JavaResourceRootType extends JpsElementTypeBase<JavaResourceRootProperties> implements
JpsModuleSourceRootType<JavaResourceRootProperties> {
public static final JavaResourceRootType RESOURCE = new JavaResourceRootType();
public static final JavaResourceRootType TEST_RESOURCE = new JavaResourceRootType();
public static final JavaResourceRootType RESOURCE = new JavaResourceRootType(false);
public static final JavaResourceRootType TEST_RESOURCE = new JavaResourceRootType(true);
private JavaResourceRootType() {
private final boolean myForTests;
private JavaResourceRootType(boolean isForTests) {
myForTests = isForTests;
}
@Override
public boolean isForTests() {
return myForTests;
}
@NotNull
@@ -23,10 +23,18 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
* @author nik
*/
public class JavaSourceRootType extends JpsElementTypeBase<JavaSourceRootProperties> implements JpsModuleSourceRootType<JavaSourceRootProperties> {
public static final JavaSourceRootType SOURCE = new JavaSourceRootType();
public static final JavaSourceRootType TEST_SOURCE = new JavaSourceRootType();
public static final JavaSourceRootType SOURCE = new JavaSourceRootType(false);
public static final JavaSourceRootType TEST_SOURCE = new JavaSourceRootType(true);
private JavaSourceRootType() {
private final boolean myForTests;
private JavaSourceRootType(boolean isForTests) {
myForTests = isForTests;
}
@Override
public boolean isForTests() {
return myForTests;
}
@NotNull
@@ -28,4 +28,12 @@ import org.jetbrains.jps.model.JpsElementTypeWithDefaultProperties;
* @author nik
*/
public interface JpsModuleSourceRootType<P extends JpsElement> extends JpsElementType<P>, JpsElementTypeWithDefaultProperties<P> {
/**
* Returns {@code true} if roots of this type are supposed to contain test sources only. This information is used by the IDE to show files
* accordingly, process them during analysis only if 'Include test source' option is enabled, etc.
*/
default boolean isForTests() {
return false;
}
}
@@ -4,8 +4,6 @@ package org.jetbrains.intellij.build.images.sync
import org.jetbrains.intellij.build.images.ImageExtension
import org.jetbrains.intellij.build.images.imageSize
import org.jetbrains.intellij.build.images.isImage
import org.jetbrains.jps.model.java.JavaResourceRootType
import org.jetbrains.jps.model.java.JavaSourceRootType
import org.jetbrains.jps.model.serialization.JpsSerializationManager
import java.io.File
import java.io.IOException
@@ -224,8 +222,9 @@ private fun searchTestRoots(devRepoDir: String) = try {
JpsSerializationManager.getInstance()
.loadModel(devRepoDir, null)
.project.modules.flatMap {
it.getSourceRoots(JavaSourceRootType.TEST_SOURCE) +
it.getSourceRoots(JavaResourceRootType.TEST_RESOURCE)
it.sourceRoots.filter { root ->
root.rootType.isForTests
}
}.mapTo(mutableSetOf()) { it.file }
}
catch (e: IOException) {
@@ -19,6 +19,7 @@ import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
/**
* Implementations of this extension point can tell IDE whether some particular file is a test file.
@@ -32,6 +33,7 @@ import org.jetbrains.annotations.NotNull;
* properly check if they are included in built-in search scopes, etc.
*
* @see FileIndex#isInTestSourceContent(VirtualFile)
* @see JpsModuleSourceRootType#isForTests()
* @since 2016.3
* @author zolotov
*/
@@ -27,6 +27,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.module.JpsModuleSourceRootType;
/**
* @author nik
@@ -65,6 +66,11 @@ public abstract class FileIndexBase implements FileIndex {
return iterateContentUnderDirectory(dir, processor, null);
}
protected boolean isTestSourcesRoot(DirectoryInfo info) {
JpsModuleSourceRootType<?> rootType = myDirectoryIndex.getSourceRootType(info);
return rootType != null && rootType.isForTests();
}
private static boolean iterateContentUnderDirectoryWithFilter(@NotNull VirtualFile dir,
@NotNull ContentIterator iterator,
@NotNull VirtualFileFilter filter) {
@@ -26,7 +26,6 @@ import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
import java.util.Collections;
@@ -99,8 +98,7 @@ public class ModuleFileIndexImpl extends FileIndexBase implements ModuleFileInde
@Override
public boolean isInTestSourceContent(@NotNull VirtualFile fileOrDir) {
DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
return info.isInModuleSource(fileOrDir) && myModule.equals(info.getModule())
&& JavaModuleSourceRootTypes.isTestSourceOrResource(myDirectoryIndex.getSourceRootType(info));
return info.isInModuleSource(fileOrDir) && myModule.equals(info.getModule()) && isTestSourcesRoot(info);
}
@Override
@@ -17,7 +17,6 @@ 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 org.jetbrains.jps.model.module.JpsModuleSourceRootType;
import java.util.Collections;
@@ -203,7 +202,7 @@ public class ProjectFileIndexImpl extends FileIndexBase implements ProjectFileIn
@Override
public boolean isInTestSourceContent(@NotNull VirtualFile fileOrDir) {
DirectoryInfo info = getInfoForFileOrDirectory(fileOrDir);
return info.isInModuleSource(fileOrDir) && JavaModuleSourceRootTypes.isTestSourceOrResource(myDirectoryIndex.getSourceRootType(info));
return info.isInModuleSource(fileOrDir) && isTestSourcesRoot(info);
}
@Override
@@ -54,7 +54,7 @@ public class SourceFolderImpl extends ContentFolderBaseImpl implements SourceFol
@Override
public boolean isTestSource() {
return getRootType().equals(JavaSourceRootType.TEST_SOURCE) || getRootType().equals(JavaResourceRootType.TEST_RESOURCE);
return getRootType().isForTests();
}
@NotNull
@@ -19,7 +19,6 @@ import com.intellij.openapi.roots.SourceFolder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsSimpleElement;
import org.jetbrains.jps.model.java.JavaResourceRootType;
import org.jetbrains.jps.model.java.JavaSourceRootProperties;
import org.jetbrains.jps.model.java.JavaSourceRootType;
import org.jetbrains.jps.model.module.JpsModuleSourceRoot;
@@ -42,8 +41,7 @@ public class JpsSourceFolder extends JpsContentFolderBase implements SourceFolde
@Override
public boolean isTestSource() {
return mySourceRoot.getRootType() == JavaSourceRootType.TEST_SOURCE ||
mySourceRoot.getRootType() == JavaResourceRootType.TEST_RESOURCE;
return mySourceRoot.getRootType().isForTests();
}
@NotNull