diff --git a/core/org.eclipse.cdt.core/browser/ChangeLog-browser b/core/org.eclipse.cdt.core/browser/ChangeLog-browser
index d51cb9248c5..1de7722a7a9 100644
--- a/core/org.eclipse.cdt.core/browser/ChangeLog-browser
+++ b/core/org.eclipse.cdt.core/browser/ChangeLog-browser
@@ -1,3 +1,8 @@
+2004-06-21 Chris Wiebe
+
+ - fix for bug #66108 (C++ browser cannot show members of class)
+ - TypeParser now uses resource to get scanner info
+
2004-06-17 Alain Magloire
Changes from Chris Wiebe to deal
diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeInfo.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeInfo.java
index 62100aea57c..64e4159d68e 100644
--- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeInfo.java
+++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeInfo.java
@@ -145,6 +145,11 @@ public interface ITypeInfo extends Comparable {
*/
public ITypeReference getResolvedReference();
+ /**
+ * Returns the corresponding CElement or null
if not found.
+ */
+ public ICElement getCElement();
+
/**
* Returns true if the type can be substituted.
*/
diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeReference.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeReference.java
index 8a547e59082..5b38e15ef8f 100644
--- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeReference.java
+++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeReference.java
@@ -59,9 +59,10 @@ public interface ITypeReference {
public int getLength();
/**
- * Returns the CElement located at the stored offset and length.
+ * Returns the CElements located at the stored offset and length,
+ * or null
if not found.
*/
- public ICElement getCElement();
+ public ICElement[] getCElements();
/**
* Returns a translation unit for this location.
diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeInfo.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeInfo.java
index 8c7808bfcb5..6cc969397b1 100644
--- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeInfo.java
+++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeInfo.java
@@ -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 @@ public class TypeInfo implements ITypeInfo
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) {
@@ -53,6 +54,29 @@ public class TypeInfo implements ITypeInfo
}
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;
+ }
public ITypeReference getResolvedReference() {
for (int i = 0; i < fSourceRefsCount; ++i) {
diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeReference.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeReference.java
index c5c46ebc8c6..0cfeb9a574b 100644
--- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeReference.java
+++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeReference.java
@@ -173,11 +173,11 @@ public class TypeReference implements ITypeReference {
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) {
}
}
diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java
index 5585acd3488..1c754116144 100644
--- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java
+++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java
@@ -284,15 +284,15 @@ public class TypeParser implements ISourceElementRequestor {
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 @@ public class TypeParser implements ISourceElementRequestor {
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 @@ public class TypeParser implements ISourceElementRequestor {
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 @@ public class TypeParser implements ISourceElementRequestor {
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());
}