From 72d7147e7786b2a8a94f8e30a327d5124e10f761 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 11 Sep 2006 13:46:32 +0000 Subject: [PATCH] Call Hierarchy: support for initializers of global variables --- .../ui/callhierarchy/CHContentProvider.java | 13 +++++- .../ui/callhierarchy/CHLabelProvider.java | 43 ++++++++++++++++--- .../cdt/internal/ui/callhierarchy/CHNode.java | 9 ++++ .../internal/ui/missingapi/CIndexQueries.java | 9 +++- 4 files changed, 66 insertions(+), 8 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 b0f42501269..1b3e926ea8e 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 @@ -20,12 +20,14 @@ import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.text.Region; import org.eclipse.swt.widgets.Display; +import org.eclipse.cdt.core.dom.ast.IEnumerator; 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; @@ -76,9 +78,15 @@ public class CHContentProvider extends AsyncTreeContentProvider { if (node.isRecursive() || node.getRepresentedDeclaration() == null) { return NO_CHILDREN; } - if (!fComputeReferencedBy && (node.isVariable() || node.isMacro())) { + if (fComputeReferencedBy) { + if (node.isInitializer()) { + return NO_CHILDREN; + } + } + else if (node.isVariable() || node.isMacro()) { return NO_CHILDREN; } + } // allow for async computation return null; @@ -130,6 +138,9 @@ public class CHContentProvider extends AsyncTreeContentProvider { private CHNode createRefbyNode(CHNode parent, ICElement element, CIndexReference[] refs) { ITranslationUnit tu= CModelUtil.getTranslationUnit(element); CHNode node= new CHNode(parent, tu, refs[0].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]; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHLabelProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHLabelProvider.java index bb9982c63a6..08093eee4c3 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHLabelProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHLabelProvider.java @@ -25,7 +25,9 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.ui.CElementImageDescriptor; +import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.internal.ui.viewsupport.CElementImageProvider; import org.eclipse.cdt.internal.ui.viewsupport.CElementLabels; import org.eclipse.cdt.internal.ui.viewsupport.CUILabelProvider; import org.eclipse.cdt.internal.ui.viewsupport.ImageImageDescriptor; @@ -47,9 +49,18 @@ public class CHLabelProvider extends LabelProvider implements IColorProvider { public Image getImage(Object element) { if (element instanceof CHNode) { CHNode node= (CHNode) element; - ICElement decl= node.getOneRepresentedDeclaration(); - if (decl != null) { - Image image= fCLabelProvider.getImage(decl); + Image image= null; + if (node.isInitializer()) { + ImageDescriptor desc= CElementImageProvider.getFunctionImageDescriptor(); + image= CUIPlugin.getImageDescriptorRegistry().get(desc); + } + else { + ICElement decl= node.getOneRepresentedDeclaration(); + if (decl != null) { + image= fCLabelProvider.getImage(decl); + } + } + if (image != null) { return decorateImage(image, node); } } @@ -68,13 +79,35 @@ public class CHLabelProvider extends LabelProvider implements IColorProvider { fCLabelProvider.setTextFlags(options); return result; } - return fCLabelProvider.getText(decl); + String label= fCLabelProvider.getText(decl); + if (node.isInitializer()) { + label= addInitializerDecoration(label); + } + return label; } } return super.getText(element); } - public void dispose() { + private String addInitializerDecoration(String label) { + int i= 0; + char[] content= label.toCharArray(); + for (i = 0; i < content.length; i++) { + char c = content[i]; + if (c == '-' || Character.isWhitespace(c)) { + break; + } + } + StringBuffer buf= new StringBuffer(label.length() + 10); + buf.append("{init "); //$NON-NLS-1$ + buf.append(content, 0, i); + buf.append("}()"); //$NON-NLS-1$ + buf.append(content, i, content.length-i); + + return buf.toString(); + } + + public void dispose() { fCLabelProvider.dispose(); for (Iterator iter = fCachedImages.values().iterator(); iter.hasNext();) { Image image = (Image) iter.next(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHNode.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHNode.java index 91a5be997ac..7ffe1385112 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHNode.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHNode.java @@ -36,6 +36,7 @@ public class CHNode implements IAdaptable { private int fHashCode; private boolean fIsRecursive; private long fTimestamp; + private boolean fIsInitializer; /** * Creates a new node for the include browser @@ -158,4 +159,12 @@ public class CHNode implements IAdaptable { public ICElement getOneRepresentedDeclaration() { return getRepresentedDeclaration(); } + + public boolean isInitializer() { + return fIsInitializer; + } + + public void setInitializer(boolean isInitializer) { + fIsInitializer = isInitializer; + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexQueries.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexQueries.java index a59d58427cf..fe6016efa0f 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexQueries.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexQueries.java @@ -39,7 +39,6 @@ import org.eclipse.cdt.core.dom.ast.c.ICExternalBinding; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.core.model.IFunctionDeclaration; import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.IParent; import org.eclipse.cdt.core.model.ISourceRange; @@ -303,9 +302,15 @@ public class CIndexQueries { } private ICElement findEnclosingFunction(ICElement element, int offset) { - if (element == null || (element instanceof IFunctionDeclaration)) { + if (element == null || element instanceof org.eclipse.cdt.core.model.IFunctionDeclaration) { return element; } + if (element instanceof org.eclipse.cdt.core.model.IVariable) { + // bug 156844 + if (!(element instanceof org.eclipse.cdt.core.model.IEnumeration)) { + return element; + } + } try { if (element instanceof IParent) { ICElement[] children= ((IParent) element).getChildren();