Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] fix for 66108

This patch includes:
- fix for bug #66108 (C++ browser cannot show members of class)
- TypeParser now uses resource to get scanner info
- all types now visible in the types view (ie not just classes & structs)
- runnables now use IProgressService.busyCursorWhile (prevents progress dialog from being displayed during short operations)

Chris
Index: browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingPart.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingPart.java,v
retrieving revision 1.4
diff -u -r1.4 CBrowsingPart.java
--- browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingPart.java	18 Jun 2004 19:00:35 -0000	1.4
+++ browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingPart.java	21 Jun 2004 18:34:43 -0000
@@ -57,8 +57,6 @@
 import org.eclipse.jface.action.IToolBarManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableContext;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.text.ITextSelection;
 import org.eclipse.jface.util.Assert;
@@ -102,6 +100,7 @@
 import org.eclipse.ui.part.IShowInSource;
 import org.eclipse.ui.part.ShowInContext;
 import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.progress.IProgressService;
 import org.eclipse.ui.texteditor.ITextEditor;
 
 public abstract class CBrowsingPart extends ViewPart implements IMenuListener, ISelectionListener, IViewPartInputProvider {
@@ -759,7 +758,7 @@
 					for (int j = 0; j < enclosedTypes.length; ++j) {
 						ITypeInfo enclosedType = enclosedTypes[j];
 						if (enclosedType.getResolvedReference() != null) {
-							ICElement typeElem = enclosedType.getResolvedReference().getCElement();
+							ICElement typeElem = enclosedType.getCElement();
 							if (typeElem != null && (typeElem.equals(cElem) || (typeElem instanceof IParent && hasChild(typeElem, cElem)))) {
 								return namespaces[i];
 							}
@@ -820,10 +819,11 @@
 					for (int j = 0; j < enclosedTypes.length; ++j) {
 						ITypeInfo enclosedType = enclosedTypes[j];
 						if (enclosedType.getResolvedReference() != null) {
-							ICElement typeElem = enclosedType.getResolvedReference().getCElement();
-							if (typeElem != null && typeElem.equals(cElem)) {
+							ICElement typeElem = enclosedType.getCElement();
+							if (typeElem != null && (typeElem.equals(cElem) || (typeElem instanceof IParent && hasChild(typeElem, cElem)))) {
 								return enclosedType;
 							}
+							
 						}
 					}
 				}
@@ -1221,9 +1221,9 @@
 				}
 			};
 			
-			IRunnableContext runnableContext = new ProgressMonitorDialog(getShell());
+			IProgressService service = PlatformUI.getWorkbench().getProgressService();
 			try {
-				runnableContext.run(true, true, runnable);
+				service.busyCursorWhile(runnable);
 			} catch (InvocationTargetException e) {
 				String title = OpenTypeMessages.getString("OpenTypeAction.exception.title"); //$NON-NLS-1$
 				String message = OpenTypeMessages.getString("OpenTypeAction.exception.message"); //$NON-NLS-1$
@@ -1250,13 +1250,13 @@
 		}
 	}
 
-	protected boolean openInEditor(ITypeReference location) {
-		ICElement cElement = location.getCElement();
+	private boolean openInEditor(ITypeReference location) {
+		ITranslationUnit unit = location.getTranslationUnit();
 		IEditorPart editorPart = null;
 		
 		try {
-			if (cElement != null)
-				editorPart = EditorUtility.openInEditor(cElement);
+			if (unit != null)
+				editorPart = EditorUtility.openInEditor(unit);
 			if (editorPart == null) {
 				// open as external file
 				IPath path = location.getLocation();
@@ -1265,8 +1265,13 @@
 					editorPart = EditorUtility.openInEditor(storage);
 				}
 			}
-			if (editorPart == null)
-				return false;
+
+			// highlight the type in the editor
+			if (editorPart != null && editorPart instanceof ITextEditor) {
+				ITextEditor editor = (ITextEditor) editorPart;
+				editor.selectAndReveal(location.getOffset(), location.getLength());
+				return true;
+			}
 		} catch (CModelException ex) {
 			ex.printStackTrace();
 			return false;
@@ -1275,16 +1280,6 @@
 			return false;
 		}
 		
-		// highlight the type in the editor
-		if (cElement != null && editorPart instanceof CEditor) {
-			CEditor editor = (CEditor) editorPart;
-			editor.setSelection(cElement);
-			return true;
-		} else if (editorPart instanceof ITextEditor) {
-			ITextEditor editor = (ITextEditor) editorPart;
-			editor.selectAndReveal(location.getOffset(), location.getLength());
-			return true;
-		}
 		return false;
 	}
 
