1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-29 03:45:35 +02:00

Call Hierarchy: support for initializers of global variables

This commit is contained in:
Markus Schorn 2006-09-11 13:46:32 +00:00
parent d104bdce04
commit 72d7147e77
4 changed files with 66 additions and 8 deletions

View file

@ -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];

View file

@ -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();

View file

@ -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;
}
}

View file

@ -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();