From 0caa2a5bd56ee90497ae6d8e9530a73777e009bf Mon Sep 17 00:00:00 2001 From: John Camelon Date: Wed, 13 Jul 2005 19:56:39 +0000 Subject: [PATCH] Patch for Devin Steffler. Fixed Bug 103323 NPE caused by DOMSearchUtil#getSearchPattern() when IASTName is null --- .../cdt/core/search/DOMSearchUtil.java | 6 +- .../BaseSelectionTestsIndexer.java | 34 +++++++ .../CPPSelectionTestsDOMIndexer.java | 22 +++++ .../cdt/internal/ui/search/DOMQuery.java | 96 ++++++++++--------- 4 files changed, 110 insertions(+), 48 deletions(-) diff --git a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/core/search/DOMSearchUtil.java b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/core/search/DOMSearchUtil.java index f5300a638aa..6a926d907fd 100644 --- a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/core/search/DOMSearchUtil.java +++ b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/core/search/DOMSearchUtil.java @@ -64,7 +64,8 @@ import org.eclipse.core.runtime.content.IContentType; * @author dsteffle */ public class DOMSearchUtil { - private static final IASTName[] BLANK_NAME_ARRAY = new IASTName[0]; + private static final String BLANK_STRING = ""; //$NON-NLS-1$ + private static final IASTName[] BLANK_NAME_ARRAY = new IASTName[0]; private static final IASTName[] EMPTY_NAME_LIST = BLANK_NAME_ARRAY; private static final Set EMPTY_MATCHES = new HashSet(0); @@ -468,6 +469,9 @@ public class DOMSearchUtil { * @return */ public static String getSearchPattern(IASTName name) { + if (name == null) + return BLANK_STRING; + StringBuffer buffer = new StringBuffer(); // first option - use binding to get qualified name IBinding binding = name.resolveBinding(); diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selectiontests/BaseSelectionTestsIndexer.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selectiontests/BaseSelectionTestsIndexer.java index 799d22ebc47..eb264b4b411 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selectiontests/BaseSelectionTestsIndexer.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selectiontests/BaseSelectionTestsIndexer.java @@ -23,6 +23,7 @@ import org.eclipse.cdt.core.index.IndexChangeEvent; import org.eclipse.cdt.core.search.DOMSearchUtil; import org.eclipse.cdt.core.testplugin.FileManager; import org.eclipse.cdt.internal.core.parser.ParserException; +import org.eclipse.cdt.internal.ui.editor.ICEditorActionDefinitionIds; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; @@ -32,9 +33,14 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.action.IAction; import org.eclipse.jface.text.TextSelection; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.ISelection; +import org.eclipse.search2.internal.ui.SearchView; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; @@ -292,6 +298,34 @@ public class BaseSelectionTestsIndexer extends TestCase { return null; } + protected void testSimple_Ctrl_G_Selection(IFile file, int offset, int length, int numOccurrences) throws ParserException { + if (offset < 0) + throw new ParserException("offset can not be less than 0 and was " + offset); //$NON-NLS-1$ + + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + IEditorPart part = null; + try { + part = page.openEditor(new FileEditorInput(file), "org.eclipse.cdt.ui.editor.CEditor"); //$NON-NLS-1$ + } catch (PartInitException e) { + assertFalse(true); + } + + if (part instanceof AbstractTextEditor) { + ((AbstractTextEditor)part).getSelectionProvider().setSelection(new TextSelection(offset,length)); + + final IAction action = ((AbstractTextEditor)part).getAction(ICEditorActionDefinitionIds.FIND_DECL); + + action.run(); + + // update the file/part to point to the newly opened IFile/IEditorPart +// IViewPart view = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView("org.eclipse.search.ui.views.SearchView"); + +// String title = view.getTitle(); + +// assertTrue( title.indexOf(numOccurrences + " Occurrences") >= 0 ); //$NON-NLS-1$ + } + } + public void resetIndexer(final String indexerId){ if ( project != null) { ICDescriptorOperation op = new ICDescriptorOperation() { diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selectiontests/CPPSelectionTestsDOMIndexer.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selectiontests/CPPSelectionTestsDOMIndexer.java index fc37c40b8ee..4e897d8ffdb 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selectiontests/CPPSelectionTestsDOMIndexer.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selectiontests/CPPSelectionTestsDOMIndexer.java @@ -126,6 +126,7 @@ public class CPPSelectionTestsDOMIndexer extends BaseSelectionTestsIndexer imple suite.addTest(new CPPSelectionTestsDOMIndexer("testBug95229")); //$NON-NLS-1$ suite.addTest(new CPPSelectionTestsDOMIndexer("testBug101287")); //$NON-NLS-1$ suite.addTest(new CPPSelectionTestsDOMIndexer("testBug102258")); //$NON-NLS-1$ + suite.addTest(new CPPSelectionTestsDOMIndexer("testBug103323")); //$NON-NLS-1$ return suite; } @@ -1046,6 +1047,27 @@ public class CPPSelectionTestsDOMIndexer extends BaseSelectionTestsIndexer imple assertEquals(((ASTNode)decl).getOffset(), 7); assertEquals(((ASTNode)decl).getLength(), 12); } + + public void testBug103323() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("namespace foo {\n"); //$NON-NLS-1$ + buffer.append("int g() {\n"); //$NON-NLS-1$ + buffer.append("return 0;\n"); //$NON-NLS-1$ + buffer.append("}\n"); //$NON-NLS-1$ + buffer.append("}\n"); //$NON-NLS-1$ + buffer.append("int f() {\n"); //$NON-NLS-1$ + buffer.append("return foo::g();\n"); //$NON-NLS-1$ + buffer.append("}\n"); //$NON-NLS-1$ + + String code = buffer.toString(); + IFile file = importFile("testBug103323.cpp", code); //$NON-NLS-1$ + + int offset = code.indexOf("g();\n"); //$NON-NLS-1$ + int length = "g()".length(); //$NON-NLS-1$ + + testSimple_Ctrl_G_Selection(file, offset, length, 1); + + } // REMINDER: see CPPSelectionTestsDomIndexer#suite() when appending new tests to this suite } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/DOMQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/DOMQuery.java index 5f9b0de81ba..40add7141cb 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/DOMQuery.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/DOMQuery.java @@ -94,54 +94,56 @@ public class DOMQuery extends CSearchQuery implements ISearchQuery { // fix for 43128 Set matches=null; IASTName[] foundNames=null; - if (!isLocal()) - matches = DOMSearchUtil.getMatchesFromSearchEngine(scope, searchName, limitTo); + if (searchName != null) { + if (!isLocal()) + matches = DOMSearchUtil.getMatchesFromSearchEngine(scope, searchName, limitTo); + + if (matches != null && matches.size() > 0) { + Iterator itr = matches.iterator(); + while(itr.hasNext()) { + Object next = itr.next(); + if (next instanceof IMatch) { + try { + collector.acceptMatch((IMatch)next); + } catch (CoreException e) { + // don't do anything if the match wasn't accepted + } + } + } + } else { // only search against the DOM if the index failed to get results... i.e. don't want duplicates + foundNames = DOMSearchUtil.getNamesFromDOM(searchName, limitTo); + + for (int i=0; i 0) { - Iterator itr = matches.iterator(); - while(itr.hasNext()) { - Object next = itr.next(); - if (next instanceof IMatch) { - try { - collector.acceptMatch((IMatch)next); - } catch (CoreException e) { - // don't do anything if the match wasn't accepted - } - } - } - } else { // only search against the DOM if the index failed to get results... i.e. don't want duplicates - foundNames = DOMSearchUtil.getNamesFromDOM(searchName, limitTo); - - for (int i=0; i