From 2852d1e53d1d050ad285f85afade104ab15fcf29 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 7 Dec 2018 12:54:55 +0300 Subject: [PATCH] project model: allow marking custom source root types as tests roots (IDEA-203651) --- .../jps/model/java/JavaModuleSourceRootTypes.java | 5 +++++ .../jps/model/java/JavaResourceRootType.java | 14 +++++++++++--- .../jps/model/java/JavaSourceRootType.java | 14 +++++++++++--- .../jps/model/module/JpsModuleSourceRootType.java | 8 ++++++++ .../intellij/build/images/sync/checkIcons.kt | 7 +++---- .../intellij/openapi/roots/TestSourcesFilter.java | 2 ++ .../intellij/openapi/roots/impl/FileIndexBase.java | 6 ++++++ .../openapi/roots/impl/ModuleFileIndexImpl.java | 4 +--- .../openapi/roots/impl/ProjectFileIndexImpl.java | 3 +-- .../openapi/roots/impl/SourceFolderImpl.java | 2 +- .../model/impl/module/content/JpsSourceFolder.java | 4 +--- 11 files changed, 50 insertions(+), 19 deletions(-) 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 d7217918de6a..37fa809de90c 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 @@ -30,6 +30,11 @@ public class JavaModuleSourceRootTypes { public static final Set> PRODUCTION = ContainerUtilRt.newHashSet(JavaSourceRootType.SOURCE, JavaResourceRootType.RESOURCE); public static final Set> 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); } diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JavaResourceRootType.java b/jps/model-api/src/org/jetbrains/jps/model/java/JavaResourceRootType.java index d3e122aa957d..176034d47cfb 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/JavaResourceRootType.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/JavaResourceRootType.java @@ -24,10 +24,18 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType; */ public class JavaResourceRootType extends JpsElementTypeBase implements JpsModuleSourceRootType { - 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 diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JavaSourceRootType.java b/jps/model-api/src/org/jetbrains/jps/model/java/JavaSourceRootType.java index c10c8cac70a6..a4f3a3cb3598 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/JavaSourceRootType.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/JavaSourceRootType.java @@ -23,10 +23,18 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType; * @author nik */ public class JavaSourceRootType extends JpsElementTypeBase implements JpsModuleSourceRootType { - 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 diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModuleSourceRootType.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModuleSourceRootType.java index 873664a0ff2d..474d38dd57ee 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModuleSourceRootType.java +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModuleSourceRootType.java @@ -28,4 +28,12 @@ import org.jetbrains.jps.model.JpsElementTypeWithDefaultProperties; * @author nik */ public interface JpsModuleSourceRootType

extends JpsElementType

, JpsElementTypeWithDefaultProperties

{ + + /** + * 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; + } } diff --git a/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/checkIcons.kt b/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/checkIcons.kt index 4bd6b67487bb..05fb2899b1c2 100644 --- a/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/checkIcons.kt +++ b/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/checkIcons.kt @@ -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) { diff --git a/platform/projectModel-api/src/com/intellij/openapi/roots/TestSourcesFilter.java b/platform/projectModel-api/src/com/intellij/openapi/roots/TestSourcesFilter.java index 2a5ce8c2db91..8d455f5901a6 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/roots/TestSourcesFilter.java +++ b/platform/projectModel-api/src/com/intellij/openapi/roots/TestSourcesFilter.java @@ -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 */ diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/FileIndexBase.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/FileIndexBase.java index 2d2f4b2ce2fd..c66682740d10 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/FileIndexBase.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/FileIndexBase.java @@ -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) { 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 68cdefc1a47a..bc930a38b7ea 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 @@ -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 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 f96b6cca8a08..32ccbeac6e7e 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 @@ -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 diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/SourceFolderImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/SourceFolderImpl.java index ac0320196ee1..c23a09c048f1 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/SourceFolderImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/SourceFolderImpl.java @@ -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 diff --git a/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsSourceFolder.java b/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsSourceFolder.java index 6b1d8b08b55e..ad68207cc10d 100644 --- a/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsSourceFolder.java +++ b/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsSourceFolder.java @@ -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