Skip to content

Commit 5745769

Browse files
authored
fix: open/ignored issue filtering [IDE-942] (#265)
The previous filtering logic was sound but confusing to follow, which led to bugs in the predicates (fixed in this commit). Plus fixed other bugs with open & ignored issue filtering.
1 parent 50ea458 commit 5745769

File tree

10 files changed

+35
-26
lines changed

10 files changed

+35
-26
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
- add scan summary to custom UI, updating scan statuses live
77
- added support for DeepCode AI Fixes
88

9+
### Fixes
10+
- fixes open & ignored issue filtering toggles
11+
912
## [3.0.0]
1013
### Changes
1114
- process api URL from hasAuthenticated message

plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/TreeViewerFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ private boolean isIssueVisible(IssueTreeNode issueNode) {
4848
}
4949

5050
for (var filter : this.filters.values()) {
51-
if (!filter.test(issue)) {
51+
if (filter.test(issue)) {
5252
return false;
5353
}
5454
}

plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/BaseFilter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ public void applyFilter() {
2323
boolean booleanPref = this.preferences.getBooleanPref(this.filterName);
2424

2525
if (booleanPref) {
26-
this.filterManager.removeTreeFilter(this.filterName);
26+
this.filterManager.removeTreeFilter(this.filterName); // Showing "a thing" removes it from being filtered out.
2727
} else {
28-
this.filterManager.addTreeFilter(this.filterName, predicate);
28+
this.filterManager.addTreeFilter(this.filterName, predicate); // Hiding (unchecking) "a thing" adds a filter to filter it out.
2929
}
3030
}
31-
}
31+
}

plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/FixableFilter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@
88
import io.snyk.languageserver.protocolextension.messageObjects.scanResults.Issue;
99

1010
public class FixableFilter extends BaseFilter {
11-
private static final Predicate<Issue> predicate = issue -> issue.hasFix();
11+
private static final Predicate<Issue> predicate = issue -> !issue.hasFix(); // Inverse predicate, see below.
1212

1313
public FixableFilter(TreeFilterManager tfm) {
1414
super(FILTER_SHOW_ONLY_FIXABLE, predicate, tfm);
1515
}
1616

1717
@Override
1818
public void applyFilter() {
19-
// this is inverse to the other filters, so we need to overwrite the BaseFilter logic
19+
// This is inverse to the other filters, so we need to overwrite the BaseFilter logic.
20+
// Deselecting show fixable issues should not hide fixable issues and show all issues.
21+
// Therefore when deactivated we cannot have a filter added, so the logic is flipped.
2022
boolean booleanPref = preferences.getBooleanPref(this.filterName);
2123

2224
if (booleanPref) {

plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresIgnoredIssuesFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ public IgnoresIgnoredIssuesFilter(TreeFilterManager tfm) {
1414
super(FILTER_IGNORES_SHOW_IGNORED_ISSUES, predicate, tfm);
1515
}
1616

17-
}
17+
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package io.snyk.eclipse.plugin.views.snyktoolview.filters;
22

3-
import static io.snyk.eclipse.plugin.preferences.Preferences.FILTER_IGNORES_SHOW_IGNORED_ISSUES;
3+
import static io.snyk.eclipse.plugin.preferences.Preferences.FILTER_IGNORES_SHOW_OPEN_ISSUES;
44

55
import java.util.function.Predicate;
66

77
import io.snyk.eclipse.plugin.views.snyktoolview.TreeFilterManager;
88
import io.snyk.languageserver.protocolextension.messageObjects.scanResults.Issue;
99

10-
public class IgnoresOpenIssuesFilter extends BaseFilter {
10+
public class IgnoresOpenIssuesFilter extends BaseFilter {
1111
private static final Predicate<Issue> predicate = issue -> !issue.isIgnored();
1212

1313
public IgnoresOpenIssuesFilter(TreeFilterManager tfm) {
14-
super(FILTER_IGNORES_SHOW_IGNORED_ISSUES, predicate, tfm);
14+
super(FILTER_IGNORES_SHOW_OPEN_ISSUES, predicate, tfm);
1515
}
16-
}
16+
}

plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/ProductFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public ProductFilter(TreeFilterManager tfm, String filterName) {
2222
@SuppressWarnings("rawtypes")
2323
private static Predicate getPredicate(String filterName) {
2424
String filterableIssueType = preferenceToProductConstants.get(filterName);
25-
Predicate<Issue> predicate = issue -> !issue.filterableIssueType().equals(filterableIssueType);
25+
Predicate<Issue> predicate = issue -> issue.filterableIssueType().equals(filterableIssueType);
2626
return predicate;
2727
}
28-
}
28+
}

plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/SeverityFilter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public SeverityFilter(TreeFilterManager tfm, String preferenceKey) {
2121
@SuppressWarnings("rawtypes")
2222
private static Predicate getPredicate(String preferenceKey) {
2323
String severityCondition = preferenceToProductConstants.get(preferenceKey);
24-
Predicate<Issue> predicate = issue -> !issue.severity().equals(severityCondition);
24+
Predicate<Issue> predicate = issue -> issue.severity().equals(severityCondition);
2525
return predicate;
26-
}
27-
}
26+
}
27+
}

plugin/src/main/java/io/snyk/languageserver/SnykIssueCache.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ public void clearAll() {
5656
* @param path The file path for which issues should be removed
5757
*/
5858
public void removeAllIssuesForPath(String path) {
59-
codeSecurityIssues.clear();
60-
codeQualityIssues.clear();
59+
codeSecurityIssues.remove(path);
60+
codeQualityIssues.remove(path);
6161
ossIssues.remove(path);
6262
iacIssues.remove(path);
6363
}

tests/src/test/java/io/snyk/eclipse/plugin/views/snyktoolview/TreeViewerFilterTest.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ void testSelect_IssueTreeNodeWithMatchingFilter() {
4343
Issue issue = mock(Issue.class);
4444
when(issueNode.getIssue()).thenReturn(issue);
4545

46-
Predicate<Issue> predicate = i -> true; // Always matches
46+
Predicate<Issue> predicate = i -> true; // Always matches, so filtered out.
4747
filter.putFilterPredicate("test", predicate);
4848

49-
assertTrue(filter.select(mockViewer, null, issueNode));
49+
assertFalse(filter.select(mockViewer, null, issueNode));
5050
}
5151

5252
@Test
@@ -55,10 +55,10 @@ void testSelect_IssueTreeNodeWithNonMatchingFilter() {
5555
Issue issue = mock(Issue.class);
5656
when(issueNode.getIssue()).thenReturn(issue);
5757

58-
Predicate<Issue> predicate = i -> false; // Never matches
58+
Predicate<Issue> predicate = i -> false; // Never matches, so not filtered out.
5959
filter.putFilterPredicate("test", predicate);
6060

61-
assertFalse(filter.select(mockViewer, null, issueNode));
61+
assertTrue(filter.select(mockViewer, null, issueNode));
6262
}
6363

6464
@Test
@@ -85,13 +85,17 @@ void testSelect_FileTreeNodeWithNoVisibleChildren() {
8585

8686
@Test
8787
void testRemoveFilterPredicate() {
88-
Predicate<Issue> predicate = i -> false;
88+
IssueTreeNode issueNode = mock(IssueTreeNode.class);
89+
Issue issue = mock(Issue.class);
90+
when(issueNode.getIssue()).thenReturn(issue);
91+
92+
Predicate<Issue> predicate = i -> true; // Always matches, so filtered out.
8993
filter.putFilterPredicate("test", predicate);
9094

91-
assertTrue(filter.select(mockViewer, null, mock(IssueTreeNode.class)));
95+
assertFalse(filter.select(mockViewer, null, issueNode));
9296

9397
filter.removeFilterPredicate("test");
9498

95-
assertTrue(filter.select(mockViewer, null, mock(IssueTreeNode.class)));
99+
assertTrue(filter.select(mockViewer, null, issueNode));
96100
}
97-
}
101+
}

0 commit comments

Comments
 (0)