mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-29 20:05:35 +02:00
Call Hierarchy: support for initializers of global variables
This commit is contained in:
parent
d104bdce04
commit
72d7147e77
4 changed files with 66 additions and 8 deletions
|
@ -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,10 +78,16 @@ 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];
|
||||
|
|
|
@ -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;
|
||||
Image image= null;
|
||||
if (node.isInitializer()) {
|
||||
ImageDescriptor desc= CElementImageProvider.getFunctionImageDescriptor();
|
||||
image= CUIPlugin.getImageDescriptorRegistry().get(desc);
|
||||
}
|
||||
else {
|
||||
ICElement decl= node.getOneRepresentedDeclaration();
|
||||
if (decl != null) {
|
||||
Image image= fCLabelProvider.getImage(decl);
|
||||
image= fCLabelProvider.getImage(decl);
|
||||
}
|
||||
}
|
||||
if (image != null) {
|
||||
return decorateImage(image, node);
|
||||
}
|
||||
}
|
||||
|
@ -68,12 +79,34 @@ 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);
|
||||
}
|
||||
|
||||
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();) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue