blob: 8b65db374a91ce441d118ce18dd7cc5b640bc6a4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.dltk.internal.corext.refactoring;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.dltk.core.IMember;
import org.eclipse.dltk.core.IProjectFragment;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.core.search.SearchMatch;
import org.eclipse.dltk.core.search.SearchRequestor;
/**
* Collects the results returned by a <code>SearchEngine</code>.
* If a {@link ReferencesInBinaryContext} is passed, matches that are
* inside a binary element are not collected (but added to the context if they are accurate).
*/
public class CollectingSearchRequestor extends SearchRequestor {
private final List<SearchMatch> fFound;
private final List<SearchMatch> fBinaryRefs;
public CollectingSearchRequestor() {
this(false);
}
public CollectingSearchRequestor(boolean binaryRefs) {
fFound = new ArrayList<SearchMatch>();
fBinaryRefs = binaryRefs ? new ArrayList<SearchMatch>() : null;
}
/**
* The default implementation calls {@link #collectMatch(SearchMatch)} for
* all matches that make it through {@link #filterMatch(SearchMatch)}.
*
* @param match the found match
* @throws CoreException
*
* @see org.eclipse.jdt.core.search.SearchRequestor#acceptSearchMatch(org.eclipse.jdt.core.search.SearchMatch)
*/
public void acceptSearchMatch(SearchMatch match) throws CoreException {
if (! filterMatch(match))
collectMatch(match);
}
public void collectMatch(SearchMatch match) {
fFound.add(match);
}
/**
* Returns whether the given match should be filtered out.
* The default implementation filters out matches in binaries iff
* {@link #CollectingSearchRequestor(ReferencesInBinaryContext)} has been called with a
* non-<code>null</code> argument. Accurate binary matches are added to the {@link ReferencesInBinaryContext}.
*
* @param match the match to test
* @return <code>true</code> iff the given match should <em>not</em> be collected
* @throws CoreException
*/
public boolean filterMatch(SearchMatch match) throws CoreException {
if (fBinaryRefs == null)
return false;
if (match.getAccuracy() == SearchMatch.A_ACCURATE && isBinaryElement(match.getElement())) {
// binary classpaths are often incomplete -> avoiding false positives from inaccurate matches
fBinaryRefs.add(match);
return true;
}
return false;
}
private static boolean isBinaryElement(Object element) throws ModelException {
if (element instanceof IMember) {
return ((IMember)element).getSourceModule().isBinary();
} else if (element instanceof ISourceModule) {
return ((ISourceModule)element).isBinary();
} else if (element instanceof IProjectFragment) {
return ((IProjectFragment)element).isBinary();
}
return false;
}
/**
* @return a List of {@link SearchMatch}es (not sorted)
*/
public List<SearchMatch> getResults() {
return fFound;
}
}