From e82ec6fcc0817590739dca0948c8c50f340c962d Mon Sep 17 00:00:00 2001 From: Alexander Zolotov Date: Wed, 20 Nov 2019 18:47:45 +0300 Subject: [PATCH] Do not allow showing coverage reports with different engines (GO-7540) GitOrigin-RevId: 118f7c164068f1d39248d342c4cd1d26b371a372 --- .../actions/CoverageSuiteChooserDialog.java | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/plugins/coverage-common/src/com/intellij/coverage/actions/CoverageSuiteChooserDialog.java b/plugins/coverage-common/src/com/intellij/coverage/actions/CoverageSuiteChooserDialog.java index eecd70be29ec..8932aa4de42c 100644 --- a/plugins/coverage-common/src/com/intellij/coverage/actions/CoverageSuiteChooserDialog.java +++ b/plugins/coverage-common/src/com/intellij/coverage/actions/CoverageSuiteChooserDialog.java @@ -5,18 +5,19 @@ import com.intellij.CommonBundle; import com.intellij.coverage.*; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ComboBoxAction; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.ui.ValidationInfo; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.*; import com.intellij.util.IconUtil; import com.intellij.util.PlatformIcons; +import com.intellij.util.containers.TreeTraversal; import com.intellij.util.text.DateFormatUtil; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.NonNls; @@ -38,7 +39,6 @@ public class CoverageSuiteChooserDialog extends DialogWrapper { private final Project myProject; private final CheckboxTree mySuitesTree; private final CoverageDataManager myCoverageManager; - private static final Logger LOG = Logger.getInstance(CoverageSuiteChooserDialog.class); private final CheckedTreeNode myRootNode; private CoverageEngine myEngine; @@ -96,12 +96,27 @@ public class CoverageSuiteChooserDialog extends DialogWrapper { @Override protected void doOKAction() { final List suites = collectSelectedSuites(); - myCoverageManager - .chooseSuitesBundle(suites.isEmpty() ? null : new CoverageSuitesBundle(suites.toArray(new CoverageSuite[0]))); + myCoverageManager.chooseSuitesBundle(suites.isEmpty() ? null : new CoverageSuitesBundle(suites.toArray(new CoverageSuite[0]))); ((CoverageDataManagerImpl)myCoverageManager).addRootsToWatch(suites); super.doOKAction(); } + @NotNull + @Override + protected List doValidateAll() { + CoverageEngine engine = null; + for (CoverageSuite suite : collectSelectedSuites()) { + if (engine == null) { + engine = suite.getCoverageEngine(); + continue; + } + if (!Comparing.equal(engine, suite.getCoverageEngine())) { + return Collections.singletonList(new ValidationInfo("Cannot show coverage reports from different engines.", mySuitesTree)); + } + } + return super.doValidateAll(); + } + @NotNull @Override protected Action[] createActions() { @@ -132,7 +147,7 @@ public class CoverageSuiteChooserDialog extends DialogWrapper { private List collectSelectedSuites() { final List suites = new ArrayList<>(); - TreeUtil.traverse(myRootNode, treeNode -> { + TreeUtil.treeNodeTraverser(myRootNode).traverse(TreeTraversal.PRE_ORDER_DFS).processEach(treeNode -> { if (treeNode instanceof CheckedTreeNode && ((CheckedTreeNode)treeNode).isChecked()) { final Object userObject = ((CheckedTreeNode)treeNode).getUserObject(); if (userObject instanceof CoverageSuite) {