From cc0627718630f7eb13a7c993e78857437b5ff041 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 22 Jun 2009 13:37:08 +0000 Subject: [PATCH] Include matches via polymorphic calls in search, bug 261484 --- .../internal/ui/search/CSearchMessages.java | 3 ++ .../ui/search/CSearchMessages.properties | 3 ++ .../ui/search/HidePolymorphicCalls.java | 44 +++++++++++++++++++ .../search/PDOMSearchListContentProvider.java | 29 +++++++----- .../internal/ui/search/PDOMSearchMatch.java | 10 +++++ .../internal/ui/search/PDOMSearchQuery.java | 43 +++++++++++++----- .../internal/ui/search/PDOMSearchResult.java | 32 ++++++++++++++ .../search/PDOMSearchTreeContentProvider.java | 11 ++++- .../ui/search/PDOMSearchViewPage.java | 4 +- 9 files changed, 154 insertions(+), 25 deletions(-) create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/HidePolymorphicCalls.java diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.java index c91c76afa41..a226a2c14f0 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.java @@ -79,6 +79,9 @@ public final class CSearchMessages extends NLS { public static String PDOMSearchListContentProvider_IndexerNotEnabledMessageFormat; public static String PDOMSearchListContentProvider_ProjectClosedMessageFormat; public static String CSearchMessages_IndexRunningIncompleteWarning; + public static String HidePolymorphicCalls_actionLabel; + public static String HidePolymorphicCalls_description; + public static String HidePolymorphicCalls_name; public static String PDOMSearchTreeContentProvider_IndexerNotEnabledWarning; public static String PDOMSearchTreeContentProvider_ProjectClosedWarning; public static String PDOMSearchUnresolvedIncludesQuery_title; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties index 512f4aa81fc..3ac516362d5 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties @@ -73,6 +73,9 @@ PDOMSearchTreeContentProvider_ProjectClosedWarning=(unknown results: project is PDOMSearchListContentProvider_IndexerNotEnabledMessageFormat=(project ''{0}'' - unknown results: indexer is not enabled) PDOMSearchListContentProvider_ProjectClosedMessageFormat=(project ''{0}'' - unknown results: project is closed) CSearchMessages_IndexRunningIncompleteWarning=(incomplete or inaccurate results: indexer was busy during search) +HidePolymorphicCalls_actionLabel=Hide Potential Method Calls +HidePolymorphicCalls_description=Hides potential method calls to virtual overriders +HidePolymorphicCalls_name=Potential Method Calls PDOMSearch_query_pattern_error = Illegal Search String PDOMSearchUnresolvedIncludesQuery_title=Unresolved inclusions in {0} SelectionParseAction_FileOpenFailure_format=Could not open file ''{0}'', verify index is up-to-date diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/HidePolymorphicCalls.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/HidePolymorphicCalls.java new file mode 100644 index 00000000000..ee64196afd1 --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/HidePolymorphicCalls.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2009 Wind River Systems, Inc. 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: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.ui.search; + +import org.eclipse.search.ui.text.Match; +import org.eclipse.search.ui.text.MatchFilter; + +public class HidePolymorphicCalls extends MatchFilter { + + public static final MatchFilter FILTER = new HidePolymorphicCalls(); + + @Override + public boolean filters(Match match) { + return match instanceof PDOMSearchMatch && ((PDOMSearchMatch) match).isPolymorphicCall(); + } + + @Override + public String getActionLabel() { + return CSearchMessages.HidePolymorphicCalls_actionLabel; + } + + @Override + public String getDescription() { + return CSearchMessages.HidePolymorphicCalls_description; + } + + @Override + public String getID() { + return "HidePolymorphicCalls"; //$NON-NLS-1$ + } + + @Override + public String getName() { + return CSearchMessages.HidePolymorphicCalls_name; + } +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchListContentProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchListContentProvider.java index 6e73aeb378c..bb58471bad6 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchListContentProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchListContentProvider.java @@ -13,7 +13,6 @@ package org.eclipse.cdt.internal.ui.search; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -40,20 +39,20 @@ public class PDOMSearchListContentProvider implements private TableViewer viewer; private PDOMSearchResult result; - + private final PDOMSearchViewPage fPage; + + PDOMSearchListContentProvider(PDOMSearchViewPage page) { + fPage= page; + } + public Object[] getElements(Object inputElement) { Set uncoveredProjects = new HashSet(); PDOMSearchResult result = (PDOMSearchResult) inputElement; Object[] results = result.getElements(); - List resultList = new ArrayList(Arrays.asList(results)); - - // see if indexer was busy - if (result.wasIndexerBusy()) { - resultList.add(IPDOMSearchContentProvider.INCOMPLETE_RESULTS_NODE); - } - + List resultList = new ArrayList(); + // see which projects returned results for (int i = 0; i < results.length; i++) { if (results[i] instanceof PDOMSearchElement) { @@ -62,9 +61,17 @@ public class PDOMSearchListContentProvider implements if (path != null) { uncoveredProjects.add(new Path(path).segment(0)); } + if (fPage.getDisplayedMatchCount(searchElement) > 0) { + resultList.add(searchElement); + } } } - + + // see if indexer was busy + if (result.wasIndexerBusy()) { + resultList.add(IPDOMSearchContentProvider.INCOMPLETE_RESULTS_NODE); + } + // add message for all the projects which have no results ICProject[] projects = ((PDOMSearchQuery)result.getQuery()).getProjects(); for (int i = 0; i < projects.length; ++i) { @@ -112,7 +119,7 @@ public class PDOMSearchListContentProvider implements return; for (int i= 0; i < elements.length; i++) { - if (result.getMatchCount(elements[i]) > 0) { + if (fPage.getDisplayedMatchCount(elements[i]) > 0) { if (viewer.testFindItem(elements[i]) != null) viewer.refresh(elements[i]); else diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchMatch.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchMatch.java index 0370fcf15a6..1d1cd796f9b 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchMatch.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchMatch.java @@ -20,6 +20,8 @@ import org.eclipse.cdt.core.index.IIndexFileLocation; */ public class PDOMSearchMatch extends Match { + private boolean fIsPolymorphicCall; + public PDOMSearchMatch(PDOMSearchElement elem, int offset, int length) { super(elem, offset, length); } @@ -39,4 +41,12 @@ public class PDOMSearchMatch extends Match { && getOffset() == other.getOffset() && getLength() == other.getLength(); } + + public void setIsPolymorphicCall() { + fIsPolymorphicCall= true; + } + + public boolean isPolymorphicCall() { + return fIsPolymorphicCall; + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java index 66e329dafd2..106489f9d06 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java @@ -28,10 +28,12 @@ import org.eclipse.search.ui.ISearchResult; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.browser.ITypeReference; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexName; @@ -42,6 +44,7 @@ import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.core.browser.ASTTypeInfo; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; /** @@ -49,9 +52,9 @@ import org.eclipse.cdt.internal.core.browser.ASTTypeInfo; * */ public abstract class PDOMSearchQuery implements ISearchQuery { - public static final int FIND_DECLARATIONS = 0x1; - public static final int FIND_DEFINITIONS = 0x2; - public static final int FIND_REFERENCES = 0x4; + public static final int FIND_DECLARATIONS = IIndex.FIND_DECLARATIONS; + public static final int FIND_DEFINITIONS = IIndex.FIND_DEFINITIONS; + public static final int FIND_REFERENCES = IIndex.FIND_REFERENCES; public static final int FIND_DECLARATIONS_DEFINITIONS = FIND_DECLARATIONS | FIND_DEFINITIONS; public static final int FIND_ALL_OCCURANCES = FIND_DECLARATIONS | FIND_DEFINITIONS | FIND_REFERENCES; @@ -127,14 +130,20 @@ public abstract class PDOMSearchQuery implements ISearchQuery { return false; // i.e. keep it } - private void collectNames(IIndex index, IIndexName[] names) throws CoreException { + private void collectNames(IIndex index, IIndexName[] names, boolean polymorphicCallsOnly) throws CoreException { for (IIndexName name : names) { if (!filterName(name)) { - IASTFileLocation loc = name.getFileLocation(); - IIndexBinding binding= index.findBinding(name); - result.addMatch(new PDOMSearchMatch( - new TypeInfoSearchElement(index, name, binding), - loc.getNodeOffset(), loc.getNodeLength())); + if (!polymorphicCallsOnly || name.couldBePolymorphicMethodCall()) { + IASTFileLocation loc = name.getFileLocation(); + IIndexBinding binding= index.findBinding(name); + final PDOMSearchMatch match = new PDOMSearchMatch( + new TypeInfoSearchElement(index, name, binding), + loc.getNodeOffset(), loc.getNodeLength()); + if (polymorphicCallsOnly) + match.setIsPolymorphicCall(); + + result.addMatch(match); + } } } } @@ -142,7 +151,21 @@ public abstract class PDOMSearchQuery implements ISearchQuery { protected void createMatches(IIndex index, IBinding binding) throws CoreException { if (binding != null) { IIndexName[] names= index.findNames(binding, flags); - collectNames(index, names); + collectNames(index, names, false); + if ((flags & FIND_REFERENCES) != 0) { + if (binding instanceof ICPPMethod) { + ICPPMethod m= (ICPPMethod) binding; + try { + ICPPMethod[] msInBases = ClassTypeHelper.findOverridden(m); + for (ICPPMethod mInBase : msInBases) { + names= index.findNames(mInBase, FIND_REFERENCES); + collectNames(index, names, true); + } + } catch (DOMException e) { + CUIPlugin.log(e); + } + } + } } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java index 03f5d4f90d8..e33d4774a41 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java @@ -27,6 +27,7 @@ import org.eclipse.search.ui.text.AbstractTextSearchResult; import org.eclipse.search.ui.text.IEditorMatchAdapter; import org.eclipse.search.ui.text.IFileMatchAdapter; import org.eclipse.search.ui.text.Match; +import org.eclipse.search.ui.text.MatchFilter; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPathEditorInput; @@ -47,6 +48,9 @@ import org.eclipse.cdt.internal.ui.util.Messages; * */ public class PDOMSearchResult extends AbstractTextSearchResult implements IEditorMatchAdapter, IFileMatchAdapter { + private static final String KEY_SHOW_POLYMORPHIC_CALLS = "ShowPolymorphicCalls"; //$NON-NLS-1$ + final static MatchFilter[] ALL_FILTERS = new MatchFilter[] {HidePolymorphicCalls.FILTER}; + final static MatchFilter[] NO_FILTERS = {}; private PDOMSearchQuery query; private boolean indexerBusy; @@ -190,4 +194,32 @@ public class PDOMSearchResult extends AbstractTextSearchResult implements IEdito return indexerBusy; } + @Override + public MatchFilter[] getAllMatchFilters() { + return ALL_FILTERS; + } + + @Override + public MatchFilter[] getActiveMatchFilters() { + MatchFilter[] result = super.getActiveMatchFilters(); + if (result == null) { + if (CUIPlugin.getDefault().getDialogSettings().getBoolean(KEY_SHOW_POLYMORPHIC_CALLS)) { + return ALL_FILTERS; + } + return NO_FILTERS; + } + return result; + } + + @Override + public void setActiveMatchFilters(MatchFilter[] filters) { + boolean showPoly= false; + for (int i = 0; i < filters.length; i++) { + if (filters[i] == HidePolymorphicCalls.FILTER) { + showPoly= true; + } + } + CUIPlugin.getDefault().getDialogSettings().put(KEY_SHOW_POLYMORPHIC_CALLS, showPoly); + super.setActiveMatchFilters(filters); + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTreeContentProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTreeContentProvider.java index d68c6a1a9c4..d8e12173fad 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTreeContentProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTreeContentProvider.java @@ -49,6 +49,11 @@ public class PDOMSearchTreeContentProvider implements ITreeContentProvider, IPDO private TreeViewer viewer; private PDOMSearchResult result; private Map> tree = new HashMap>(); + private final PDOMSearchViewPage fPage; + + PDOMSearchTreeContentProvider(PDOMSearchViewPage page) { + fPage= page; + } public Object[] getChildren(Object parentElement) { Set children = tree.get(parentElement); @@ -170,7 +175,7 @@ public class PDOMSearchTreeContentProvider implements ITreeContentProvider, IPDO if (elements != null) { for (int i = 0; i < elements.length; ++i) { PDOMSearchElement element = (PDOMSearchElement)elements[i]; - if (result.getMatchCount(element) > 0) { + if (fPage.getDisplayedMatchCount(element) > 0) { insertSearchElement(element); } else { boolean remove = true; @@ -217,7 +222,9 @@ public class PDOMSearchTreeContentProvider implements ITreeContentProvider, IPDO Object[] elements = result.getElements(); for (int i = 0; i < elements.length; ++i) { - insertSearchElement((PDOMSearchElement)elements[i]); + final PDOMSearchElement element = (PDOMSearchElement)elements[i]; + if (fPage.getDisplayedMatchCount(element) > 0) + insertSearchElement(element); } // add all the projects which have no results diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchViewPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchViewPage.java index ae1c27b8370..d01ba44de7e 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchViewPage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchViewPage.java @@ -125,7 +125,7 @@ public class PDOMSearchViewPage extends AbstractTextSearchViewPage { @Override protected void configureTreeViewer(TreeViewer viewer) { - contentProvider = new PDOMSearchTreeContentProvider(); + contentProvider = new PDOMSearchTreeContentProvider(this); viewer.setComparator(new SearchViewerComparator()); viewer.setContentProvider((PDOMSearchTreeContentProvider)contentProvider); viewer.setLabelProvider(new PDOMSearchTreeLabelProvider(this)); @@ -133,7 +133,7 @@ public class PDOMSearchViewPage extends AbstractTextSearchViewPage { @Override protected void configureTableViewer(TableViewer viewer) { - contentProvider = new PDOMSearchListContentProvider(); + contentProvider = new PDOMSearchListContentProvider(this); viewer.setComparator(new SearchViewerComparator()); viewer.setContentProvider((PDOMSearchListContentProvider)contentProvider); viewer.setLabelProvider(new PDOMSearchListLabelProvider(this));