diff options
Diffstat (limited to 'platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/MatchConstraintsSink.java')
-rw-r--r-- | platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/MatchConstraintsSink.java | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/MatchConstraintsSink.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/MatchConstraintsSink.java new file mode 100644 index 000000000000..2036c83d56f4 --- /dev/null +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/MatchConstraintsSink.java @@ -0,0 +1,85 @@ +package com.intellij.structuralsearch.impl.matcher; + +import com.intellij.psi.PsiElement; +import com.intellij.structuralsearch.MatchResultSink; +import com.intellij.structuralsearch.MatchingProcess; +import com.intellij.structuralsearch.MatchResult; +import com.intellij.structuralsearch.SSRBundle; +import com.intellij.psi.PsiFile; +import com.intellij.openapi.progress.ProgressIndicator; + +import javax.swing.*; +import java.util.HashMap; + +/** + * Sink to detect + */ +class MatchConstraintsSink implements MatchResultSink { + private final MatchResultSink delegate; + private MatchingProcess process; + private final boolean distinct; + private final boolean caseSensitive; + private int matchCount; + private final int maxMatches; + private final HashMap<Object, MatchResult> matches = new HashMap<Object, MatchResult>(); + + MatchConstraintsSink(MatchResultSink _delegate, int _maxMatches,boolean distinct, boolean _caseSensitive) { + delegate = _delegate; + maxMatches = _maxMatches; + this.distinct = distinct; + caseSensitive = _caseSensitive; + } + + public void newMatch(MatchResult result) { + if (distinct) { + String matchImage = result.getMatchImage(); + + if (!caseSensitive) matchImage = matchImage.toLowerCase(); + + if (matches.get(matchImage)!=null) { + return; + } + + matches.put(matchImage,result); + } + else { + final PsiElement match = result.getMatch(); + if (matches.containsKey(match)) { + return; + } + matches.put(match, result); + } + + delegate.newMatch(result); + ++matchCount; + + if (matchCount==maxMatches) { + JOptionPane.showMessageDialog(null, SSRBundle.message("search.produced.too.many.results.message")); + process.stop(); + } + } + + /* Notifies sink about starting the matching for given element + * @param element the current file + * @param task process continuation reference + */ + public void processFile(PsiFile element) { + delegate.processFile(element); + } + + public void setMatchingProcess(MatchingProcess matchingProcess) { + process = matchingProcess; + delegate.setMatchingProcess(process); + } + + public void matchingFinished() { + matchCount = 0; + matches.clear(); + delegate.matchingFinished(); + } + + public ProgressIndicator getProgressIndicator() { + return delegate.getProgressIndicator(); + } + +} |