Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Schorn2006-11-22 12:45:36 +0000
committerMarkus Schorn2006-11-22 12:45:36 +0000
commitfb61bc0c356dc374febde51085d0c1614fbad6f2 (patch)
tree90b49e789bac04fdd68f079021bc5e2dd13140e6 /core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHContentProvider.java
parent96dc647bc77a400b99942fa79e0afeee5e80f11b (diff)
downloadorg.eclipse.cdt-fb61bc0c356dc374febde51085d0c1614fbad6f2.tar.gz
org.eclipse.cdt-fb61bc0c356dc374febde51085d0c1614fbad6f2.tar.xz
org.eclipse.cdt-fb61bc0c356dc374febde51085d0c1614fbad6f2.zip
Call Hierarchy: Avoid generating AST
Diffstat (limited to 'core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHContentProvider.java')
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHContentProvider.java174
1 files changed, 89 insertions, 85 deletions
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHContentProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHContentProvider.java
index 1b3e926ea8e..d50814fff90 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHContentProvider.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHContentProvider.java
@@ -12,31 +12,26 @@
package org.eclipse.cdt.internal.ui.callhierarchy;
import java.util.ArrayList;
-import java.util.Arrays;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.text.Region;
import org.eclipse.swt.widgets.Display;
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.core.model.ISourceRange;
-import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IVariable;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.corext.util.CModelUtil;
-import org.eclipse.cdt.internal.ui.missingapi.CElementSet;
-import org.eclipse.cdt.internal.ui.missingapi.CIndexQueries;
-import org.eclipse.cdt.internal.ui.missingapi.CIndexReference;
-import org.eclipse.cdt.internal.ui.missingapi.CalledByResult;
-import org.eclipse.cdt.internal.ui.missingapi.CallsToResult;
import org.eclipse.cdt.internal.ui.viewsupport.AsyncTreeContentProvider;
import org.eclipse.cdt.internal.ui.viewsupport.WorkingSetFilterUI;
@@ -96,64 +91,115 @@ public class CHContentProvider extends AsyncTreeContentProvider {
IProgressMonitor monitor) {
if (parentElement instanceof CHNode) {
CHNode node = (CHNode) parentElement;
- ICElement elem= node.getRepresentedDeclaration();
- if (elem != null) {
+ try {
if (fComputeReferencedBy) {
- return asyncronouslyComputeReferencedBy(node, elem);
+ return asyncronouslyComputeReferencedBy(node);
}
else {
- return asyncronouslyComputeRefersTo(node, elem);
+ return asyncronouslyComputeRefersTo(node);
}
+ } catch (CoreException e) {
+ CUIPlugin.getDefault().log(e);
+ } catch (DOMException e) {
+ CUIPlugin.getDefault().log(e);
+ } catch (InterruptedException e) {
}
}
return NO_CHILDREN;
}
- private Object[] asyncronouslyComputeReferencedBy(CHNode parent, ICElement elem) {
+ private Object[] asyncronouslyComputeReferencedBy(CHNode parent) throws CoreException, InterruptedException, DOMException {
+ ICProject[] scope= CoreModel.getDefault().getCModel().getCProjects();
+ IIndex index= CCorePlugin.getIndexManager().getIndex(scope);
+ index.acquireReadLock();
try {
- ICProject[] scope= CoreModel.getDefault().getCModel().getCProjects();
- CalledByResult calledBy= CIndexQueries.getInstance().findCalledBy(scope, elem, NPM);
- ArrayList result= new ArrayList();
-
- ICElement[] elements= calledBy.getElements();
- for (int i = 0; i < elements.length; i++) {
- ICElement element = elements[i];
- if (element != null) {
- if (fFilter == null || fFilter.isPartOfWorkingSet(element)) {
- CIndexReference[] refs= calledBy.getReferences(element);
- if (refs != null && refs.length > 0) {
- CHNode node = createRefbyNode(parent, element, refs);
- result.add(node);
- }
+ return CHQueries.findCalledBy(this, parent, index, NPM);
+ }
+ finally {
+ index.releaseReadLock();
+ }
+ }
+
+ private Object[] asyncronouslyComputeRefersTo(CHNode parent) throws CoreException, InterruptedException, DOMException {
+ ICProject[] scope= CoreModel.getDefault().getCModel().getCProjects();
+ IIndex index= CCorePlugin.getIndexManager().getIndex(scope);
+ index.acquireReadLock();
+ try {
+ return CHQueries.findCalls(this, parent, index, NPM);
+ }
+ finally {
+ index.releaseReadLock();
+ }
+ }
+
+ public void setComputeReferencedBy(boolean value) {
+ fComputeReferencedBy = value;
+ }
+
+ public boolean getComputeReferencedBy() {
+ return fComputeReferencedBy;
+ }
+
+ public void setWorkingSetFilter(WorkingSetFilterUI filterUI) {
+ fFilter= filterUI;
+ recompute();
+ }
+
+ CHNode[] createNodes(CHNode node, CalledByResult result) throws CoreException {
+ ArrayList nodes= new ArrayList();
+ ICElement[] elements= result.getElements();
+ for (int i = 0; i < elements.length; i++) {
+ ICElement element = elements[i];
+ if (element != null) {
+ if (fFilter == null || fFilter.isPartOfWorkingSet(element)) {
+ IIndexName[] refs= result.getReferences(element);
+ if (refs != null && refs.length > 0) {
+ CHNode newNode = createRefbyNode(node, element, refs);
+ nodes.add(newNode);
}
}
}
- return result.toArray();
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
}
- return NO_CHILDREN;
+ return (CHNode[]) nodes.toArray(new CHNode[nodes.size()]);
}
-
- private CHNode createRefbyNode(CHNode parent, ICElement element, CIndexReference[] refs) {
+
+ private CHNode createRefbyNode(CHNode parent, ICElement element, IIndexName[] refs) throws CoreException {
ITranslationUnit tu= CModelUtil.getTranslationUnit(element);
- CHNode node= new CHNode(parent, tu, refs[0].getTimestamp(), element);
+ CHNode node= new CHNode(parent, tu, refs[0].getFile().getTimestamp(), element);
if (element instanceof IVariable || element instanceof IEnumerator) {
node.setInitializer(true);
}
- Arrays.sort(refs, CIndexReference.COMPARE_OFFSET);
for (int i = 0; i < refs.length; i++) {
- CIndexReference reference = refs[i];
- node.addReference(new CHReferenceInfo(reference.getOffset(), reference.getLength()));
+ IIndexName reference = refs[i];
+ node.addReference(new CHReferenceInfo(reference.getNodeOffset(), reference.getNodeLength()));
}
+ node.sortReferencesByOffset();
return node;
}
- private CHNode createReftoNode(CHNode parent, ITranslationUnit tu, ICElement[] elements, CIndexReference[] references) {
+ CHNode[] createNodes(CHNode node, CallsToResult callsTo) throws CoreException {
+ ITranslationUnit tu= CModelUtil.getTranslationUnit(node.getRepresentedDeclaration());
+ ArrayList result= new ArrayList();
+ CElementSet[] elementSets= callsTo.getElementSets();
+ for (int i = 0; i < elementSets.length; i++) {
+ CElementSet set = elementSets[i];
+ if (!set.isEmpty()) {
+ IIndexName[] refs= callsTo.getReferences(set);
+ ICElement[] elements= set.getElements(fFilter);
+ if (elements.length > 0) {
+ CHNode childNode = createReftoNode(node, tu, elements, refs);
+ result.add(childNode);
+ }
+ }
+ }
+ return (CHNode[]) result.toArray(new CHNode[result.size()]);
+ }
+
+ private CHNode createReftoNode(CHNode parent, ITranslationUnit tu, ICElement[] elements, IIndexName[] references) throws CoreException {
assert elements.length > 0;
CHNode node;
- long timestamp= references[0].getTimestamp();
+ long timestamp= references[0].getFile().getTimestamp();
if (elements.length == 1) {
node= new CHNode(parent, tu, timestamp, elements[0]);
@@ -162,53 +208,11 @@ public class CHContentProvider extends AsyncTreeContentProvider {
node= new CHMultiDefNode(parent, tu, timestamp, elements);
}
- Arrays.sort(references, CIndexReference.COMPARE_OFFSET);
for (int i = 0; i < references.length; i++) {
- CIndexReference reference = references[i];
- node.addReference(new CHReferenceInfo(reference.getOffset(), reference.getLength()));
+ IIndexName reference = references[i];
+ node.addReference(new CHReferenceInfo(reference.getNodeOffset(), reference.getNodeLength()));
}
+ node.sortReferencesByOffset();
return node;
}
-
- private Object[] asyncronouslyComputeRefersTo(CHNode parent, ICElement elem) {
- try {
- if (elem instanceof ISourceReference) {
- ISourceReference sf= (ISourceReference) elem;
- ITranslationUnit tu= sf.getTranslationUnit();
- ISourceRange range= sf.getSourceRange();
- ICProject[] scope= CoreModel.getDefault().getCModel().getCProjects();
- CallsToResult callsTo= CIndexQueries.getInstance().findCallsInRange(scope, tu, new Region(range.getStartPos(), range.getLength()), NPM);
- ArrayList result= new ArrayList();
- CElementSet[] elementSets= callsTo.getElementSets();
- for (int i = 0; i < elementSets.length; i++) {
- CElementSet set = elementSets[i];
- if (!set.isEmpty()) {
- CIndexReference[] refs= callsTo.getReferences(set);
- ICElement[] elements= set.getElements(fFilter);
- if (elements.length > 0) {
- CHNode node = createReftoNode(parent, tu, elements, refs);
- result.add(node);
- }
- }
- }
- return result.toArray();
- }
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- }
- return NO_CHILDREN;
- }
-
- public void setComputeReferencedBy(boolean value) {
- fComputeReferencedBy = value;
- }
-
- public boolean getComputeReferencedBy() {
- return fComputeReferencedBy;
- }
-
- public void setWorkingSetFilter(WorkingSetFilterUI filterUI) {
- fFilter= filterUI;
- recompute();
- }
}

Back to the top