1 package com.intellij.coverage;
3 import com.intellij.execution.configurations.ModuleBasedConfiguration;
4 import com.intellij.execution.configurations.RunConfigurationBase;
5 import com.intellij.openapi.diagnostic.Logger;
6 import com.intellij.openapi.module.Module;
7 import com.intellij.openapi.project.Project;
8 import com.intellij.openapi.roots.ProjectRootModificationTracker;
9 import com.intellij.openapi.util.Comparing;
10 import com.intellij.openapi.util.text.StringUtil;
11 import com.intellij.psi.search.GlobalSearchScope;
12 import com.intellij.psi.search.GlobalSearchScopesCore;
13 import com.intellij.psi.util.CachedValue;
14 import com.intellij.psi.util.CachedValueProvider;
15 import com.intellij.psi.util.CachedValuesManager;
16 import com.intellij.reference.SoftReference;
17 import com.intellij.rt.coverage.data.LineData;
18 import com.intellij.rt.coverage.data.ProjectData;
19 import com.intellij.util.ArrayUtilRt;
20 import com.intellij.util.Function;
21 import org.jetbrains.annotations.NotNull;
22 import org.jetbrains.annotations.Nullable;
24 import java.util.HashSet;
26 import java.util.TreeMap;
32 public class CoverageSuitesBundle {
33 private CoverageSuite[] mySuites;
34 private CoverageEngine myEngine;
36 private Set<Module> myProcessedModules;
38 private CachedValue<GlobalSearchScope> myCachedValue;
40 private SoftReference<ProjectData> myData = new SoftReference<ProjectData>(null);
41 private static final Logger LOG = Logger.getInstance("#" + CoverageSuitesBundle.class.getName());
43 public CoverageSuitesBundle(CoverageSuite suite) {
44 this(new CoverageSuite[]{suite});
47 public CoverageSuitesBundle(CoverageSuite[] suites) {
49 LOG.assertTrue(mySuites.length > 0);
50 myEngine = mySuites[0].getCoverageEngine();
51 for (CoverageSuite suite : suites) {
52 final CoverageEngine engine = suite.getCoverageEngine();
53 LOG.assertTrue(Comparing.equal(engine, myEngine));
58 public boolean isValid() {
59 for (CoverageSuite suite : mySuites) {
60 if (!suite.isValid()) return false;
66 public long getLastCoverageTimeStamp() {
68 for (CoverageSuite suite : mySuites) {
69 max = Math.max(max, suite.getLastCoverageTimeStamp());
74 public boolean isCoverageByTestApplicable() {
75 for (CoverageSuite suite : mySuites) {
76 if (suite.isCoverageByTestApplicable()) return true;
81 public boolean isCoverageByTestEnabled() {
82 for (CoverageSuite suite : mySuites) {
83 if (suite.isCoverageByTestEnabled()) return true;
89 public ProjectData getCoverageData() {
90 final ProjectData projectData = myData.get();
91 if (projectData != null) return projectData;
92 ProjectData data = new ProjectData();
93 for (CoverageSuite suite : mySuites) {
94 final ProjectData coverageData = suite.getCoverageData(null);
95 if (coverageData != null) {
96 data.merge(coverageData);
99 myData = new SoftReference<ProjectData>(data);
103 public boolean isTrackTestFolders() {
104 for (CoverageSuite suite : mySuites) {
105 if (suite.isTrackTestFolders()) return true;
110 public boolean isTracingEnabled() {
111 for (CoverageSuite suite : mySuites) {
112 if (suite.isTracingEnabled()) return true;
118 public CoverageEngine getCoverageEngine() {
122 public LineMarkerRendererWithErrorStripe getLineMarkerRenderer(int lineNumber,
123 @Nullable final String className,
124 final TreeMap<Integer, LineData> lines,
125 final boolean coverageByTestApplicable,
126 @NotNull final CoverageSuitesBundle coverageSuite,
127 final Function<Integer, Integer> newToOldConverter,
128 final Function<Integer, Integer> oldToNewConverter, boolean subCoverageActive) {
129 return myEngine.getLineMarkerRenderer(lineNumber, className, lines, coverageByTestApplicable, coverageSuite, newToOldConverter, oldToNewConverter, subCoverageActive);
132 public CoverageAnnotator getAnnotator(Project project) {
133 return myEngine.getCoverageAnnotator(project);
136 public CoverageSuite[] getSuites() {
140 public boolean contains(CoverageSuite suite) {
141 return ArrayUtilRt.find(mySuites, suite) > -1;
144 public void setCoverageData(ProjectData projectData) {
145 myData = new SoftReference<ProjectData>(projectData);
148 public void restoreCoverageData() {
149 myData = new SoftReference<ProjectData>(null);
152 public String getPresentableName() {
153 return StringUtil.join(mySuites, coverageSuite -> coverageSuite.getPresentableName(), ", ");
156 public boolean isModuleChecked(final Module module) {
157 return myProcessedModules != null && myProcessedModules.contains(module);
160 public void checkModule(final Module module) {
161 if (myProcessedModules == null) {
162 myProcessedModules = new HashSet<Module>();
164 myProcessedModules.add(module);
168 public RunConfigurationBase getRunConfiguration() {
169 for (CoverageSuite suite : mySuites) {
170 if (suite instanceof BaseCoverageSuite) {
171 final RunConfigurationBase configuration = ((BaseCoverageSuite)suite).getConfiguration();
172 if (configuration != null) {
173 return configuration;
180 public GlobalSearchScope getSearchScope(final Project project) {
181 if (myCachedValue == null) {
182 myCachedValue = CachedValuesManager.getManager(project).createCachedValue(
183 () -> new CachedValueProvider.Result<GlobalSearchScope>(getSearchScopeInner(project), ProjectRootModificationTracker.getInstance(project)), false);
185 return myCachedValue.getValue();
189 private GlobalSearchScope getSearchScopeInner(Project project) {
190 final RunConfigurationBase configuration = getRunConfiguration();
191 if (configuration instanceof ModuleBasedConfiguration) {
192 final Module module = ((ModuleBasedConfiguration)configuration).getConfigurationModule().getModule();
193 if (module != null) {
194 return GlobalSearchScope.moduleRuntimeScope(module, isTrackTestFolders());
197 return isTrackTestFolders() ? GlobalSearchScope.projectScope(project) : GlobalSearchScopesCore.projectProductionScope(project);