Revert "prefer to use JDK utils in low-level classes, do not extend DynamicBundle...
[idea/community.git] / platform / lang-api / src / com / intellij / openapi / module / ModuleUtil.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.openapi.module;
3
4 import com.intellij.openapi.project.Project;
5 import com.intellij.openapi.roots.ModuleRootManager;
6 import com.intellij.openapi.roots.ProjectRootManager;
7 import com.intellij.openapi.util.Key;
8 import com.intellij.psi.util.CachedValueProvider;
9 import com.intellij.psi.util.CachedValuesManager;
10 import com.intellij.psi.util.ParameterizedCachedValue;
11 import com.intellij.psi.util.ParameterizedCachedValueProvider;
12 import com.intellij.util.containers.MultiMap;
13 import org.jetbrains.annotations.ApiStatus;
14 import org.jetbrains.annotations.NotNull;
15
16 import java.util.Arrays;
17 import java.util.Collection;
18
19 public final class ModuleUtil extends ModuleUtilCore {
20   private static final ParameterizedCachedValueProvider<MultiMap<ModuleType<?>, Module>, Project> MODULE_BY_TYPE_VALUE_PROVIDER = param -> {
21     MultiMap<ModuleType<?>, Module> map = new MultiMap<>();
22     for (Module module : ModuleManager.getInstance(param).getModules()) {
23       map.putValue(ModuleType.get(module), module);
24     }
25     return CachedValueProvider.Result.createSingleDependency(map, ProjectRootManager.getInstance(param));
26   };
27
28   private static final ParameterizedCachedValueProvider<Boolean, Project> HAS_TEST_ROOTS_PROVIDER = project -> {
29     boolean hasTestRoots =
30       Arrays.stream(ModuleManager.getInstance(project).getModules())
31         .flatMap(module -> Arrays.stream(ModuleRootManager.getInstance(module).getContentEntries()))
32         .flatMap(entry -> Arrays.stream(entry.getSourceFolders()))
33         .anyMatch(folder -> folder.getRootType().isForTests());
34     return CachedValueProvider.Result.createSingleDependency(hasTestRoots, ProjectRootManager.getInstance(project));
35   };
36
37   private static final Key<ParameterizedCachedValue<MultiMap<ModuleType<?>, Module>, Project>> MODULES_BY_TYPE_KEY = Key.create("MODULES_BY_TYPE");
38   private static final Key<ParameterizedCachedValue<Boolean, Project>> HAS_TEST_ROOTS_KEY = Key.create("HAS_TEST_ROOTS");
39
40   private ModuleUtil() {}
41
42   @NotNull
43   public static Collection<Module> getModulesOfType(@NotNull Project project, @NotNull ModuleType<?> moduleType) {
44     return CachedValuesManager.getManager(project)
45       .getParameterizedCachedValue(project, MODULES_BY_TYPE_KEY, MODULE_BY_TYPE_VALUE_PROVIDER, false, project)
46       .get(moduleType);
47   }
48
49   public static boolean hasModulesOfType(@NotNull Project project, @NotNull ModuleType<?> module) {
50     return !getModulesOfType(project, module).isEmpty();
51   }
52
53   public static boolean hasTestSourceRoots(@NotNull Project project) {
54     return CachedValuesManager.getManager(project).getParameterizedCachedValue(project, HAS_TEST_ROOTS_KEY, HAS_TEST_ROOTS_PROVIDER, false, project);
55   }
56
57   /** @deprecated use {@link ModuleType#get(Module)} instead */
58   @Deprecated
59   @ApiStatus.ScheduledForRemoval(inVersion = "2021.3")
60   public static ModuleType<?> getModuleType(@NotNull Module module) {
61     return ModuleType.get(module);
62   }
63 }