Index: browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersView.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersView.java,v
retrieving revision 1.2
diff -u -r1.2 MembersView.java
--- browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersView.java	28 May 2004 15:41:35 -0000	1.2
+++ browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersView.java	21 Jun 2004 18:34:43 -0000
@@ -116,7 +116,7 @@
 	protected boolean isValidInput(Object element) {
 		if (element instanceof ITypeInfo) {
 			ITypeInfo type= (ITypeInfo)element;
-			if (type.getCElementType() == ICElement.C_NAMESPACE && exists(type))
+			if (type.getCElementType() != ICElement.C_NAMESPACE && exists(type))
 				return true;
 		}
 		return false;
Index: browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersViewContentProvider.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersViewContentProvider.java,v
retrieving revision 1.2
diff -u -r1.2 MembersViewContentProvider.java
--- browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersViewContentProvider.java	18 Jun 2004 19:00:35 -0000	1.2
+++ browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersViewContentProvider.java	21 Jun 2004 18:34:43 -0000
@@ -24,12 +24,12 @@
 import org.eclipse.cdt.ui.CUIPlugin;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableContext;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.util.Assert;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IProgressService;
 
 class MembersViewContentProvider extends CBrowsingContentProvider {
 
@@ -165,10 +165,10 @@
 					}
 				}
 			};
-			
-			IRunnableContext runnableContext = new ProgressMonitorDialog(getShell());
+
+			IProgressService service = PlatformUI.getWorkbench().getProgressService();
 			try {
-				runnableContext.run(true, true, runnable);
+				service.busyCursorWhile(runnable);
 			} catch (InvocationTargetException e) {
 				String title = OpenTypeMessages.getString("OpenTypeAction.exception.title"); //$NON-NLS-1$
 				String message = OpenTypeMessages.getString("OpenTypeAction.exception.message"); //$NON-NLS-1$
@@ -184,7 +184,7 @@
 	
 		ICElement elem = null;
 		if (location != null)
-			elem = location.getCElement();
+			elem = info.getCElement();
 
 		if (elem == null) {
 			// could not resolve location
Index: browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewContentProvider.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewContentProvider.java,v
retrieving revision 1.1
diff -u -r1.1 NamespacesViewContentProvider.java
--- browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewContentProvider.java	26 May 2004 14:49:48 -0000	1.1
+++ browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewContentProvider.java	21 Jun 2004 18:34:43 -0000
@@ -24,12 +24,12 @@
 import org.eclipse.cdt.internal.ui.util.ExceptionHandler;
 import org.eclipse.cdt.ui.CUIPlugin;
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableContext;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.util.Assert;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IProgressService;
 
 class NamespacesViewContentProvider extends CBrowsingContentProvider {
 
@@ -165,9 +165,9 @@
 				}
 			};
 			
-			IRunnableContext runnableContext = new ProgressMonitorDialog(getShell());
+			IProgressService service = PlatformUI.getWorkbench().getProgressService();
 			try {
-				runnableContext.run(true, true, runnable);
+				service.busyCursorWhile(runnable);
 			} catch (InvocationTargetException e) {
 				String title = OpenTypeMessages.getString("OpenTypeAction.exception.title"); //$NON-NLS-1$
 				String message = OpenTypeMessages.getString("OpenTypeAction.exception.message"); //$NON-NLS-1$
Index: browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewContentProvider.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewContentProvider.java,v
retrieving revision 1.1
diff -u -r1.1 TypesViewContentProvider.java
--- browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewContentProvider.java	26 May 2004 14:49:48 -0000	1.1
+++ browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewContentProvider.java	21 Jun 2004 18:34:43 -0000
@@ -77,9 +77,10 @@
 			
 			if (element instanceof ITypeInfo) {
 				ITypeInfo info = (ITypeInfo)element;
-				final int kinds[] = { ICElement.C_CLASS, ICElement.C_STRUCT };
-//						ICElement.C_UNION, ICElement.C_ENUMERATION,
-//						ICElement.C_TYPEDEF};
+				final int kinds[] = { ICElement.C_CLASS, ICElement.C_STRUCT,
+						ICElement.C_UNION, ICElement.C_ENUMERATION,
+						ICElement.C_TYPEDEF};
+				//TODO this should be a prefs option
 				return info.getEnclosedTypes(kinds);
 			}
 
Index: browser/org/eclipse/cdt/internal/ui/browser/opentype/OpenTypeAction.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/opentype/OpenTypeAction.java,v
retrieving revision 1.5
diff -u -r1.5 OpenTypeAction.java
--- browser/org/eclipse/cdt/internal/ui/browser/opentype/OpenTypeAction.java	27 May 2004 14:39:27 -0000	1.5
+++ browser/org/eclipse/cdt/internal/ui/browser/opentype/OpenTypeAction.java	21 Jun 2004 18:34:44 -0000
@@ -17,7 +17,7 @@
 import org.eclipse.cdt.core.browser.ITypeSearchScope;
 import org.eclipse.cdt.core.browser.TypeSearchScope;
 import org.eclipse.cdt.core.model.CModelException;
-import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ITranslationUnit;
 import org.eclipse.cdt.core.resources.FileStorage;
 import org.eclipse.cdt.internal.ui.util.EditorUtility;
 import org.eclipse.cdt.internal.ui.util.ExceptionHandler;
@@ -28,8 +28,6 @@
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableContext;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.swt.widgets.Shell;
@@ -37,6 +35,8 @@
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.IWorkbenchWindowActionDelegate;
 import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IProgressService;
 import org.eclipse.ui.texteditor.ITextEditor;
 
 public class OpenTypeAction implements IWorkbenchWindowActionDelegate {
@@ -62,9 +62,9 @@
 				}
 			};
 			
-			IRunnableContext runnableContext = new ProgressMonitorDialog(getShell());
+			IProgressService service = PlatformUI.getWorkbench().getProgressService();
 			try {
-				runnableContext.run(true, true, runnable);
+				service.busyCursorWhile(runnable);
 			} catch (InvocationTargetException e) {
 				String title = OpenTypeMessages.getString("OpenTypeAction.exception.title"); //$NON-NLS-1$
 				String message = OpenTypeMessages.getString("OpenTypeAction.exception.message"); //$NON-NLS-1$
@@ -106,9 +106,9 @@
 				}
 			};
 			
