1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-03 14:25:37 +02:00

Bug 72741 - add cancel handling for the pattern search and the findBindings routine in the PDOM.

This commit is contained in:
Doug Schaefer 2006-09-01 20:53:06 +00:00
parent 3ddf1a258f
commit eac22a6a7b
8 changed files with 55 additions and 19 deletions

View file

@ -19,8 +19,11 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.core.runtime.NullProgressMonitor;
/**
* @author Doug Schaefer
@ -37,7 +40,7 @@ public class ClassTests extends PDOMTestBase {
public void test1() throws Exception {
PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(project);
IBinding[] Bs = pdom.findBindings(Pattern.compile("B"));
IBinding[] Bs = pdom.findBindings(Pattern.compile("B"), new NullProgressMonitor());
assertEquals(1, Bs.length);
ICPPClassType B = (ICPPClassType)Bs[0];
ICPPMethod[] Bmethods = B.getAllDeclaredMethods();
@ -53,7 +56,7 @@ public class ClassTests extends PDOMTestBase {
public void testNested() throws Exception {
PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(project);
IBinding[] bindings = pdom.findBindings(Pattern.compile("NestedA"));
IBinding[] bindings = pdom.findBindings(Pattern.compile("NestedA"), new NullProgressMonitor());
assertEquals(1, bindings.length);
ICPPClassType NestedA = (ICPPClassType)bindings[0];
ICPPClassType[] nested = NestedA.getNestedClasses();
@ -74,4 +77,18 @@ public class ClassTests extends PDOMTestBase {
loc = refs[0].getFileLocation();
assertEquals(offset(118, 108), loc.getNodeOffset());
}
}
public void failedTest147903() throws Exception {
PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(project);
IBinding[] bindings = pdom.findBindings(Pattern.compile("pr147903"), new NullProgressMonitor());
assertEquals(1, bindings.length);
ICPPNamespaceScope ns = ((ICPPNamespace)bindings[0]).getNamespaceScope();
bindings = ns.find("testRef");
assertEquals(1, bindings.length);
IASTName[] refs = pdom.getReferences(bindings[0]);
for (int i = 0; i < refs.length; ++i)
System.out.println(refs[i].getFileLocation().getNodeOffset());
assertEquals(5, refs.length);
}
}

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.core.runtime.NullProgressMonitor;
/**
* @author Doug Schaefer
@ -37,7 +38,7 @@ public class EnumerationTests extends PDOMTestBase {
// Check bindings
PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(project);
Pattern pattern = Pattern.compile("TestCEnum");
IBinding[] bindings = pdom.findBindings(pattern);
IBinding[] bindings = pdom.findBindings(pattern, new NullProgressMonitor());
assertEquals(1, bindings.length);
IEnumeration enumeration = (IEnumeration)bindings[0];
assertEquals("TestCEnum", enumeration.getName());
@ -70,7 +71,7 @@ public class EnumerationTests extends PDOMTestBase {
// Check bindings
PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(project);
Pattern pattern = Pattern.compile("TestCPPEnum");
IBinding[] bindings = pdom.findBindings(pattern);
IBinding[] bindings = pdom.findBindings(pattern, new NullProgressMonitor());
assertEquals(1, bindings.length);
IEnumeration enumeration = (IEnumeration)bindings[0];
assertEquals("TestCPPEnum", enumeration.getName());

View file

@ -23,6 +23,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.core.runtime.NullProgressMonitor;
/**
* @author Doug Schaefer
@ -40,7 +41,7 @@ public class TypesTests extends PDOMTestBase {
PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(project);
// Get the binding for A::f
IBinding [] CAs = pdom.findBindings(Pattern.compile("CA"));
IBinding [] CAs = pdom.findBindings(Pattern.compile("CA"), new NullProgressMonitor());
assertEquals(1, CAs.length);
ICompositeType CA = (ICompositeType)CAs[0];
IField [] CAfields = CA.getFields();
@ -59,7 +60,7 @@ public class TypesTests extends PDOMTestBase {
PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(project);
// Get the binding for A::f
IBinding [] As = pdom.findBindings(Pattern.compile("A"));
IBinding [] As = pdom.findBindings(Pattern.compile("A"), new NullProgressMonitor());
assertEquals(1, As.length);
ICPPClassType A = (ICPPClassType)As[0];
ICPPMethod[] Amethods = A.getMethods();
@ -76,7 +77,7 @@ public class TypesTests extends PDOMTestBase {
public void test145351() throws Exception {
PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(project);
IBinding [] bindings = pdom.findBindings(Pattern.compile("spinlock_t"));
IBinding [] bindings = pdom.findBindings(Pattern.compile("spinlock_t"), new NullProgressMonitor());
assertEquals(1, bindings.length);
ITypedef spinlock_t = (ITypedef)bindings[0];
IASTName [] refs = pdom.getReferences(spinlock_t);

View file

@ -16,6 +16,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
/**
* This is the reader interface to the PDOM. It is used by general
@ -32,7 +33,7 @@ public interface IPDOM extends IAdaptable {
* @return
* @throws CoreException
*/
public IBinding[] findBindings(Pattern pattern) throws CoreException;
public IBinding[] findBindings(Pattern pattern, IProgressMonitor monitor) throws CoreException;
/**
* Find all bindings whose qualified names match the array of patterns.
@ -41,7 +42,7 @@ public interface IPDOM extends IAdaptable {
* @return
* @throws CoreException
*/
public IBinding[] findBindings(Pattern[] pattern) throws CoreException;
public IBinding[] findBindings(Pattern[] pattern, IProgressMonitor monitor) throws CoreException;
/**
* Recursively visit the nodes in this PDOM using the given visitor.

View file

@ -43,7 +43,9 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile.Comparator;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile.Finder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.core.runtime.Status;
/**
* The PDOM Database.
@ -252,17 +254,22 @@ public class PDOM extends PlatformObject
private static class BindingFinder implements IPDOMVisitor {
private final Pattern[] pattern;
private final IProgressMonitor monitor;
private final IBinding[] match;
private int level = 0;
private List bindings = new ArrayList();
public BindingFinder(Pattern[] pattern) {
public BindingFinder(Pattern[] pattern, IProgressMonitor monitor) {
this.pattern = pattern;
this.monitor = monitor;
match = new IBinding[pattern.length];
}
public boolean visit(IPDOMNode node) throws CoreException {
if (monitor.isCanceled())
throw new CoreException(Status.OK_STATUS);
if (node instanceof IBinding) {
IBinding binding = (IBinding)node;
if (pattern[level].matcher(binding.getName()).matches()) {
@ -292,15 +299,22 @@ public class PDOM extends PlatformObject
}
}
public IBinding[] findBindings(Pattern pattern) throws CoreException {
return findBindings(new Pattern[] { pattern });
public IBinding[] findBindings(Pattern pattern, IProgressMonitor monitor) throws CoreException {
return findBindings(new Pattern[] { pattern }, monitor);
}
public IBinding[] findBindings(Pattern[] pattern) throws CoreException {
BindingFinder finder = new BindingFinder(pattern);
public IBinding[] findBindings(Pattern[] pattern, IProgressMonitor monitor) throws CoreException {
BindingFinder finder = new BindingFinder(pattern, monitor);
PDOMLinkage linkage = getFirstLinkage();
while (linkage != null) {
linkage.accept(finder);
try {
linkage.accept(finder);
} catch (CoreException e) {
if (e.getStatus() != Status.OK_STATUS)
throw e;
else
return new IBinding[0];
}
linkage = linkage.getNextLinkage();
}
return finder.getBindings();

View file

@ -54,6 +54,7 @@ import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
@ -269,7 +270,7 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate {
for (int n = 0; n < cProjectsToSearch.size(); n++)
{
PDOM pdom = (PDOM)pdomManager.getPDOM((ICProject) cProjectsToSearch.get(n));
IBinding[] bindings = pdom.findBindings(pattern);
IBinding[] bindings = pdom.findBindings(pattern, new NullProgressMonitor());
for (int i = 0; i < bindings.length; ++i) {
PDOMBinding binding = (PDOMBinding)bindings[i];

View file

@ -129,7 +129,7 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery {
}
try {
IBinding[] bindings = pdom.findBindings(pattern);
IBinding[] bindings = pdom.findBindings(pattern, monitor);
for (int i = 0; i < bindings.length; ++i) {
PDOMBinding pdomBinding = (PDOMBinding)bindings[i];
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);

View file

@ -48,6 +48,7 @@ import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.viewers.IStructuredSelection;
@ -383,7 +384,7 @@ public class NewClassWizardUtil {
IPDOMManager pdomManager = CCorePlugin.getPDOMManager();
try {
PDOM pdom = (PDOM)pdomManager.getPDOM(project);
IBinding[] bindings = pdom.findBindings(Pattern.compile(typeName.getName()));
IBinding[] bindings = pdom.findBindings(Pattern.compile(typeName.getName()), new NullProgressMonitor());
boolean sameTypeNameExists = false;
boolean sameNameDifferentTypeExists = false;