From 72282a49827c68f44fbbc9b246914829aff040ff Mon Sep 17 00:00:00 2001 From: Julia Beliaeva Date: Tue, 14 Aug 2018 20:27:07 +0300 Subject: [PATCH] [vcs-log] extract VcsLogRegexTextFilter class --- .../log/ui/filter/VcsLogClassicFilterUi.java | 15 +++-- .../vcs/log/ui/filter/VcsLogTextFilterImpl.kt | 56 +++++++++---------- .../vcs/log/visible/VcsLogFiltererImpl.java | 2 +- .../git4idea/log/GitLogProviderTest.java | 14 ++--- .../hg4idea/test/log/HgTextFilterTest.java | 19 ++++--- 5 files changed, 52 insertions(+), 54 deletions(-) diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java index 2b70407916b6..a6f416b8e6d6 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java @@ -148,7 +148,7 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { return Pair.empty(); } - VcsLogTextFilter textFilter = new VcsLogTextFilterImpl(text, isRegexAllowed, matchesCase); + VcsLogTextFilter textFilter = VcsLogTextFilterImpl.createTextFilter(text, isRegexAllowed, matchesCase); VcsLogHashFilterImpl hashFilter = createHashFilter(text); return Pair.create(textFilter, hashFilter); } @@ -286,9 +286,9 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { @NotNull @Override protected VcsLogTextFilter createFilter(@NotNull List values) { - return new VcsLogTextFilterImpl(ObjectUtils.assertNotNull(ContainerUtil.getFirstItem(values)), - myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_REGEX), - myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_MATCH_CASE)); + return VcsLogTextFilterImpl.createTextFilter(ObjectUtils.assertNotNull(ContainerUtil.getFirstItem(values)), + myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_REGEX), + myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_MATCH_CASE)); } @NotNull @@ -465,10 +465,9 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { } protected void applyFilter() { - myTextFilterModel.setFilter(new VcsLogTextFilterImpl(getText(), - myTextFilterModel.myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_REGEX), - myTextFilterModel.myUiProperties - .get(MainVcsLogUiProperties.TEXT_FILTER_MATCH_CASE))); + boolean isRegexpAllowed = myTextFilterModel.myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_REGEX); + boolean isMatchCase = myTextFilterModel.myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_MATCH_CASE); + myTextFilterModel.setFilter(VcsLogTextFilterImpl.createTextFilter(getText(), isRegexpAllowed, isMatchCase)); addCurrentTextToHistory(); } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogTextFilterImpl.kt b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogTextFilterImpl.kt index ffb4838ee37e..111ff3059118 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogTextFilterImpl.kt +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogTextFilterImpl.kt @@ -21,51 +21,49 @@ import com.intellij.vcs.log.util.VcsLogUtil import java.util.regex.Pattern import java.util.regex.PatternSyntaxException -class VcsLogTextFilterImpl(private val text: String, - isRegexAllowed: Boolean, - private val matchCase: Boolean) : VcsLogDetailsFilter, VcsLogTextFilter { - private val pattern: Pattern? - - init { - pattern = createPattern(text, isRegexAllowed, matchCase) - } - +class VcsLogTextFilterImpl internal constructor(private val text: String, + private val isMatchCase: Boolean) : VcsLogDetailsFilter, VcsLogTextFilter { @Suppress("unused") // used in upsource - constructor(text: String) : this(text, false, false) + constructor(text: String) : this(text, false) - override fun matches(message: String): Boolean { - if (pattern != null) return pattern.matcher(message).find() - return message.contains(text, !matchCase) - } + override fun matches(message: String): Boolean = message.contains(text, !isMatchCase) - override fun getText(): String { - return text - } + override fun getText(): String = text - override fun isRegex(): Boolean { - return pattern != null - } + override fun isRegex(): Boolean = false - override fun matchesCase(): Boolean { - return matchCase - } + override fun matchesCase(): Boolean = isMatchCase override fun toString(): String { - return (if (isRegex) "matching " else "containing ") + text + " (case " + (if (matchCase) "sensitive" else "insensitive") + ")" + return "containing $text (case ${if (isMatchCase) "sensitive" else "insensitive"})" } companion object { - private fun createPattern(text: String, isRegexAllowed: Boolean, matchCase: Boolean): Pattern? { - if (isRegexAllowed && VcsLogUtil.maybeRegexp(text)) { + @JvmStatic + fun createTextFilter(text: String, isRegexpAllowed: Boolean = false, isMatchCase: Boolean = false): VcsLogTextFilter { + if (isRegexpAllowed && VcsLogUtil.maybeRegexp(text)) { try { - return if (matchCase) Pattern.compile(text) else Pattern.compile(text, Pattern.CASE_INSENSITIVE) + return VcsLogRegexTextFilter(Pattern.compile(text, if (isMatchCase) 0 else Pattern.CASE_INSENSITIVE)) } catch (ignored: PatternSyntaxException) { } - } - return null + return VcsLogTextFilterImpl(text, isMatchCase) } } } + +class VcsLogRegexTextFilter internal constructor(private val pattern: Pattern) : VcsLogDetailsFilter, VcsLogTextFilter { + override fun matches(message: String): Boolean = pattern.matcher(message).find() + + override fun getText(): String = pattern.pattern() + + override fun isRegex(): Boolean = true + + override fun matchesCase(): Boolean = (pattern.flags() and Pattern.CASE_INSENSITIVE) == 0 + + override fun toString(): String { + return "matching $text (case ${if (matchesCase()) "sensitive" else "insensitive"})" + } +} \ No newline at end of file diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VcsLogFiltererImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VcsLogFiltererImpl.java index 453a57bbc71a..40ce2f57d24e 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VcsLogFiltererImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VcsLogFiltererImpl.java @@ -202,7 +202,7 @@ public class VcsLogFiltererImpl implements VcsLogFilterer { if (commitId != null) hashFilterResult.add(myStorage.getCommitIndex(commitId.getHash(), commitId.getRoot())); } } - VcsLogTextFilterImpl textFilter = new VcsLogTextFilterImpl(StringUtil.join(hashes, "|"), true, false); + VcsLogTextFilter textFilter = VcsLogTextFilterImpl.createTextFilter(StringUtil.join(hashes, "|"), true, false); FilterByDetailsResult textFilterResult = filterByDetails(dataPack, new VcsLogFilterCollectionBuilder(textFilter).build(), commitCount, dataPack.getLogProviders().keySet(), null); if (hashFilterResult.isEmpty() && matchesNothing(textFilterResult.matchingCommits)) return null; diff --git a/plugins/git4idea/tests/git4idea/log/GitLogProviderTest.java b/plugins/git4idea/tests/git4idea/log/GitLogProviderTest.java index 9a9e1788e061..f92c14cfdd87 100644 --- a/plugins/git4idea/tests/git4idea/log/GitLogProviderTest.java +++ b/plugins/git4idea/tests/git4idea/log/GitLogProviderTest.java @@ -12,7 +12,6 @@ import com.intellij.vcs.log.*; import com.intellij.vcs.log.data.VcsLogBranchFilterImpl; import com.intellij.vcs.log.impl.*; import com.intellij.vcs.log.impl.VcsLogFilterCollectionImpl.VcsLogFilterCollectionBuilder; -import com.intellij.vcs.log.ui.filter.VcsLogTextFilterImpl; import git4idea.config.GitVersion; import git4idea.test.GitSingleRepoTest; import git4idea.test.GitTestUtil; @@ -25,6 +24,7 @@ import java.util.Set; import static com.intellij.openapi.vcs.Executor.echo; import static com.intellij.openapi.vcs.Executor.touch; +import static com.intellij.vcs.log.ui.filter.VcsLogTextFilterImpl.createTextFilter; import static git4idea.test.GitExecutor.*; import static git4idea.test.GitTestUtil.readAllRefs; import static java.util.Collections.singleton; @@ -173,12 +173,12 @@ public class GitLogProviderTest extends GitSingleRepoTest { String bigNoBrackets = addCommit(repo, "GIT " + fileName); String text = "[git]"; - assertEquals(Collections.singletonList(smallBrackets), getFilteredHashes( - new VcsLogFilterCollectionBuilder().with(new VcsLogTextFilterImpl(text, false, true)).build())); + assertEquals(Collections.singletonList(smallBrackets), + getFilteredHashes(new VcsLogFilterCollectionBuilder().with(createTextFilter(text, false, true)).build())); assertEquals(Arrays.asList(bigNoBrackets, smallNoBrackets, bigBrackets, smallBrackets, initial), - getFilteredHashes(new VcsLogFilterCollectionBuilder().with(new VcsLogTextFilterImpl(text, true, false)).build())); + getFilteredHashes(new VcsLogFilterCollectionBuilder(createTextFilter(text, true, false)).build())); assertEquals(Arrays.asList(smallNoBrackets, smallBrackets, initial), - getFilteredHashes(new VcsLogFilterCollectionBuilder().with(new VcsLogTextFilterImpl(text, true, true)).build())); + getFilteredHashes(new VcsLogFilterCollectionBuilder(createTextFilter(text, true, true)).build())); } public void test_filter_by_text_no_regex() throws Exception { @@ -193,7 +193,7 @@ public class GitLogProviderTest extends GitSingleRepoTest { echo(fileName, "content" + Math.random()); assertEquals(Arrays.asList(bigBrackets, smallBrackets), getFilteredHashes( - new VcsLogFilterCollectionBuilder().with(new VcsLogTextFilterImpl("[git]", false, false)).build())); + new VcsLogFilterCollectionBuilder().with(createTextFilter("[git]", false, false)).build())); } private void assumeFixedStringsWorks() { @@ -209,7 +209,7 @@ public class GitLogProviderTest extends GitSingleRepoTest { Collections.emptyMap(), singleton(user)); assertEquals(hashes, getFilteredHashes(new VcsLogFilterCollectionBuilder().with(userFilter). - with(new VcsLogTextFilterImpl(regexp ? ".*" : "", regexp, false)).build())); + with(createTextFilter(regexp ? ".*" : "", regexp, false)).build())); } public void test_filter_by_text_with_regex_and_user() throws Exception { diff --git a/plugins/hg4idea/testSrc/hg4idea/test/log/HgTextFilterTest.java b/plugins/hg4idea/testSrc/hg4idea/test/log/HgTextFilterTest.java index affa188d8469..731bc05bb451 100644 --- a/plugins/hg4idea/testSrc/hg4idea/test/log/HgTextFilterTest.java +++ b/plugins/hg4idea/testSrc/hg4idea/test/log/HgTextFilterTest.java @@ -18,8 +18,8 @@ package hg4idea.test.log; import com.intellij.openapi.vcs.VcsException; import com.intellij.util.containers.ContainerUtil; import com.intellij.vcs.log.TimedVcsCommit; +import com.intellij.vcs.log.VcsLogTextFilter; import com.intellij.vcs.log.impl.VcsLogFilterCollectionImpl; -import com.intellij.vcs.log.ui.filter.VcsLogTextFilterImpl; import hg4idea.test.HgPlatformTest; import org.jetbrains.annotations.NotNull; import org.zmlx.hg4idea.command.HgWorkingCopyRevisionsCommand; @@ -32,6 +32,7 @@ import java.util.List; import static com.intellij.openapi.vcs.Executor.cd; import static com.intellij.openapi.vcs.Executor.overwrite; +import static com.intellij.vcs.log.ui.filter.VcsLogTextFilterImpl.createTextFilter; import static hg4idea.test.HgExecutor.hg; import static hg4idea.test.log.HgUserFilterTest.findLogProvider; @@ -52,11 +53,11 @@ public class HgTextFilterTest extends HgPlatformTest { String text = "[hg]"; assertSameElements(Arrays.asList(bigBrackets, smallBrackets), - getFilteredCommits(provider, new VcsLogTextFilterImpl(text, false, false))); + getFilteredCommits(provider, createTextFilter(text, false, false))); assertSameElements(Collections.singletonList(smallBrackets), - getFilteredCommits(provider, new VcsLogTextFilterImpl(text, false, true))); + getFilteredCommits(provider, createTextFilter(text, false, true))); assertSameElements(Arrays.asList(bigNoBrackets, smallNoBrackets, bigBrackets, smallBrackets), - getFilteredCommits(provider, new VcsLogTextFilterImpl(text, true, false))); + getFilteredCommits(provider, createTextFilter(text, true, false))); } public void testRegexp() throws Exception { @@ -69,9 +70,9 @@ public class HgTextFilterTest extends HgPlatformTest { HgLogProvider provider = findLogProvider(myProject); assertSameElements(Collections.singletonList(numberedBigBug), - getFilteredCommits(provider, new VcsLogTextFilterImpl("Bug \\d+", true, true))); + getFilteredCommits(provider, createTextFilter("Bug \\d+", true, true))); assertSameElements(Collections.singletonList(bigBug), - getFilteredCommits(provider, new VcsLogTextFilterImpl("BUG.*", true, true))); + getFilteredCommits(provider, createTextFilter("BUG.*", true, true))); } public void _testRegexpCaseInsensitive() throws Exception { @@ -84,13 +85,13 @@ public class HgTextFilterTest extends HgPlatformTest { HgLogProvider provider = findLogProvider(myProject); assertSameElements(Arrays.asList(numberedSmallBug, numberedBigBug), - getFilteredCommits(provider, new VcsLogTextFilterImpl("Bug \\d+", true, false))); + getFilteredCommits(provider, createTextFilter("Bug \\d+", true, false))); assertSameElements(Arrays.asList(numberedBigBug, numberedSmallBug, smallBug, bigBug), - getFilteredCommits(provider, new VcsLogTextFilterImpl("BUG.*", true, false))); + getFilteredCommits(provider, createTextFilter("BUG.*", true, false))); } @NotNull - private List getFilteredCommits(@NotNull HgLogProvider provider, @NotNull VcsLogTextFilterImpl filter) throws VcsException { + private List getFilteredCommits(@NotNull HgLogProvider provider, @NotNull VcsLogTextFilter filter) throws VcsException { VcsLogFilterCollectionImpl filterCollection = new VcsLogFilterCollectionImpl(null, null, null, null, filter, null, null); List commits = provider.getCommitsMatchingFilter(myProject.getBaseDir(), filterCollection, -1);