-			IRunnableContext runnableContext = new ProgressMonitorDialog(getShell());
+			IProgressService service = PlatformUI.getWorkbench().getProgressService();
 			try {
-				runnableContext.run(true, true, runnable);
+				service.busyCursorWhile(runnable);
 			} catch (InvocationTargetException e) {
 				String title = OpenTypeMessages.getString("OpenTypeAction.exception.title"); //$NON-NLS-1$
 				String message = OpenTypeMessages.getString("OpenTypeAction.exception.message"); //$NON-NLS-1$
@@ -146,12 +146,12 @@
 	 * @return true if succesfully displayed.
 	 */
 	private boolean openTypeInEditor(ITypeReference location) {
-		ICElement cElement = location.getCElement();
+		ITranslationUnit unit = location.getTranslationUnit();
 		IEditorPart editorPart = null;
 		
 		try {
-			if (cElement != null)
-				editorPart = EditorUtility.openInEditor(cElement);
+			if (unit != null)
+				editorPart = EditorUtility.openInEditor(unit);
 			if (editorPart == null) {
 				// open as external file
 				IPath path = location.getLocation();
Index: browser/org/eclipse/cdt/core/browser/ITypeInfo.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeInfo.java,v
retrieving revision 1.4
diff -u -r1.4 ITypeInfo.java
--- browser/org/eclipse/cdt/core/browser/ITypeInfo.java	17 Jun 2004 19:20:08 -0000	1.4
+++ browser/org/eclipse/cdt/core/browser/ITypeInfo.java	21 Jun 2004 18:34:29 -0000
@@ -146,6 +146,11 @@
 	public ITypeReference getResolvedReference();
 	
 	/**
+	 * Returns the corresponding CElement or <code>null</code> if not found.
+	 */
+	public ICElement getCElement();
+	
+	/**
 	 * Returns true if the type can be substituted.
 	 */
 	public boolean canSubstituteFor(ITypeInfo info);
Index: browser/org/eclipse/cdt/core/browser/ITypeReference.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeReference.java,v
retrieving revision 1.1
diff -u -r1.1 ITypeReference.java
--- browser/org/eclipse/cdt/core/browser/ITypeReference.java	17 May 2004 15:48:48 -0000	1.1
+++ browser/org/eclipse/cdt/core/browser/ITypeReference.java	21 Jun 2004 18:34:29 -0000
@@ -59,9 +59,10 @@
 	public int getLength();
 	
 	/**
-	 * Returns the CElement located at the stored offset and length.
+	 * Returns the CElements located at the stored offset and length,
+	 * or <code>null</code> if not found.
 	 */
-	public ICElement getCElement();
+	public ICElement[] getCElements();
 	
 	/**
 	 * Returns a translation unit for this location.
Index: browser/org/eclipse/cdt/core/browser/TypeInfo.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeInfo.java,v
retrieving revision 1.5
diff -u -r1.5 TypeInfo.java
--- browser/org/eclipse/cdt/core/browser/TypeInfo.java	17 Jun 2004 19:20:08 -0000	1.5
+++ browser/org/eclipse/cdt/core/browser/TypeInfo.java	21 Jun 2004 18:34:29 -0000
@@ -11,6 +11,7 @@
 package org.eclipse.cdt.core.browser;
 
 import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ITypeDef;
 import org.eclipse.cdt.internal.core.browser.cache.ITypeCache;
 import org.eclipse.cdt.internal.core.browser.util.ArrayUtil;
 import org.eclipse.core.resources.IProject;
@@ -24,7 +25,7 @@
 	protected int fSourceRefsCount = 0;
 
 	protected final static int INITIAL_REFS_SIZE = 1;
-	protected final static int REFS_GROW_BY = 10;
+	protected final static int REFS_GROW_BY = 2;
 	protected final static ITypeInfo[] EMPTY_TYPES = new ITypeInfo[0];
 
 	public TypeInfo(int elementType, IQualifiedTypeName typeName) {
@@ -50,6 +51,29 @@
 			ITypeReference[] refs = new ITypeReference[fSourceRefsCount];
 			System.arraycopy(fSourceRefs, 0, refs, 0, fSourceRefsCount);
 			return refs;
+		}
+		return null;
+	}
+	
+	public ICElement getCElement() {
+		ITypeReference ref = getResolvedReference();
+		if (ref != null) {
+			ICElement[] elems = ref.getCElements();
+			if (elems.length > 1) {
+				for (int i = 0; i < elems.length; ++i) {
+					ICElement elem = elems[i];
+					if (elem.getElementType() == fElementType && elem.getElementName().equals(getName())) {
+						//TODO should check fully qualified name
+						return elem;
+					}
+					if (elem instanceof ITypeDef && ((ITypeDef)elem).getTypeName().equals(getName())) {
+						//TODO should check fully qualified name
+						return elem;
+					}
+				}
+			} else if (elems.length == 1) {
+				return elems[0];
+			}
 		}
 		return null;
 	}
Index: browser/org/eclipse/cdt/core/browser/TypeReference.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeReference.java,v
retrieving revision 1.1
diff -u -r1.1 TypeReference.java
--- browser/org/eclipse/cdt/core/browser/TypeReference.java	17 May 2004 15:48:48 -0000	1.1
+++ browser/org/eclipse/cdt/core/browser/TypeReference.java	21 Jun 2004 18:34:29 -0000
@@ -173,11 +173,11 @@
 		return null;
 	}
 
-	public ICElement getCElement() {
+	public ICElement[] getCElements() {
 		ITranslationUnit unit = getTranslationUnit();
 		if (unit != null) {
 			try {
-				return unit.getElementAtOffset(fOffset);
+				return unit.getElementsAtOffset(fOffset);
 			} catch (CModelException e) {
 			}
 		}
Index: browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java,v
retrieving revision 1.5
diff -u -r1.5 TypeParser.java
--- browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java	17 Jun 2004 19:20:08 -0000	1.5
+++ browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java	21 Jun 2004 18:34:29 -0000
@@ -284,15 +284,15 @@
 			CodeReader reader = null;
 			Object stackObject = null;
 			
+			IResource resource = null;
 			if (workingCopy != null) {
 				reader = createWorkingCopyReader(workingCopy);
-				IResource resource = workingCopy.getResource();
+				resource = workingCopy.getResource();
 				if (resource != null) {
 					path = resource.getLocation();
 				}
 				stackObject = workingCopy;
 			} else {
-				IResource resource = null;
 				IWorkspace workspace = CCorePlugin.getWorkspace();
 				if (workspace != null) {
 					IWorkspaceRoot wsRoot = workspace.getRoot();
@@ -314,7 +314,7 @@
 				fResourceStack.clear();
 				fScopeStack.clear();
 				fResourceStack.push(stackObject);
-				parseContents(path, project, reader, language, progressMonitor);
+				parseContents(path, resource, project, reader, language, progressMonitor);
 				fResourceStack.pop();
 			}
 		} finally {
@@ -393,7 +393,7 @@
 		return reader;
 	}
 
-	private void parseContents(IPath realPath, IProject project, CodeReader reader, ParserLanguage language, IProgressMonitor progressMonitor) throws InterruptedException {
+	private void parseContents(IPath realPath, IResource resource, IProject project, CodeReader reader, ParserLanguage language, IProgressMonitor progressMonitor) throws InterruptedException {
 		IScannerInfo scanInfo = null;
 
 		if (project != null) {
@@ -401,7 +401,7 @@
 			try {
 				IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project);
 				if (provider != null) {
-					IScannerInfo buildScanInfo = provider.getScannerInformation(project);
+					IScannerInfo buildScanInfo = provider.getScannerInformation(resource != null ? resource : project);
 					if (buildScanInfo != null)
 						scanInfo = new ScannerInfo(buildScanInfo.getDefinedSymbols(), buildScanInfo.getIncludePaths());
 				}

Back to the top