diff options
author | Markus Schorn | 2006-11-22 12:45:36 +0000 |
---|---|---|
committer | Markus Schorn | 2006-11-22 12:45:36 +0000 |
commit | fb61bc0c356dc374febde51085d0c1614fbad6f2 (patch) | |
tree | 90b49e789bac04fdd68f079021bc5e2dd13140e6 /core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHContentProvider.java | |
parent | 96dc647bc77a400b99942fa79e0afeee5e80f11b (diff) | |
download | org.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.java | 174 |
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(); - } } |